"use server"; import { ID, Permission, Role, Query } from "node-appwrite"; import { revalidatePath } from "next/cache"; import { customerSchema } from "@/lib/validation/customers"; import { DATABASE_ID, TABLES, type CustomerStage } from "./schema"; import { createAdminClient } from "./server"; import { requireTenant } from "@/lib/appwrite/tenant-guard"; import { checkLimit, limitErrorMessage } from "@/lib/plans"; type ActionState = { ok: boolean; error?: string; fieldErrors?: Record }; export async function createCustomerAction( _prev: ActionState, formData: FormData, ): Promise { const ctx = await requireTenant(); const raw = Object.fromEntries(formData.entries()); const parsed = customerSchema.safeParse(raw); if (!parsed.success) { return { ok: false, fieldErrors: parsed.error.flatten().fieldErrors }; } const limitCheck = await checkLimit(ctx.tenantId, ctx.settings?.plan, "customers"); if (!limitCheck.allowed) { return { ok: false, error: limitErrorMessage("customers", limitCheck.limit, ctx.role) }; } const { tablesDB } = createAdminClient(); const data = parsed.data; try { await tablesDB.createRow( DATABASE_ID, TABLES.customers, ID.unique(), { tenantId: ctx.tenantId, name: data.name, email: data.email, phone: data.phone, type: data.type, stage: data.stage ?? "ilk_temas", source: data.source, nextFollowUpDate: data.nextFollowUpDate, assigneeId: data.assigneeId, notes: data.notes, createdBy: ctx.user.id, }, [ Permission.read(Role.team(ctx.tenantId)), Permission.update(Role.team(ctx.tenantId)), Permission.delete(Role.team(ctx.tenantId, "owner")), Permission.delete(Role.team(ctx.tenantId, "admin")), ], ); } catch { return { ok: false, error: "Müşteri oluşturulamadı." }; } revalidatePath("/customers"); return { ok: true }; } export async function updateCustomerAction( id: string, _prev: ActionState, formData: FormData, ): Promise { await requireTenant(); const raw = Object.fromEntries(formData.entries()); const parsed = customerSchema.safeParse(raw); if (!parsed.success) { return { ok: false, fieldErrors: parsed.error.flatten().fieldErrors }; } const { tablesDB } = createAdminClient(); const data = parsed.data; try { await tablesDB.updateRow(DATABASE_ID, TABLES.customers, id, { name: data.name, email: data.email, phone: data.phone, type: data.type, stage: data.stage, source: data.source, nextFollowUpDate: data.nextFollowUpDate, assigneeId: data.assigneeId, notes: data.notes, }); } catch { return { ok: false, error: "Müşteri güncellenemedi." }; } revalidatePath("/customers"); return { ok: true }; } export async function updateCustomerStageAction( id: string, stage: CustomerStage, ): Promise { await requireTenant(); const { tablesDB } = createAdminClient(); try { await tablesDB.updateRow(DATABASE_ID, TABLES.customers, id, { stage }); } catch { return { ok: false, error: "Aşama güncellenemedi." }; } revalidatePath("/customers"); return { ok: true }; } export async function deleteCustomerAction(id: string): Promise { await requireTenant(); const { tablesDB } = createAdminClient(); try { await tablesDB.deleteRow(DATABASE_ID, TABLES.customers, id); } catch { return { ok: false, error: "Müşteri silinemedi." }; } revalidatePath("/customers"); return { ok: true }; }