dsql-admin/dsql-app/package-shared/utils/data-fetching/method-crud.ts

216 lines
6.4 KiB
TypeScript
Raw Normal View History

2025-02-12 16:56:44 +00:00
import _ from "lodash";
2025-01-28 18:43:16 +00:00
import sqlGenerator from "../../functions/dsql/sql/sql-generator";
import {
DsqlCrudQueryObject,
DsqlMethodCrudParam,
ServerQueryParam,
} from "../../types";
import deserializeQuery from "../deserialize-query";
import EJSON from "../ejson";
import numberfy from "../numberfy";
import dsqlCrud from "./crud";
export type APIDataCrudQuery = ServerQueryParam & {
page?: number;
};
export type CRUDResponseObject<P extends any = any> = {
success: boolean;
payload?: P;
msg?: string;
error?: string;
queryObject?: ReturnType<Awaited<typeof sqlGenerator>>;
};
export default async function dsqlMethodCrud<
T extends { [key: string]: any } = { [key: string]: any },
P extends { [key: string]: any } = { [key: string]: any }
>({
method,
tableName,
addUser,
user,
extraData,
2025-02-12 16:56:44 +00:00
transformData,
2025-01-28 18:43:16 +00:00
existingData,
body,
query,
targetId,
sanitize,
2025-02-12 16:56:44 +00:00
transformQuery,
debug,
2025-01-28 18:43:16 +00:00
}: DsqlMethodCrudParam<T>): Promise<CRUDResponseObject<P>> {
let result: CRUDResponseObject = {
success: false,
};
try {
let finalBody = body;
let finalQuery = deserializeQuery(query as any) as
| DsqlCrudQueryObject<T>
| undefined;
let LIMIT = 10;
let PAGE = 1;
let OFFSET = (PAGE - 1) * LIMIT;
2025-02-12 16:56:44 +00:00
if (method == "GET") {
const newFinalQuery = _.cloneDeep(
finalQuery || ({} as DsqlCrudQueryObject<T>)
);
Object.keys(newFinalQuery).forEach((key) => {
const value = newFinalQuery[key];
2025-01-28 18:43:16 +00:00
if (typeof value == "string" && value.match(/^\{|^\[/)) {
2025-02-12 16:56:44 +00:00
newFinalQuery[key] = EJSON.stringify(value);
2025-01-28 18:43:16 +00:00
}
if (value == "true") {
2025-02-12 16:56:44 +00:00
newFinalQuery[key] = true;
2025-01-28 18:43:16 +00:00
}
if (value == "false") {
2025-02-12 16:56:44 +00:00
newFinalQuery[key] = false;
2025-01-28 18:43:16 +00:00
}
});
2025-02-12 16:56:44 +00:00
if (newFinalQuery.limit) LIMIT = numberfy(newFinalQuery.limit);
if (newFinalQuery.page) PAGE = numberfy(newFinalQuery.page);
2025-01-28 18:43:16 +00:00
OFFSET = (PAGE - 1) * LIMIT;
2025-02-12 16:56:44 +00:00
finalQuery = newFinalQuery;
2025-01-28 18:43:16 +00:00
}
let finalData = finalBody
? ({
...finalBody,
...extraData,
} as T)
2025-02-12 16:56:44 +00:00
: ({} as T);
2025-01-28 18:43:16 +00:00
2025-02-12 16:56:44 +00:00
if (user?.id && addUser) {
2025-01-28 18:43:16 +00:00
finalData = {
...finalData,
[addUser.field]: String(user.id),
2025-02-12 16:56:44 +00:00
} as T;
2025-01-28 18:43:16 +00:00
}
2025-02-12 16:56:44 +00:00
if (transformData) {
if (debug) {
console.log("DEBUG:::transforming Data ...");
}
finalData = (await transformData({
2025-01-28 18:43:16 +00:00
data: finalData,
existingData: existingData,
user,
reqMethod: method,
2025-02-12 16:56:44 +00:00
})) as T;
}
if (transformQuery) {
if (debug) {
console.log("DEBUG:::transforming Query ...");
}
finalQuery = await transformQuery({
query: finalQuery || {},
user,
reqMethod: method,
2025-01-28 18:43:16 +00:00
});
}
2025-02-12 16:56:44 +00:00
if (debug) {
console.log("DEBUG:::finalQuery", finalQuery);
console.log("DEBUG:::finalData", finalData);
}
2025-01-28 18:43:16 +00:00
switch (method) {
case "GET":
const GET_RESULT = await dsqlCrud({
action: "get",
table: tableName,
2025-02-12 16:56:44 +00:00
query: {
...finalQuery,
query: {
...finalQuery?.query,
...(user?.id && addUser
? {
[addUser.field]: {
value: String(user.id),
},
}
: undefined),
},
limit: LIMIT,
offset: OFFSET,
} as any,
2025-01-28 18:43:16 +00:00
sanitize,
});
result = {
success: Boolean(GET_RESULT?.success),
payload: GET_RESULT?.payload,
msg: GET_RESULT?.msg,
error: GET_RESULT?.error,
queryObject: GET_RESULT?.queryObject,
};
break;
case "POST":
const POST_RESULT = await dsqlCrud({
action: "insert",
table: tableName,
2025-02-12 16:56:44 +00:00
data:
finalData && Object.keys(finalData)?.[0]
? finalData
: undefined,
2025-01-28 18:43:16 +00:00
sanitize,
});
result = {
success: Boolean(POST_RESULT?.success),
payload: POST_RESULT?.payload,
msg: POST_RESULT?.msg,
error: POST_RESULT?.error,
};
break;
case "PUT":
const PUT_RESULT = await dsqlCrud({
action: "update",
table: tableName,
2025-02-12 16:56:44 +00:00
data:
finalData && Object.keys(finalData)?.[0]
? finalData
: undefined,
2025-01-28 18:43:16 +00:00
targetId,
sanitize,
});
result = {
success: Boolean(PUT_RESULT?.success),
payload: PUT_RESULT?.payload,
msg: PUT_RESULT?.msg,
error: PUT_RESULT?.error,
};
break;
case "DELETE":
const DELETE_RESULT = await dsqlCrud({
action: "delete",
table: tableName,
targetId,
sanitize,
});
result = {
success: Boolean(DELETE_RESULT?.success),
payload: DELETE_RESULT?.payload,
msg: DELETE_RESULT?.msg,
error: DELETE_RESULT?.error,
};
break;
default:
break;
}
return result;
} catch (error) {
return result;
}
}