Files
parakasa/app/(dashboard)/dashboard/sliders/actions.ts

125 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use server"
import { createClient } from "@/lib/supabase-server"
import { createClient as createSupabaseClient } from "@supabase/supabase-js"
import { revalidatePath } from "next/cache"
// Admin client for privileged operations
const supabaseAdmin = createSupabaseClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!,
{
auth: {
autoRefreshToken: false,
persistSession: false
}
}
)
async function assertAdmin() {
const supabase = createClient()
const { data: { user } } = await supabase.auth.getUser()
if (!user) throw new Error("Oturum açmanız gerekiyor.")
const { data: profile } = await supabase.from('profiles').select('role').eq('id', user.id).single()
if (profile?.role !== 'admin') throw new Error("Yetkisiz işlem.")
return user
}
export async function getSliders() {
const supabase = createClient()
// Everyone can read, so normal client is fine
const { data, error } = await supabase
.from('sliders')
.select('*')
.order('order', { ascending: true })
.order('created_at', { ascending: false })
if (error) return { error: error.message }
return { data }
}
export async function createSlider(data: {
title: string
description?: string
image_url: string
link?: string
order?: number
is_active?: boolean
}) {
try {
await assertAdmin()
const { error } = await supabaseAdmin.from('sliders').insert({
title: data.title,
description: data.description,
image_url: data.image_url,
link: data.link,
order: data.order || 0,
is_active: data.is_active ?? true
})
if (error) throw error
revalidatePath("/dashboard/sliders")
revalidatePath("/") // Homepage cache update
return { success: true }
} catch (error) {
return { error: (error as Error).message }
}
}
export async function updateSlider(id: string, data: {
title: string
description?: string
image_url: string
link?: string
order?: number
is_active?: boolean
}) {
try {
await assertAdmin()
const { error } = await supabaseAdmin
.from('sliders')
.update({
title: data.title,
description: data.description,
image_url: data.image_url,
link: data.link,
order: data.order,
is_active: data.is_active,
// updated_at trigger usually handles time, but we don't have it in schema yet, so maybe add later
})
.eq('id', id)
if (error) throw error
revalidatePath("/dashboard/sliders")
revalidatePath("/")
return { success: true }
} catch (error) {
return { error: (error as Error).message }
}
}
export async function deleteSlider(id: string) {
try {
await assertAdmin()
const { error } = await supabaseAdmin
.from('sliders')
.delete()
.eq('id', id)
if (error) throw error
revalidatePath("/dashboard/sliders")
revalidatePath("/")
return { success: true }
} catch (error) {
return { error: (error as Error).message }
}
}