optio-api 0.2.1 → 0.2.2
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.
|
File without changes
|
|
@@ -8,7 +8,6 @@ export type ParseResult = {
|
|
|
8
8
|
};
|
|
9
9
|
export declare function parseMetadataFilterQuery(raw: unknown): ParseResult;
|
|
10
10
|
export declare function metadataFilterToMongo(filter: ProcessMetadataFilter | undefined): Record<string, unknown>;
|
|
11
|
-
export declare function isLegacyFlatFilter(filter: ProcessMetadataFilter): boolean;
|
|
12
11
|
export declare function detectLegacyMetadataParams(rawQuery: Record<string, unknown>): string[];
|
|
13
12
|
export declare function formatLegacyMetadataMessage(legacyKeys: string[]): string;
|
|
14
13
|
//# sourceMappingURL=metadata-filter-query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-filter-query.d.ts","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metadata-filter-query.d.ts","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAQlE;AAKD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,GAAG,SAAS,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAEtF;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAGxE"}
|
|
@@ -1,99 +1,25 @@
|
|
|
1
|
+
import { createMongoFilterTranslator } from 'filtrum-mongo';
|
|
1
2
|
import { MetadataFilterQueryParamSchema, } from 'optio-contracts';
|
|
2
3
|
export function parseMetadataFilterQuery(raw) {
|
|
3
|
-
if (raw === undefined || raw === null || raw === '')
|
|
4
|
+
if (raw === undefined || raw === null || raw === '')
|
|
4
5
|
return { ok: true, value: undefined };
|
|
5
|
-
|
|
6
|
-
if (typeof raw !== 'string') {
|
|
6
|
+
if (typeof raw !== 'string')
|
|
7
7
|
return { ok: false, error: 'metadataFilter must be a string' };
|
|
8
|
-
}
|
|
9
8
|
const result = MetadataFilterQueryParamSchema.safeParse(raw);
|
|
10
9
|
if (!result.success) {
|
|
11
|
-
return {
|
|
12
|
-
ok: false,
|
|
13
|
-
error: result.error.issues[0]?.message ?? 'Invalid metadataFilter',
|
|
14
|
-
};
|
|
10
|
+
return { ok: false, error: result.error.issues[0]?.message ?? 'Invalid metadataFilter' };
|
|
15
11
|
}
|
|
16
12
|
return { ok: true, value: result.data };
|
|
17
13
|
}
|
|
18
|
-
|
|
19
|
-
//
|
|
20
|
-
// fragment ready to merge into a `find` filter (or pass into an aggregation
|
|
21
|
-
// `$match`).
|
|
14
|
+
const translate = createMongoFilterTranslator({ fieldPrefix: 'metadata.' });
|
|
15
|
+
// MongoDB query fragment ready to merge into a `find` filter or an aggregation `$match`.
|
|
22
16
|
export function metadataFilterToMongo(filter) {
|
|
23
17
|
if (!filter)
|
|
24
18
|
return {};
|
|
25
|
-
|
|
26
|
-
return legacyToMongo(filter);
|
|
27
|
-
return predicateToMongo(filter);
|
|
28
|
-
}
|
|
29
|
-
// A filter is legacy iff every top-level key is a field name (not a
|
|
30
|
-
// combinator keyword) and every value is a scalar (not an operator object).
|
|
31
|
-
export function isLegacyFlatFilter(filter) {
|
|
32
|
-
for (const [k, v] of Object.entries(filter)) {
|
|
33
|
-
if (k === 'AND' || k === 'OR' || k === 'NOT')
|
|
34
|
-
return false;
|
|
35
|
-
if (v !== null && typeof v === 'object' && !Array.isArray(v))
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
function legacyToMongo(filter) {
|
|
41
|
-
const out = {};
|
|
42
|
-
for (const [k, v] of Object.entries(filter)) {
|
|
43
|
-
out[`metadata.${k}`] = v;
|
|
44
|
-
}
|
|
45
|
-
return out;
|
|
46
|
-
}
|
|
47
|
-
function predicateToMongo(p) {
|
|
48
|
-
const pp = p;
|
|
49
|
-
if (Array.isArray(pp.AND)) {
|
|
50
|
-
return { $and: pp.AND.map(predicateToMongo) };
|
|
51
|
-
}
|
|
52
|
-
if (Array.isArray(pp.OR)) {
|
|
53
|
-
return { $or: pp.OR.map(predicateToMongo) };
|
|
54
|
-
}
|
|
55
|
-
if (pp.NOT !== undefined) {
|
|
56
|
-
return { $nor: [predicateToMongo(pp.NOT)] };
|
|
57
|
-
}
|
|
58
|
-
// Record of field→leaf-ops. Single-leaf nodes emit a flat object; multi-leaf
|
|
59
|
-
// nodes split into $and of single-key objects to keep translator output regular.
|
|
60
|
-
const entries = Object.entries(pp);
|
|
61
|
-
if (entries.length === 1) {
|
|
62
|
-
const [field, ops] = entries[0];
|
|
63
|
-
return { [`metadata.${field}`]: leafOpsToMongo(ops) };
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
$and: entries.map(([field, ops]) => ({
|
|
67
|
-
[`metadata.${field}`]: leafOpsToMongo(ops),
|
|
68
|
-
})),
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
function leafOpsToMongo(ops) {
|
|
72
|
-
const m = {};
|
|
73
|
-
if (ops.eq !== undefined)
|
|
74
|
-
m.$eq = ops.eq;
|
|
75
|
-
if (ops.ne !== undefined)
|
|
76
|
-
m.$ne = ops.ne;
|
|
77
|
-
if (ops.in !== undefined)
|
|
78
|
-
m.$in = ops.in;
|
|
79
|
-
if (ops.nin !== undefined)
|
|
80
|
-
m.$nin = ops.nin;
|
|
81
|
-
if (ops.exists !== undefined)
|
|
82
|
-
m.$exists = ops.exists;
|
|
83
|
-
if (ops.gt !== undefined)
|
|
84
|
-
m.$gt = ops.gt;
|
|
85
|
-
if (ops.gte !== undefined)
|
|
86
|
-
m.$gte = ops.gte;
|
|
87
|
-
if (ops.lt !== undefined)
|
|
88
|
-
m.$lt = ops.lt;
|
|
89
|
-
if (ops.lte !== undefined)
|
|
90
|
-
m.$lte = ops.lte;
|
|
91
|
-
return m;
|
|
19
|
+
return translate(filter);
|
|
92
20
|
}
|
|
93
21
|
export function detectLegacyMetadataParams(rawQuery) {
|
|
94
|
-
return Object.keys(rawQuery)
|
|
95
|
-
.filter(k => k.startsWith('metadata.'))
|
|
96
|
-
.sort();
|
|
22
|
+
return Object.keys(rawQuery).filter((k) => k.startsWith('metadata.')).sort();
|
|
97
23
|
}
|
|
98
24
|
export function formatLegacyMetadataMessage(legacyKeys) {
|
|
99
25
|
return `Legacy 'metadata.*' query params are no longer supported. ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-filter-query.js","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,
|
|
1
|
+
{"version":3,"file":"metadata-filter-query.js","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACL,8BAA8B,GAE/B,MAAM,iBAAiB,CAAC;AAMzB,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC3F,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IAC5F,MAAM,MAAM,GAAG,8BAA8B,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,wBAAwB,EAAE,CAAC;IAC3F,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAA6B,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,SAAS,GAAG,2BAA2B,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;AAE5E,yFAAyF;AACzF,MAAM,UAAU,qBAAqB,CACnC,MAAyC;IAEzC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,SAAS,CAAC,MAAM,CAA4B,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAiC;IAC1E,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAAoB;IAC9D,OAAO,4DAA4D;QACjE,2DAA2D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACvF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "optio-api",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Server-side optio API with Fastify, Express, and Next.js adapters.",
|
|
6
6
|
"repository": {
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
"ioredis": "^5.4.0",
|
|
50
50
|
"mongodb": "^6.12.0",
|
|
51
51
|
"zod": "^3",
|
|
52
|
-
"
|
|
52
|
+
"filtrum-mongo": "0.1.0",
|
|
53
|
+
"optio-contracts": "0.2.4"
|
|
53
54
|
},
|
|
54
55
|
"optionalDependencies": {
|
|
55
56
|
"@ts-rest/fastify": "^3.51.0"
|