@open-mercato/shared 0.6.8-develop.6878.1.ab817e58ac → 0.6.8-develop.6879.1.9883cf6265
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/crud/factory.js +19 -7
- package/dist/lib/crud/factory.js.map +2 -2
- package/dist/lib/version.js +1 -1
- package/dist/lib/version.js.map +1 -1
- package/package.json +2 -2
- package/src/lib/crud/__tests__/crud-factory.test.ts +101 -0
- package/src/lib/crud/factory.ts +48 -7
- package/src/lib/query/__tests__/engine.test.ts +86 -0
package/dist/lib/crud/factory.js
CHANGED
|
@@ -54,10 +54,11 @@ import { registerOptimisticLockReaderIfAbsent } from "./optimistic-lock-store.js
|
|
|
54
54
|
import { createLogger } from "../logger/index.js";
|
|
55
55
|
import { isTransientDbError } from "../db/pg-errors.js";
|
|
56
56
|
const logger = createLogger("shared").child({ component: "crud" });
|
|
57
|
-
function resolveSortParams(queryParams) {
|
|
58
|
-
const rawSortField = queryParams.sortField ?? queryParams.sort
|
|
59
|
-
const
|
|
60
|
-
const sortField =
|
|
57
|
+
function resolveSortParams(queryParams, defaultSort) {
|
|
58
|
+
const rawSortField = queryParams.sortField ?? queryParams.sort;
|
|
59
|
+
const requestedSortField = typeof rawSortField === "string" && rawSortField.trim().length > 0 ? rawSortField.trim() : null;
|
|
60
|
+
const sortField = requestedSortField ?? defaultSort?.field ?? "id";
|
|
61
|
+
const rawSortDir = queryParams.sortDir ?? queryParams.order ?? (requestedSortField ? "asc" : defaultSort?.dir ?? "asc");
|
|
61
62
|
const normalizedDir = typeof rawSortDir === "string" ? rawSortDir.trim().toLowerCase() : "asc";
|
|
62
63
|
const sortDir = normalizedDir === "desc" ? SortDir.Desc : SortDir.Asc;
|
|
63
64
|
return { sortField, sortDir };
|
|
@@ -1167,10 +1168,21 @@ function makeCrudRoute(opts) {
|
|
|
1167
1168
|
profiler.mark("query_engine_prepare");
|
|
1168
1169
|
const qe = ctx.container.resolve("queryEngine");
|
|
1169
1170
|
profiler.mark("query_engine_resolved");
|
|
1170
|
-
const
|
|
1171
|
-
const
|
|
1172
|
-
|
|
1171
|
+
const sortFieldMap = opts.list.sortFieldMap;
|
|
1172
|
+
const resolveSortSelector = (field) => {
|
|
1173
|
+
const mapped = sortFieldMap && sortFieldMap[field] || field;
|
|
1174
|
+
return typeof mapped === "string" ? normalizeSortFieldSelector(mapped) : mapped;
|
|
1175
|
+
};
|
|
1176
|
+
const { sortField: sortFieldRaw, sortDir: sortDirRaw } = resolveSortParams(
|
|
1177
|
+
queryParams,
|
|
1178
|
+
opts.list.defaultSort
|
|
1179
|
+
);
|
|
1180
|
+
const sortField = resolveSortSelector(sortFieldRaw);
|
|
1173
1181
|
const sort = [{ field: sortField, dir: sortDirRaw }];
|
|
1182
|
+
if (opts.list.tiebreakSortField) {
|
|
1183
|
+
const tiebreakField = resolveSortSelector(opts.list.tiebreakSortField);
|
|
1184
|
+
if (tiebreakField !== sortField) sort.push({ field: tiebreakField, dir: SortDir.Asc });
|
|
1185
|
+
}
|
|
1174
1186
|
const page = exportRequested ? { page: 1, pageSize: exportPageSize } : { page: requestedPage, pageSize: requestedPageSize };
|
|
1175
1187
|
const baseFilters = exportFullRequested ? {} : opts.list.buildFilters ? await opts.list.buildFilters(validated, ctx) : {};
|
|
1176
1188
|
const filters = exportFullRequested ? baseFilters : mergeAdvancedFilters(baseFilters, validated);
|