@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.
@@ -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 ?? "id";
59
- const rawSortDir = queryParams.sortDir ?? queryParams.order ?? "asc";
60
- const sortField = typeof rawSortField === "string" && rawSortField.trim().length > 0 ? rawSortField.trim() : "id";
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 { sortField: sortFieldRaw, sortDir: sortDirRaw } = resolveSortParams(queryParams);
1171
- const mappedSortField = opts.list.sortFieldMap && opts.list.sortFieldMap[sortFieldRaw] || sortFieldRaw;
1172
- const sortField = typeof mappedSortField === "string" ? normalizeSortFieldSelector(mappedSortField) : mappedSortField;
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);