link-stack/packages/bridge-ui/actions/service.ts

115 lines
2.3 KiB
TypeScript
Raw Normal View History

2024-04-26 14:31:33 +02:00
"use server";
import { revalidatePath } from "next/cache";
2024-04-30 11:39:16 +02:00
import { db, Database } from "bridge-common";
import { FieldDescription, Entity } from "../lib/service";
2024-04-26 16:29:13 +02:00
import crypto from "crypto";
const generateToken = () => {
const length = 20;
const randomBytes = crypto.randomBytes(length);
const randomString = randomBytes.toString("hex").slice(0, length);
return randomString;
};
2024-04-26 14:31:33 +02:00
type CreateActionArgs = {
entity: Entity;
table: keyof Database;
fields: FieldDescription[];
currentState: any;
formData: FormData;
};
export const createAction = async ({
entity,
table,
fields,
currentState,
formData,
}: CreateActionArgs) => {
const newRecord = fields.reduce(
2024-04-26 16:29:13 +02:00
(acc: Record<string, any>, field: FieldDescription) => {
if (field.autogenerated === "token") {
acc[field.name] = generateToken();
return acc;
}
2024-04-26 14:31:33 +02:00
acc[field.name] = formData.get(field.name)?.toString() ?? null;
return acc;
},
{},
);
2024-04-29 17:27:25 +02:00
const record = await db
.insertInto(table)
.values(newRecord)
.returning(["id"])
.executeTakeFirstOrThrow();
2024-04-26 14:31:33 +02:00
revalidatePath(`/${entity}`);
return {
...currentState,
2024-04-29 17:27:25 +02:00
values: { ...newRecord, id: record.id },
2024-04-26 14:31:33 +02:00
success: true,
};
};
type UpdateActionArgs = {
entity: Entity;
table: keyof Database;
fields: FieldDescription[];
currentState: any;
formData: FormData;
};
export const updateAction = async ({
entity,
table,
fields,
currentState,
formData,
}: UpdateActionArgs) => {
const id = currentState.values.id;
const updatedRecord = fields.reduce(
2024-04-26 16:29:13 +02:00
(acc: Record<string, any>, field: FieldDescription) => {
2024-04-26 14:31:33 +02:00
acc[field.name] = formData.get(field.name)?.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: Entity;
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;
};
2024-04-29 17:27:25 +02:00
export const selectAllAction = async (table: keyof Database) => {
return db.selectFrom(table).selectAll().execute();
};