storemw-core-api 1.0.74 → 1.0.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/query_builder/queryBuilder.js +30 -7
- package/dist/lib/query_builder/queryBuilder.js.map +1 -1
- package/dist/models/user/UserPropModel.d.ts +14 -14
- package/dist/models/user/UserPropModel.js +1 -1
- package/dist/models/user/UserPropModel.js.map +1 -1
- package/dist/services/user/UserPropService.d.ts +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +1 -1
|
@@ -104,14 +104,37 @@ const buildSqlWhere = (filters, selectColumns) => {
|
|
|
104
104
|
if (!filter)
|
|
105
105
|
continue;
|
|
106
106
|
const { field, operator, value } = filter;
|
|
107
|
-
const formatValue = (val) => typeof val === "string" ? `'${val.replace(/'/g, "''")}'` : val;
|
|
107
|
+
const formatValue = (val, prefix, suffix) => typeof val === "string" ? `'${prefix ?? ""}${val.replace(/'/g, "''")}${suffix ?? ""}'` : val;
|
|
108
108
|
const formatValueWithArray = (val, operator) => {
|
|
109
|
+
let sqlOperator = operator;
|
|
110
|
+
// check with like operator
|
|
111
|
+
if (operator === common_1.queryListFilterOperators.startsWith ||
|
|
112
|
+
operator === common_1.queryListFilterOperators.endsWith ||
|
|
113
|
+
operator === common_1.queryListFilterOperators.contains) {
|
|
114
|
+
sqlOperator = `ILIKE`;
|
|
115
|
+
}
|
|
109
116
|
if (Array.isArray(value) === false) {
|
|
110
|
-
|
|
117
|
+
let sqlValue = formatValue(val);
|
|
118
|
+
return `${colName} ${sqlOperator} ${sqlValue}`;
|
|
111
119
|
}
|
|
112
120
|
let subOrQuery = [];
|
|
113
121
|
value.forEach((i) => {
|
|
114
|
-
|
|
122
|
+
let sqlValuePrefix = ``;
|
|
123
|
+
let sqlValueSuffix = ``;
|
|
124
|
+
if (operator === common_1.queryListFilterOperators.startsWith) {
|
|
125
|
+
sqlValuePrefix = `%`;
|
|
126
|
+
sqlValueSuffix = ``;
|
|
127
|
+
}
|
|
128
|
+
if (operator === common_1.queryListFilterOperators.endsWith) {
|
|
129
|
+
sqlValuePrefix = ``;
|
|
130
|
+
sqlValueSuffix = `%`;
|
|
131
|
+
}
|
|
132
|
+
if (operator === common_1.queryListFilterOperators.contains) {
|
|
133
|
+
sqlValuePrefix = `%`;
|
|
134
|
+
sqlValueSuffix = `%`;
|
|
135
|
+
}
|
|
136
|
+
let sqlValue = `${formatValue(i, sqlValuePrefix, sqlValueSuffix)}`;
|
|
137
|
+
subOrQuery.push(`${colName} ${sqlOperator} ${sqlValue}`);
|
|
115
138
|
});
|
|
116
139
|
return `(${subOrQuery.join(" OR ")})`;
|
|
117
140
|
};
|
|
@@ -138,10 +161,10 @@ const buildSqlWhere = (filters, selectColumns) => {
|
|
|
138
161
|
// andClauses.push(`${colName} ILIKE '%${value}%'`);
|
|
139
162
|
break;
|
|
140
163
|
case common_1.queryListFilterOperators.anyOf:
|
|
141
|
-
andClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(", ")})`);
|
|
164
|
+
andClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(", ")})`);
|
|
142
165
|
break;
|
|
143
166
|
case common_1.queryListFilterOperators.excludeOf:
|
|
144
|
-
andClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(", ")})`);
|
|
167
|
+
andClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(", ")})`);
|
|
145
168
|
break;
|
|
146
169
|
case common_1.queryListFilterOperators.moreThanEq:
|
|
147
170
|
andClauses.push(`${colName} >= ${formatValue(value)}`);
|
|
@@ -163,10 +186,10 @@ const buildSqlWhere = (filters, selectColumns) => {
|
|
|
163
186
|
orClauses.push(`${colName} ILIKE '%${value}%'`);
|
|
164
187
|
break;
|
|
165
188
|
case common_1.queryListFilterOperators.anyOfOr:
|
|
166
|
-
orClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(", ")})`);
|
|
189
|
+
orClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(", ")})`);
|
|
167
190
|
break;
|
|
168
191
|
case common_1.queryListFilterOperators.excludeOfOr:
|
|
169
|
-
orClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(", ")})`);
|
|
192
|
+
orClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(", ")})`);
|
|
170
193
|
break;
|
|
171
194
|
case common_1.queryListFilterOperators.moreThanEqOr:
|
|
172
195
|
orClauses.push(`${colName} >= ${formatValue(value)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryBuilder.js","sourceRoot":"","sources":["../../../src/lib/query_builder/queryBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { queryListFilterOperators } from '@/schema/common';\nimport { QueryList, QueryListFilter } from \"@/schema/common\";\n\ntype JoinType = \"left\" | \"inner\" | \"right\";\n\n/**\n * Create a typed map of model fields for safer access in raw queries.\n *\n * This utility takes a TypeScript model type `T` and returns an object\n * where each key is the field name and the value is the same string.\n * \n * The returned object can be used for dot-suggestion, reducing typos\n * when referencing columns in SQL queries.\n *\n * @example\n * import type { Customer } from \"@prisma/client\";\n * import { createFields } from \"@/utils/createFields\";\n * \n * const CustomerFields = createFields<Customer>();\n * console.log(CustomerFields.id); // \"id\"\n * console.log(CustomerFields.name); // \"name\"\n * \n * const query = `SELECT ${CustomerFields.id}, ${CustomerFields.name} FROM customers`;\n */\ntype FieldMap<T> = {\n [K in keyof T]: K;\n};\n\nexport function getFieldsByType<T>(): FieldMap<T> {\n return new Proxy({} as FieldMap<T>, {\n get: (_, prop) => prop,\n }) as FieldMap<T>;\n}\n\ntype FieldMeta = { name: string; type: string };\n\nexport const toFieldMap = (\n fields: FieldMeta[],\n prefix = \"uip\",\n infix = \"inf_\"\n): Record<string, string> => {\n return Object.fromEntries(\n fields.map(f => [`${prefix}.${f.name}`, `${infix}${f.name}`])\n );\n}\n\nexport const buildSqlRawSelect = ({\n tableName,\n mainAlias,\n accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset,\n skipFilterAccountId = false\n}: {\n tableName: string,\n mainAlias: string,\n accountId: number,\n sqlSelect: string[]\n sqlRelation: string[]\n sqlWhere: string[]\n sqlGroupBy: string[]\n sqlOrderby: string\n sqlLimitOffset: string\n skipFilterAccountId?: boolean\n}) => {\n\n if (skipFilterAccountId === false) {\n sqlWhere = [...sqlWhere, `${mainAlias}.accountid = ${accountId}`]\n }\n\n return `select \n ${sqlSelect.join(\",\")}\n from \n ${tableName} as ${mainAlias}\n ${sqlRelation.join(\" \")}\n where \n ${sqlWhere.join(' and ')}\n ${sqlGroupBy.length ? `GROUP BY ${sqlGroupBy.join(\",\")}` : \"\"}\n ${sqlOrderby} \n ${sqlLimitOffset}\n `\n}\n\n\nexport const buildSqlRawSelectCount = ({\n tableName,\n mainAlias,\n accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby\n}: {\n tableName: string,\n mainAlias: string,\n accountId: number,\n sqlSelect: string[]\n sqlRelation: string[]\n sqlWhere: string[]\n sqlGroupBy: string[]\n sqlOrderby: string\n}) => {\n\n const sql = buildSqlRawSelect({\n tableName,\n mainAlias,\n accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset: \"\"\n })\n\n return `WITH filtered_docs AS (${sql}) SELECT COUNT(*) AS filtered_count FROM filtered_docs;`\n}\n\n/**\n * Build a SQL join clause\n * @param joinType - \"left\" | \"inner\" | \"right\" (default: \"left\")\n * @param sourceAlias - alias of the source table, e.g., \"cus\"\n * @param targetTable - table to join, e.g., \"users\"\n * @param targetAlias - alias for the target table, e.g., \"usr\"\n * @param onConditions - array of ON conditions, e.g., [\"cus.user_id = usr.user_id\", \"usr.isdelete = false\"]\n */\nexport const buildSqlRelation = (\n joinType: JoinType,\n sourceAlias: string,\n targetTable: string,\n targetAlias: string,\n onConditions: string[]\n) => {\n return `\n ${joinType} join ${targetTable} as ${targetAlias}\n on ${onConditions.join(\" and \")}\n `;\n}\n/**\n * Build a SQL SELECT column list with aliases\n *\n * This function takes a table alias and a mapping of column names to\n * desired aliases, and returns a comma-separated string suitable for\n * inclusion in a SQL SELECT statement.\n *\n * @param abb - The alias of the table in the SQL query (e.g., \"cus\" for customers)\n * @param columns - An object mapping column names to their desired aliases\n * e.g., { id: \"customerId\", name: \"customerName\" }\n * @returns A string of columns with aliases, e.g.,\n * \"cus.id as customerId, cus.name as customerName\"\n *\n * @example\n * const cols = buildSqlSelect(\"cus\", { id: \"customerId\", name: \"customerName\" });\n * // cols => \"cus.id as customerId, cus.name as customerName\"\n */\nexport const buildSqlSelect = (abb: string, columns: Record<string, string>): string => {\n\n if (!columns || Object.keys(columns).length === 0) return \"\";\n\n return Object.entries(columns)\n .map(([col, alias]) => `${abb ? abb + \".\" : \"\"}${col} as ${alias}`)\n .join(\", \");\n}\n\nexport const buildSqlWhere = (\n filters: QueryListFilter[] | undefined,\n selectColumns: any\n): {\n where: string,\n colNames: string[],\n aliasKeys: string[]\n} => {\n\n if (!filters || filters.length === 0) {\n return {\n where: ``,\n colNames: [],\n aliasKeys: []\n }\n }\n\n const andClauses: string[] = [];\n const orClauses: string[] = [];\n\n // const col = (field: string) => (tableAlias ? `${tableAlias}.${field}` : field);\n\n const col = (field: string) => {\n let filteredColumns = Object.fromEntries(\n Object.entries(selectColumns).filter(([key, alias]) => alias === field)\n )\n return filteredColumns ? Object.keys(filteredColumns)[0] : field\n }\n\n const colNames: string[] = []\n\n for (const filter of filters) {\n if (!filter) continue;\n\n const { field, operator, value } = filter;\n\n const formatValue = (val: any) =>\n typeof val === \"string\" ? `'${val.replace(/'/g, \"''\")}'` : val;\n\n const formatValueWithArray = (val: any, operator: QueryListFilter[\"operator\"]) => {\n\n if (Array.isArray(value) === false) {\n return `${colName} ${operator} ${formatValue(val)}`\n }\n\n let subOrQuery: string[] = []\n\n value.forEach((i: any) => {\n subOrQuery.push(`${colName} ${operator} ${formatValue(i)}`)\n })\n\n return `(${subOrQuery.join(\" OR \")})`\n\n }\n\n const colName = `${col(field)}`\n\n switch (operator) {\n case queryListFilterOperators.eq:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.eq)}`);\n // andClauses.push(`${colName} = ${formatValue(value)}`);\n break;\n case queryListFilterOperators.notEq:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.notEq)}`);\n // andClauses.push(`${colName} != ${formatValue(value)}`);\n break;\n case queryListFilterOperators.startsWith:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.startsWith)}`);\n // andClauses.push(`${colName} ILIKE '${value}%'`);\n break;\n case queryListFilterOperators.endsWith:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.endsWith)}`);\n // andClauses.push(`${colName} ILIKE '%${value}'`);\n break;\n case queryListFilterOperators.contains:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.contains)}`);\n // andClauses.push(`${colName} ILIKE '%${value}%'`);\n break;\n case queryListFilterOperators.anyOf:\n andClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(\", \")})`);\n break;\n case queryListFilterOperators.excludeOf:\n andClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(\", \")})`);\n break;\n case queryListFilterOperators.moreThanEq:\n andClauses.push(`${colName} >= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.lessThanEq:\n andClauses.push(`${colName} <= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.isNull:\n andClauses.push(`${colName} IS NULL`);\n break;\n case queryListFilterOperators.isNotNull:\n andClauses.push(`${colName} IS NOT NULL`);\n break;\n\n // Or-variants\n case queryListFilterOperators.eqOr:\n orClauses.push(`${colName} = ${formatValue(value)}`);\n break;\n case queryListFilterOperators.containsOr:\n orClauses.push(`${colName} ILIKE '%${value}%'`);\n break;\n case queryListFilterOperators.anyOfOr:\n orClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(\", \")})`);\n break;\n case queryListFilterOperators.excludeOfOr:\n orClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map(formatValue).join(\", \")})`);\n break;\n case queryListFilterOperators.moreThanEqOr:\n orClauses.push(`${colName} >= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.lessThanEqOr:\n orClauses.push(`${colName} <= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.isNullOr:\n orClauses.push(`${colName} IS NULL`);\n break;\n }\n\n colNames.push(colName)\n\n }\n\n const whereParts: string[] = [];\n if (andClauses.length) whereParts.push(`(${andClauses.join(\" AND \")})`);\n if (orClauses.length) whereParts.push(`(${orClauses.join(\" OR \")})`);\n\n // Extract aliasKeys before '.'\n const aliasKeys = Array.from(\n new Set(\n colNames\n .map(key => key.match(/\\b([a-zA-Z_][a-zA-Z0-9_]*)\\./)?.[1])\n .filter((v): v is string => Boolean(v)) // type guard keeps only valid strings\n )\n );\n\n return {\n where: whereParts.length ? `${whereParts.join(\" AND \")}` : \"\",\n colNames,\n aliasKeys\n }\n};\n\n/** Build ORDER BY clause */\nexport const buildSqlOrderBy = (sortField: QueryList[\"sortfield\"], sortOrder: QueryList[\"sortorder\"]) =>\n sortField ? `ORDER BY ${sortField} ${sortOrder.toUpperCase()}` : \"\";\n\n/** Build LIMIT/OFFSET clause */\nexport const buildSqlLimitOffset = (limit?: QueryList[\"limit\"], offset?: QueryList[\"offset\"]) => {\n const parts: string[] = [];\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\n return parts.join(\" \");\n};\n\n/** For Injection Fields */\nexport const buildInjectionFieldsSqlSelect = (alias: string, activeInjectionFields: any[] = []) => {\n return activeInjectionFields.reduce((acc, col) => {\n\n // check the field type is decimal\n let castValue = ``\n\n if (col?.fieldType === \"numeric\") {\n castValue = `::float`\n }\n\n if (col?.fieldType === \"integer\") {\n castValue = `::int`\n }\n\n acc[`${alias}.${col?.fieldName}${castValue}`] = `inf_${col?.fieldName}`;\n return acc;\n }, {} as Record<string, string>);\n}\n\n/**\n * Executes a dynamic SQL listing query along with a count query.\n * \n * This function builds SQL SELECT and COUNT statements using the provided\n * relation maps, filters, and query options, then executes them through\n * the given Prisma model's `raw()` method.\n *\n * Commonly used for paginated data listings that require both the\n * result set and total record count.\n * \n * Returns an object containing:\n * - `data`: The paginated result set.\n * - `total`: The total count of records that match the filters.\n */\nexport const getListWithCount = async ({\n model,\n tableName,\n mainAlias,\n countKey,\n sqlRelationMaps,\n accountId,\n filters,\n filterColumns,\n sqlSelect,\n sqlSelectAgg,\n sqlRelation,\n sqlRelationAgg,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset\n}: {\n model: any,\n tableName: string,\n mainAlias: string,\n countKey: string,\n sqlRelationMaps: any,\n accountId: number,\n filters: any[],\n filterColumns: any,\n sqlSelect: string[]\n sqlSelectAgg: string[],\n sqlRelation: string[]\n sqlRelationAgg: string[],\n sqlWhere: string[]\n sqlGroupBy: string[]\n sqlOrderby: string\n sqlLimitOffset: string\n}) => {\n\n const requestWhere = buildSqlWhere(filters, filterColumns)\n\n sqlWhere = [\n ...sqlWhere,\n ...(filters.length ? [requestWhere?.where] : []),\n ]\n\n // get the data (pagination)\n const sqlRaw = buildSqlRawSelect({\n tableName,\n mainAlias,\n accountId,\n sqlSelect: [...sqlSelect, ...sqlSelectAgg],\n sqlRelation: [...sqlRelation, ...sqlRelationAgg],\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset\n })\n\n let data = await model.raw(sqlRaw)\n\n let aliasKeys = requestWhere?.aliasKeys\n\n let filteredArray: any = Object.entries(sqlRelationMaps)\n .filter(([key]) => aliasKeys.includes(key))\n .map(([_, value]) => value);\n\n // console.log('filteredArray', JSON.stringify(filteredArray), aliasKeys)\n\n // get the count\n const sqlRawCount = buildSqlRawSelectCount({\n tableName,\n mainAlias,\n accountId,\n sqlSelect: [`${mainAlias}.${countKey}`],\n sqlRelation: filteredArray,\n sqlWhere,\n sqlGroupBy: [`${mainAlias}.${countKey}`],\n sqlOrderby: ``\n })\n\n let count = await model.raw(sqlRawCount)\n\n return {\n data,\n total: Number(count[0].filtered_count)\n }\n\n}"]}
|
|
1
|
+
{"version":3,"file":"queryBuilder.js","sourceRoot":"","sources":["../../../src/lib/query_builder/queryBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { queryListFilterOperators } from '@/schema/common';\nimport { QueryList, QueryListFilter } from \"@/schema/common\";\n\ntype JoinType = \"left\" | \"inner\" | \"right\";\n\n/**\n * Create a typed map of model fields for safer access in raw queries.\n *\n * This utility takes a TypeScript model type `T` and returns an object\n * where each key is the field name and the value is the same string.\n * \n * The returned object can be used for dot-suggestion, reducing typos\n * when referencing columns in SQL queries.\n *\n * @example\n * import type { Customer } from \"@prisma/client\";\n * import { createFields } from \"@/utils/createFields\";\n * \n * const CustomerFields = createFields<Customer>();\n * console.log(CustomerFields.id); // \"id\"\n * console.log(CustomerFields.name); // \"name\"\n * \n * const query = `SELECT ${CustomerFields.id}, ${CustomerFields.name} FROM customers`;\n */\ntype FieldMap<T> = {\n [K in keyof T]: K;\n};\n\nexport function getFieldsByType<T>(): FieldMap<T> {\n return new Proxy({} as FieldMap<T>, {\n get: (_, prop) => prop,\n }) as FieldMap<T>;\n}\n\ntype FieldMeta = { name: string; type: string };\n\nexport const toFieldMap = (\n fields: FieldMeta[],\n prefix = \"uip\",\n infix = \"inf_\"\n): Record<string, string> => {\n return Object.fromEntries(\n fields.map(f => [`${prefix}.${f.name}`, `${infix}${f.name}`])\n );\n}\n\nexport const buildSqlRawSelect = ({\n tableName,\n mainAlias,\n accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset,\n skipFilterAccountId = false\n}: {\n tableName: string,\n mainAlias: string,\n accountId: number,\n sqlSelect: string[]\n sqlRelation: string[]\n sqlWhere: string[]\n sqlGroupBy: string[]\n sqlOrderby: string\n sqlLimitOffset: string\n skipFilterAccountId?: boolean\n}) => {\n\n if (skipFilterAccountId === false) {\n sqlWhere = [...sqlWhere, `${mainAlias}.accountid = ${accountId}`]\n }\n\n return `select \n ${sqlSelect.join(\",\")}\n from \n ${tableName} as ${mainAlias}\n ${sqlRelation.join(\" \")}\n where \n ${sqlWhere.join(' and ')}\n ${sqlGroupBy.length ? `GROUP BY ${sqlGroupBy.join(\",\")}` : \"\"}\n ${sqlOrderby} \n ${sqlLimitOffset}\n `\n}\n\n\nexport const buildSqlRawSelectCount = ({\n tableName,\n mainAlias,\n accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby\n}: {\n tableName: string,\n mainAlias: string,\n accountId: number,\n sqlSelect: string[]\n sqlRelation: string[]\n sqlWhere: string[]\n sqlGroupBy: string[]\n sqlOrderby: string\n}) => {\n\n const sql = buildSqlRawSelect({\n tableName,\n mainAlias,\n accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset: \"\"\n })\n\n return `WITH filtered_docs AS (${sql}) SELECT COUNT(*) AS filtered_count FROM filtered_docs;`\n}\n\n/**\n * Build a SQL join clause\n * @param joinType - \"left\" | \"inner\" | \"right\" (default: \"left\")\n * @param sourceAlias - alias of the source table, e.g., \"cus\"\n * @param targetTable - table to join, e.g., \"users\"\n * @param targetAlias - alias for the target table, e.g., \"usr\"\n * @param onConditions - array of ON conditions, e.g., [\"cus.user_id = usr.user_id\", \"usr.isdelete = false\"]\n */\nexport const buildSqlRelation = (\n joinType: JoinType,\n sourceAlias: string,\n targetTable: string,\n targetAlias: string,\n onConditions: string[]\n) => {\n return `\n ${joinType} join ${targetTable} as ${targetAlias}\n on ${onConditions.join(\" and \")}\n `;\n}\n/**\n * Build a SQL SELECT column list with aliases\n *\n * This function takes a table alias and a mapping of column names to\n * desired aliases, and returns a comma-separated string suitable for\n * inclusion in a SQL SELECT statement.\n *\n * @param abb - The alias of the table in the SQL query (e.g., \"cus\" for customers)\n * @param columns - An object mapping column names to their desired aliases\n * e.g., { id: \"customerId\", name: \"customerName\" }\n * @returns A string of columns with aliases, e.g.,\n * \"cus.id as customerId, cus.name as customerName\"\n *\n * @example\n * const cols = buildSqlSelect(\"cus\", { id: \"customerId\", name: \"customerName\" });\n * // cols => \"cus.id as customerId, cus.name as customerName\"\n */\nexport const buildSqlSelect = (abb: string, columns: Record<string, string>): string => {\n\n if (!columns || Object.keys(columns).length === 0) return \"\";\n\n return Object.entries(columns)\n .map(([col, alias]) => `${abb ? abb + \".\" : \"\"}${col} as ${alias}`)\n .join(\", \");\n}\n\nexport const buildSqlWhere = (\n filters: QueryListFilter[] | undefined,\n selectColumns: any\n): {\n where: string,\n colNames: string[],\n aliasKeys: string[]\n} => {\n\n if (!filters || filters.length === 0) {\n return {\n where: ``,\n colNames: [],\n aliasKeys: []\n }\n }\n\n const andClauses: string[] = [];\n const orClauses: string[] = [];\n\n // const col = (field: string) => (tableAlias ? `${tableAlias}.${field}` : field);\n\n const col = (field: string) => {\n let filteredColumns = Object.fromEntries(\n Object.entries(selectColumns).filter(([key, alias]) => alias === field)\n )\n return filteredColumns ? Object.keys(filteredColumns)[0] : field\n }\n\n const colNames: string[] = []\n\n for (const filter of filters) {\n if (!filter) continue;\n\n const { field, operator, value } = filter;\n\n const formatValue = (val: any, prefix?: string, suffix?: string) =>\n typeof val === \"string\" ? `'${prefix ?? \"\"}${val.replace(/'/g, \"''\")}${suffix ?? \"\"}'` : val;\n\n const formatValueWithArray = (val: any, operator: QueryListFilter[\"operator\"]) => {\n\n let sqlOperator: string = operator\n\n // check with like operator\n if (\n operator === queryListFilterOperators.startsWith ||\n operator === queryListFilterOperators.endsWith ||\n operator === queryListFilterOperators.contains\n ) {\n sqlOperator = `ILIKE`\n }\n\n if (Array.isArray(value) === false) {\n let sqlValue = formatValue(val)\n return `${colName} ${sqlOperator} ${sqlValue}`\n }\n\n let subOrQuery: string[] = []\n\n value.forEach((i: any) => {\n\n let sqlValuePrefix = ``\n let sqlValueSuffix = ``\n\n if (operator === queryListFilterOperators.startsWith) {\n sqlValuePrefix = `%`\n sqlValueSuffix = ``\n }\n\n if (operator === queryListFilterOperators.endsWith) {\n sqlValuePrefix = ``\n sqlValueSuffix = `%`\n }\n\n if (operator === queryListFilterOperators.contains) {\n sqlValuePrefix = `%`\n sqlValueSuffix = `%`\n }\n\n let sqlValue = `${formatValue(i, sqlValuePrefix, sqlValueSuffix)}`\n\n subOrQuery.push(`${colName} ${sqlOperator} ${sqlValue}`)\n\n })\n\n return `(${subOrQuery.join(\" OR \")})`\n\n }\n\n const colName = `${col(field)}`\n\n switch (operator) {\n case queryListFilterOperators.eq:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.eq)}`);\n // andClauses.push(`${colName} = ${formatValue(value)}`);\n break;\n case queryListFilterOperators.notEq:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.notEq)}`);\n // andClauses.push(`${colName} != ${formatValue(value)}`);\n break;\n case queryListFilterOperators.startsWith:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.startsWith)}`);\n // andClauses.push(`${colName} ILIKE '${value}%'`);\n break;\n case queryListFilterOperators.endsWith:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.endsWith)}`);\n // andClauses.push(`${colName} ILIKE '%${value}'`);\n break;\n case queryListFilterOperators.contains:\n andClauses.push(`${formatValueWithArray(value, queryListFilterOperators.contains)}`);\n // andClauses.push(`${colName} ILIKE '%${value}%'`);\n break;\n case queryListFilterOperators.anyOf:\n andClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(\", \")})`);\n break;\n case queryListFilterOperators.excludeOf:\n andClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(\", \")})`);\n break;\n case queryListFilterOperators.moreThanEq:\n andClauses.push(`${colName} >= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.lessThanEq:\n andClauses.push(`${colName} <= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.isNull:\n andClauses.push(`${colName} IS NULL`);\n break;\n case queryListFilterOperators.isNotNull:\n andClauses.push(`${colName} IS NOT NULL`);\n break;\n\n // Or-variants\n case queryListFilterOperators.eqOr:\n orClauses.push(`${colName} = ${formatValue(value)}`);\n break;\n case queryListFilterOperators.containsOr:\n orClauses.push(`${colName} ILIKE '%${value}%'`);\n break;\n case queryListFilterOperators.anyOfOr:\n orClauses.push(`${colName} IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(\", \")})`);\n break;\n case queryListFilterOperators.excludeOfOr:\n orClauses.push(`${colName} NOT IN (${(Array.isArray(value) ? value : [value]).map((i) => formatValue(i)).join(\", \")})`);\n break;\n case queryListFilterOperators.moreThanEqOr:\n orClauses.push(`${colName} >= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.lessThanEqOr:\n orClauses.push(`${colName} <= ${formatValue(value)}`);\n break;\n case queryListFilterOperators.isNullOr:\n orClauses.push(`${colName} IS NULL`);\n break;\n }\n\n colNames.push(colName)\n\n }\n\n const whereParts: string[] = [];\n if (andClauses.length) whereParts.push(`(${andClauses.join(\" AND \")})`);\n if (orClauses.length) whereParts.push(`(${orClauses.join(\" OR \")})`);\n\n // Extract aliasKeys before '.'\n const aliasKeys = Array.from(\n new Set(\n colNames\n .map(key => key.match(/\\b([a-zA-Z_][a-zA-Z0-9_]*)\\./)?.[1])\n .filter((v): v is string => Boolean(v)) // type guard keeps only valid strings\n )\n );\n\n return {\n where: whereParts.length ? `${whereParts.join(\" AND \")}` : \"\",\n colNames,\n aliasKeys\n }\n};\n\n/** Build ORDER BY clause */\nexport const buildSqlOrderBy = (sortField: QueryList[\"sortfield\"], sortOrder: QueryList[\"sortorder\"]) =>\n sortField ? `ORDER BY ${sortField} ${sortOrder.toUpperCase()}` : \"\";\n\n/** Build LIMIT/OFFSET clause */\nexport const buildSqlLimitOffset = (limit?: QueryList[\"limit\"], offset?: QueryList[\"offset\"]) => {\n const parts: string[] = [];\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\n return parts.join(\" \");\n};\n\n/** For Injection Fields */\nexport const buildInjectionFieldsSqlSelect = (alias: string, activeInjectionFields: any[] = []) => {\n return activeInjectionFields.reduce((acc, col) => {\n\n // check the field type is decimal\n let castValue = ``\n\n if (col?.fieldType === \"numeric\") {\n castValue = `::float`\n }\n\n if (col?.fieldType === \"integer\") {\n castValue = `::int`\n }\n\n acc[`${alias}.${col?.fieldName}${castValue}`] = `inf_${col?.fieldName}`;\n return acc;\n }, {} as Record<string, string>);\n}\n\n/**\n * Executes a dynamic SQL listing query along with a count query.\n * \n * This function builds SQL SELECT and COUNT statements using the provided\n * relation maps, filters, and query options, then executes them through\n * the given Prisma model's `raw()` method.\n *\n * Commonly used for paginated data listings that require both the\n * result set and total record count.\n * \n * Returns an object containing:\n * - `data`: The paginated result set.\n * - `total`: The total count of records that match the filters.\n */\nexport const getListWithCount = async ({\n model,\n tableName,\n mainAlias,\n countKey,\n sqlRelationMaps,\n accountId,\n filters,\n filterColumns,\n sqlSelect,\n sqlSelectAgg,\n sqlRelation,\n sqlRelationAgg,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset\n}: {\n model: any,\n tableName: string,\n mainAlias: string,\n countKey: string,\n sqlRelationMaps: any,\n accountId: number,\n filters: any[],\n filterColumns: any,\n sqlSelect: string[]\n sqlSelectAgg: string[],\n sqlRelation: string[]\n sqlRelationAgg: string[],\n sqlWhere: string[]\n sqlGroupBy: string[]\n sqlOrderby: string\n sqlLimitOffset: string\n}) => {\n\n const requestWhere = buildSqlWhere(filters, filterColumns)\n\n sqlWhere = [\n ...sqlWhere,\n ...(filters.length ? [requestWhere?.where] : []),\n ]\n\n // get the data (pagination)\n const sqlRaw = buildSqlRawSelect({\n tableName,\n mainAlias,\n accountId,\n sqlSelect: [...sqlSelect, ...sqlSelectAgg],\n sqlRelation: [...sqlRelation, ...sqlRelationAgg],\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset\n })\n\n let data = await model.raw(sqlRaw)\n\n let aliasKeys = requestWhere?.aliasKeys\n\n let filteredArray: any = Object.entries(sqlRelationMaps)\n .filter(([key]) => aliasKeys.includes(key))\n .map(([_, value]) => value);\n\n // console.log('filteredArray', JSON.stringify(filteredArray), aliasKeys)\n\n // get the count\n const sqlRawCount = buildSqlRawSelectCount({\n tableName,\n mainAlias,\n accountId,\n sqlSelect: [`${mainAlias}.${countKey}`],\n sqlRelation: filteredArray,\n sqlWhere,\n sqlGroupBy: [`${mainAlias}.${countKey}`],\n sqlOrderby: ``\n })\n\n let count = await model.raw(sqlRawCount)\n\n return {\n data,\n total: Number(count[0].filtered_count)\n }\n\n}"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { user_props, Prisma } from "@prisma/client";
|
|
2
2
|
import { DefaultOmitFields } from "../../lib";
|
|
3
3
|
import { DefaultServiceProps } from "../../utils";
|
|
4
|
-
declare const primaryKey = "
|
|
4
|
+
declare const primaryKey = "user_prop_id";
|
|
5
5
|
export declare const ModelUserPropFields: {
|
|
6
6
|
type: "type";
|
|
7
7
|
createdatetime: "createdatetime";
|
|
@@ -12,7 +12,7 @@ export declare const ModelUserPropFields: {
|
|
|
12
12
|
istrash: "istrash";
|
|
13
13
|
accountid: "accountid";
|
|
14
14
|
user_id: "user_id";
|
|
15
|
-
|
|
15
|
+
user_prop_id: "user_prop_id";
|
|
16
16
|
props_value: "props_value";
|
|
17
17
|
props_id: "props_id";
|
|
18
18
|
props_numeric: "props_numeric";
|
|
@@ -44,7 +44,7 @@ export type ModelUserPropListProps = {
|
|
|
44
44
|
limit?: number;
|
|
45
45
|
};
|
|
46
46
|
export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
47
|
-
primaryKey: "type" | "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "user_id" | "
|
|
47
|
+
primaryKey: "type" | "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "user_id" | "user_prop_id" | "props_value" | "props_id" | "props_numeric" | "props_timestamp" | "props_integer";
|
|
48
48
|
getFields: (prefix?: string, excludeKeywords?: string[]) => Promise<{
|
|
49
49
|
name: string;
|
|
50
50
|
type: string;
|
|
@@ -61,7 +61,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
61
61
|
istrash: boolean | null;
|
|
62
62
|
accountid: bigint;
|
|
63
63
|
user_id: bigint | null;
|
|
64
|
-
|
|
64
|
+
user_prop_id: bigint;
|
|
65
65
|
props_value: string | null;
|
|
66
66
|
props_id: bigint;
|
|
67
67
|
props_numeric: Prisma.Decimal;
|
|
@@ -81,7 +81,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
81
81
|
istrash: boolean | null;
|
|
82
82
|
accountid: bigint;
|
|
83
83
|
user_id: bigint | null;
|
|
84
|
-
|
|
84
|
+
user_prop_id: bigint;
|
|
85
85
|
props_value: string | null;
|
|
86
86
|
props_id: bigint;
|
|
87
87
|
props_numeric: Prisma.Decimal;
|
|
@@ -102,7 +102,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
102
102
|
istrash: boolean | null;
|
|
103
103
|
accountid: bigint;
|
|
104
104
|
user_id: bigint | null;
|
|
105
|
-
|
|
105
|
+
user_prop_id: bigint;
|
|
106
106
|
props_value: string | null;
|
|
107
107
|
props_id: bigint;
|
|
108
108
|
props_numeric: Prisma.Decimal;
|
|
@@ -119,7 +119,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
119
119
|
istrash: boolean | null;
|
|
120
120
|
accountid: bigint;
|
|
121
121
|
user_id: bigint | null;
|
|
122
|
-
|
|
122
|
+
user_prop_id: bigint;
|
|
123
123
|
props_value: string | null;
|
|
124
124
|
props_id: bigint;
|
|
125
125
|
props_numeric: Prisma.Decimal;
|
|
@@ -130,7 +130,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
130
130
|
where?: Record<string, any>;
|
|
131
131
|
}) => Promise<number>;
|
|
132
132
|
aggregate: ({ field, operation, where, }: {
|
|
133
|
-
field: "type" | "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "user_id" | "
|
|
133
|
+
field: "type" | "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "user_id" | "user_prop_id" | "props_value" | "props_id" | "props_numeric" | "props_timestamp" | "props_integer";
|
|
134
134
|
operation?: "sum" | "avg" | "min" | "max" | "count";
|
|
135
135
|
where?: Record<string, any>;
|
|
136
136
|
}) => Promise<number>;
|
|
@@ -147,7 +147,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
147
147
|
istrash: boolean | null;
|
|
148
148
|
accountid: bigint;
|
|
149
149
|
user_id: bigint | null;
|
|
150
|
-
|
|
150
|
+
user_prop_id: bigint;
|
|
151
151
|
props_value: string | null;
|
|
152
152
|
props_id: bigint;
|
|
153
153
|
props_numeric: Prisma.Decimal;
|
|
@@ -165,7 +165,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
165
165
|
istrash: boolean | null;
|
|
166
166
|
accountid: bigint;
|
|
167
167
|
user_id: bigint | null;
|
|
168
|
-
|
|
168
|
+
user_prop_id: bigint;
|
|
169
169
|
props_value: string | null;
|
|
170
170
|
props_id: bigint;
|
|
171
171
|
props_numeric: Prisma.Decimal;
|
|
@@ -185,7 +185,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
185
185
|
istrash: boolean | null;
|
|
186
186
|
accountid: bigint;
|
|
187
187
|
user_id: bigint | null;
|
|
188
|
-
|
|
188
|
+
user_prop_id: bigint;
|
|
189
189
|
props_value: string | null;
|
|
190
190
|
props_id: bigint;
|
|
191
191
|
props_numeric: Prisma.Decimal;
|
|
@@ -204,7 +204,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
204
204
|
istrash: boolean | null;
|
|
205
205
|
accountid: bigint;
|
|
206
206
|
user_id: bigint | null;
|
|
207
|
-
|
|
207
|
+
user_prop_id: bigint;
|
|
208
208
|
props_value: string | null;
|
|
209
209
|
props_id: bigint;
|
|
210
210
|
props_numeric: Prisma.Decimal;
|
|
@@ -223,7 +223,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
223
223
|
istrash: boolean | null;
|
|
224
224
|
accountid: bigint;
|
|
225
225
|
user_id: bigint | null;
|
|
226
|
-
|
|
226
|
+
user_prop_id: bigint;
|
|
227
227
|
props_value: string | null;
|
|
228
228
|
props_id: bigint;
|
|
229
229
|
props_numeric: Prisma.Decimal;
|
|
@@ -243,7 +243,7 @@ export declare const UserPropModel: ({ ...rest }: DefaultServiceProps) => {
|
|
|
243
243
|
istrash: boolean | null;
|
|
244
244
|
accountid: bigint;
|
|
245
245
|
user_id: bigint | null;
|
|
246
|
-
|
|
246
|
+
user_prop_id: bigint;
|
|
247
247
|
props_value: string | null;
|
|
248
248
|
props_id: bigint;
|
|
249
249
|
props_numeric: Prisma.Decimal;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UserPropModel = exports.ModelUserPropFields = void 0;
|
|
4
4
|
const lib_1 = require("../../lib");
|
|
5
|
-
const primaryKey = "
|
|
5
|
+
const primaryKey = "user_prop_id";
|
|
6
6
|
exports.ModelUserPropFields = (0, lib_1.getFieldsByType)();
|
|
7
7
|
const UserPropModel = ({ ...rest }) => (0, lib_1.ModelFactory)({
|
|
8
8
|
...rest,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserPropModel.js","sourceRoot":"","sources":["../../../src/models/user/UserPropModel.ts"],"names":[],"mappings":";;;AACA,+BAAyE;AAGzE,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"UserPropModel.js","sourceRoot":"","sources":["../../../src/models/user/UserPropModel.ts"],"names":[],"mappings":";;;AACA,+BAAyE;AAGzE,MAAM,UAAU,GAAG,cAAc,CAAC;AAErB,QAAA,mBAAmB,GAAG,IAAA,qBAAe,GAAc,CAAC;AAkC1D,MAAM,aAAa,GAAG,CAAC,EAAE,GAAG,IAAI,EAAuB,EAAE,EAAE,CAC9D,IAAA,kBAAY,EAAqE;IAC7E,GAAG,IAAI;IACP,SAAS,EAAE,YAAY;IACvB,UAAU;CACb,CAAC,CAAC;AALM,QAAA,aAAa,iBAKnB","sourcesContent":["import { PrismaClient, user_props, Prisma } from \"@prisma/client\";\nimport { ModelFactory, DefaultOmitFields, getFieldsByType } from \"@/lib\";\nimport { DefaultServiceProps } from \"@/utils\";\n\nconst primaryKey = \"user_prop_id\";\n\nexport const ModelUserPropFields = getFieldsByType<user_props>();\n\nexport type ModelUserProp = user_props;\n\nexport type ModelUserPropOmitFields = typeof primaryKey | DefaultOmitFields;\n\nexport type ModelUserPropCreateProps = {\n data: Omit<Prisma.user_propsUncheckedCreateInput, ModelUserPropOmitFields>;\n};\n\nexport type ModelUserPropUpdateProps = {\n id: number;\n data: Omit<Prisma.user_propsUncheckedUpdateInput, ModelUserPropOmitFields>;\n};\n\nexport type ModelUserPropTrashProps = {\n ids: number[];\n};\n\nexport type ModelUserPropRemoveProps = {\n id: number;\n};\n\nexport type ModelUserPropGetProps = {\n id: number;\n};\n\nexport type ModelUserPropListProps = {\n where?: Prisma.user_propsWhereInput;\n orderBy?: Prisma.user_propsOrderByWithRelationInput | Prisma.user_propsOrderByWithRelationInput[];\n offset?: number;\n limit?: number;\n};\n\nexport const UserPropModel = ({ ...rest }: DefaultServiceProps) =>\n ModelFactory<PrismaClient, \"user_props\", PrismaClient[\"user_props\"], user_props>({\n ...rest,\n modelName: \"user_props\",\n primaryKey\n });\n"]}
|
|
@@ -30,7 +30,7 @@ export declare const UserPropService: (props: UserPropServiceProps) => {
|
|
|
30
30
|
istrash: boolean | null;
|
|
31
31
|
accountid: bigint;
|
|
32
32
|
user_id: bigint | null;
|
|
33
|
-
|
|
33
|
+
user_prop_id: bigint;
|
|
34
34
|
props_value: string | null;
|
|
35
35
|
props_id: bigint;
|
|
36
36
|
props_numeric: Prisma.Decimal;
|
package/package.json
CHANGED
package/prisma/schema.prisma
CHANGED
|
@@ -288,7 +288,7 @@ model locations {
|
|
|
288
288
|
}
|
|
289
289
|
|
|
290
290
|
model user_props {
|
|
291
|
-
|
|
291
|
+
user_prop_id BigInt @id(map: "cl_user_props_pkey") @default(autoincrement())
|
|
292
292
|
user_id BigInt?
|
|
293
293
|
type String? @db.VarChar(256)
|
|
294
294
|
props_value String? @db.VarChar(256)
|