94 lines
1.7 KiB
TypeScript
94 lines
1.7 KiB
TypeScript
|
|
"use server";
|
||
|
|
|
||
|
|
import { revalidatePath } from "next/cache";
|
||
|
|
import { db, Database } from "./database";
|
||
|
|
|
||
|
|
type AddActionArgs = {
|
||
|
|
entity: string;
|
||
|
|
table: keyof Database;
|
||
|
|
fields: string[];
|
||
|
|
currentState: any;
|
||
|
|
formData: FormData;
|
||
|
|
};
|
||
|
|
|
||
|
|
export const addAction = async ({
|
||
|
|
entity,
|
||
|
|
table,
|
||
|
|
fields,
|
||
|
|
currentState,
|
||
|
|
formData,
|
||
|
|
}: AddActionArgs) => {
|
||
|
|
const newRecord = fields.reduce(
|
||
|
|
(acc: Record<string, string>, field: string) => {
|
||
|
|
// @ts-expect-error
|
||
|
|
acc[field] = formData.get(field)?.toString() ?? null;
|
||
|
|
return acc;
|
||
|
|
},
|
||
|
|
{},
|
||
|
|
);
|
||
|
|
|
||
|
|
await db.insertInto(table).values(newRecord).execute();
|
||
|
|
|
||
|
|
revalidatePath(`/${entity}`);
|
||
|
|
|
||
|
|
return {
|
||
|
|
...currentState,
|
||
|
|
values: newRecord,
|
||
|
|
success: true,
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
type UpdateActionArgs = {
|
||
|
|
entity: string;
|
||
|
|
table: keyof Database;
|
||
|
|
fields: string[];
|
||
|
|
currentState: any;
|
||
|
|
formData: FormData;
|
||
|
|
};
|
||
|
|
|
||
|
|
export const updateAction = async ({
|
||
|
|
entity,
|
||
|
|
table,
|
||
|
|
fields,
|
||
|
|
currentState,
|
||
|
|
formData,
|
||
|
|
}: UpdateActionArgs) => {
|
||
|
|
const id = currentState.values.id;
|
||
|
|
const updatedRecord = fields.reduce(
|
||
|
|
(acc: Record<string, string>, field: string) => {
|
||
|
|
// @ts-expect-error
|
||
|
|
acc[field] = formData.get(field)?.toString() ?? null;
|
||
|
|
return acc;
|
||
|
|
},
|
||
|
|
{},
|
||
|
|
);
|
||
|
|
|
||
|
|
await db
|
||
|
|
.updateTable(table)
|
||
|
|
.set(updatedRecord)
|
||
|
|
.where("id", "=", id)
|
||
|
|
.executeTakeFirst();
|
||
|
|
|
||
|
|
revalidatePath(`/${entity}/${id}`);
|
||
|
|
|
||
|
|
return {
|
||
|
|
...currentState,
|
||
|
|
values: updatedRecord,
|
||
|
|
success: true,
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
type DeleteActionArgs = {
|
||
|
|
entity: string;
|
||
|
|
table: keyof Database;
|
||
|
|
id: string;
|
||
|
|
};
|
||
|
|
|
||
|
|
export const deleteAction = async ({ entity, table, id }: DeleteActionArgs) => {
|
||
|
|
await db.deleteFrom(table).where("id", "=", id).execute();
|
||
|
|
|
||
|
|
revalidatePath(`/${entity}`);
|
||
|
|
|
||
|
|
return true;
|
||
|
|
};
|