import get from "../../actions/get"; import post from "../../actions/post"; import sqlGenerator from "../../functions/dsql/sql/sql-generator"; import { PostReturn, ServerQueryParam, ServerQueryQueryObject, } from "../../types"; import numberfy from "../numberfy"; export const DsqlCrudActions = ["insert", "update", "delete", "get"] as const; export type CrudQueryObject = ServerQueryParam & { query: ServerQueryQueryObject; }; export type CrudParam = { action: (typeof DsqlCrudActions)[number]; table: string; data?: T; targetId?: string | number; query?: CrudQueryObject; sanitize?: (data?: T) => T; }; export default async function dsqlCrud< T extends { [key: string]: any } = { [key: string]: any } >({ action, data, table, targetId, query, sanitize, }: CrudParam): Promise< | (PostReturn & { queryObject?: ReturnType>; }) | null > { const finalData = sanitize ? sanitize(data) : data; const finalId = targetId; let queryObject: ReturnType> | undefined; switch (action) { case "get": queryObject = sqlGenerator({ tableName: table, genObject: query, }); const GET_RES = await get({ query: queryObject?.string || "", queryValues: queryObject?.values || [], }); return { ...GET_RES, queryObject }; case "insert": return await post({ query: { action: "insert", table, data: finalData, }, }); case "update": delete data?.id; return await post({ query: { action: "update", table, identifierColumnName: "id", identifierValue: String(finalId), data: finalData, }, }); case "delete": return await post({ query: { action: "delete", table, identifierColumnName: "id", identifierValue: String(finalId), }, }); default: return null; } }