@x12i/memorix-service 3.12.3 → 3.13.0
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/README.md +2 -2
- package/dist/activity-ui.js +1 -1
- package/dist/agent-catalog.d.ts +32 -0
- package/dist/agent-catalog.d.ts.map +1 -0
- package/dist/agent-catalog.js +80 -0
- package/dist/agent-catalog.js.map +1 -0
- package/dist/analytics/engine.d.ts.map +1 -1
- package/dist/analytics/engine.js +2 -1
- package/dist/analytics/engine.js.map +1 -1
- package/dist/analytics/state.d.ts +1 -1
- package/dist/analytics/tracker.d.ts +2 -0
- package/dist/analytics/tracker.d.ts.map +1 -1
- package/dist/analytics/tracker.js +15 -8
- package/dist/analytics/tracker.js.map +1 -1
- package/dist/anomaly/catalog.d.ts +4 -0
- package/dist/anomaly/catalog.d.ts.map +1 -0
- package/dist/anomaly/catalog.js +315 -0
- package/dist/anomaly/catalog.js.map +1 -0
- package/dist/anomaly/descriptors.d.ts +11 -0
- package/dist/anomaly/descriptors.d.ts.map +1 -0
- package/dist/anomaly/descriptors.js +113 -0
- package/dist/anomaly/descriptors.js.map +1 -0
- package/dist/anomaly/index.d.ts +6 -0
- package/dist/anomaly/index.d.ts.map +1 -0
- package/dist/anomaly/index.js +5 -0
- package/dist/anomaly/index.js.map +1 -0
- package/dist/anomaly/records.d.ts +28 -0
- package/dist/anomaly/records.d.ts.map +1 -0
- package/dist/anomaly/records.js +384 -0
- package/dist/anomaly/records.js.map +1 -0
- package/dist/anomaly/types.d.ts +116 -0
- package/dist/anomaly/types.d.ts.map +1 -0
- package/dist/anomaly/types.js +24 -0
- package/dist/anomaly/types.js.map +1 -0
- package/dist/anomaly/values.d.ts +31 -0
- package/dist/anomaly/values.d.ts.map +1 -0
- package/dist/anomaly/values.js +171 -0
- package/dist/anomaly/values.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +34 -1
- package/dist/app.js.map +1 -1
- package/dist/arrivals-backfill.d.ts +23 -0
- package/dist/arrivals-backfill.d.ts.map +1 -0
- package/dist/arrivals-backfill.js +132 -0
- package/dist/arrivals-backfill.js.map +1 -0
- package/dist/arrivals-routes.d.ts +8 -0
- package/dist/arrivals-routes.d.ts.map +1 -0
- package/dist/arrivals-routes.js +17 -0
- package/dist/arrivals-routes.js.map +1 -0
- package/dist/arrivals-ui.d.ts +3 -0
- package/dist/arrivals-ui.d.ts.map +1 -0
- package/dist/arrivals-ui.js +277 -0
- package/dist/arrivals-ui.js.map +1 -0
- package/dist/catalog-bridge.d.ts +18 -0
- package/dist/catalog-bridge.d.ts.map +1 -1
- package/dist/catalog-bridge.js +115 -7
- package/dist/catalog-bridge.js.map +1 -1
- package/dist/catalog-live-ui.js +1 -1
- package/dist/content-arrivals-countex.d.ts +90 -0
- package/dist/content-arrivals-countex.d.ts.map +1 -0
- package/dist/content-arrivals-countex.js +252 -0
- package/dist/content-arrivals-countex.js.map +1 -0
- package/dist/data-changes-ui.js +1 -1
- package/dist/data-changes.d.ts +3 -0
- package/dist/data-changes.d.ts.map +1 -1
- package/dist/data-changes.js +22 -21
- package/dist/data-changes.js.map +1 -1
- package/dist/errors.d.ts +6 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +22 -2
- package/dist/errors.js.map +1 -1
- package/dist/hooks-live-ui.js +1 -1
- package/dist/knowledge-upstream.d.ts +32 -0
- package/dist/knowledge-upstream.d.ts.map +1 -1
- package/dist/knowledge-upstream.js +86 -2
- package/dist/knowledge-upstream.js.map +1 -1
- package/dist/land-v2-guards.d.ts +5 -12
- package/dist/land-v2-guards.d.ts.map +1 -1
- package/dist/land-v2-guards.js +10 -33
- package/dist/land-v2-guards.js.map +1 -1
- package/dist/live-ops-nav.d.ts.map +1 -1
- package/dist/live-ops-nav.js +4 -0
- package/dist/live-ops-nav.js.map +1 -1
- package/dist/mcp/nexum-tools.d.ts +1 -1
- package/dist/mcp/nexum-tools.d.ts.map +1 -1
- package/dist/mcp/nexum-tools.js +39 -22
- package/dist/mcp/nexum-tools.js.map +1 -1
- package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
- package/dist/nexum-analysis/enqueue.js +2 -1
- package/dist/nexum-analysis/enqueue.js.map +1 -1
- package/dist/nexum-analysis/knowledge-read.d.ts +45 -0
- package/dist/nexum-analysis/knowledge-read.d.ts.map +1 -0
- package/dist/nexum-analysis/knowledge-read.js +26 -0
- package/dist/nexum-analysis/knowledge-read.js.map +1 -0
- package/dist/nexum-analysis/outbox.d.ts +1 -1
- package/dist/nexum-analysis/reconcile.d.ts.map +1 -1
- package/dist/nexum-analysis/reconcile.js +3 -2
- package/dist/nexum-analysis/reconcile.js.map +1 -1
- package/dist/openapi/openapi.json +18354 -17673
- package/dist/operational-db.d.ts +2 -2
- package/dist/operational-db.d.ts.map +1 -1
- package/dist/operational-db.js +8 -11
- package/dist/operational-db.js.map +1 -1
- package/dist/patches/access.d.ts +15 -0
- package/dist/patches/access.d.ts.map +1 -0
- package/dist/patches/access.js +27 -0
- package/dist/patches/access.js.map +1 -0
- package/dist/patches/engine.d.ts +67 -0
- package/dist/patches/engine.d.ts.map +1 -0
- package/dist/patches/engine.js +966 -0
- package/dist/patches/engine.js.map +1 -0
- package/dist/patches/guards.d.ts +23 -0
- package/dist/patches/guards.d.ts.map +1 -0
- package/dist/patches/guards.js +77 -0
- package/dist/patches/guards.js.map +1 -0
- package/dist/patches/legacy-rows.d.ts +56 -0
- package/dist/patches/legacy-rows.d.ts.map +1 -0
- package/dist/patches/legacy-rows.js +162 -0
- package/dist/patches/legacy-rows.js.map +1 -0
- package/dist/patches/ops.d.ts +24 -0
- package/dist/patches/ops.d.ts.map +1 -0
- package/dist/patches/ops.js +204 -0
- package/dist/patches/ops.js.map +1 -0
- package/dist/patches/parse.d.ts +5 -0
- package/dist/patches/parse.d.ts.map +1 -0
- package/dist/patches/parse.js +323 -0
- package/dist/patches/parse.js.map +1 -0
- package/dist/patches/paths.d.ts +38 -0
- package/dist/patches/paths.d.ts.map +1 -0
- package/dist/patches/paths.js +204 -0
- package/dist/patches/paths.js.map +1 -0
- package/dist/patches/service.d.ts +16 -0
- package/dist/patches/service.d.ts.map +1 -0
- package/dist/patches/service.js +128 -0
- package/dist/patches/service.js.map +1 -0
- package/dist/patches/store.d.ts +87 -0
- package/dist/patches/store.d.ts.map +1 -0
- package/dist/patches/store.js +27 -0
- package/dist/patches/store.js.map +1 -0
- package/dist/patches/types.d.ts +112 -0
- package/dist/patches/types.d.ts.map +1 -0
- package/dist/patches/types.js +5 -0
- package/dist/patches/types.js.map +1 -0
- package/dist/platform.d.ts +17 -3
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +114 -11
- package/dist/platform.js.map +1 -1
- package/dist/routes/anomaly.d.ts +5 -0
- package/dist/routes/anomaly.d.ts.map +1 -0
- package/dist/routes/anomaly.js +308 -0
- package/dist/routes/anomaly.js.map +1 -0
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +252 -210
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/knowledge.d.ts.map +1 -1
- package/dist/routes/knowledge.js +6 -22
- package/dist/routes/knowledge.js.map +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +2 -4
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/metadata.d.ts.map +1 -1
- package/dist/routes/metadata.js +40 -1
- package/dist/routes/metadata.js.map +1 -1
- package/dist/routes/mgc-landing.d.ts.map +1 -1
- package/dist/routes/mgc-landing.js +64 -94
- package/dist/routes/mgc-landing.js.map +1 -1
- package/dist/routes/patches.d.ts +7 -0
- package/dist/routes/patches.d.ts.map +1 -0
- package/dist/routes/patches.js +111 -0
- package/dist/routes/patches.js.map +1 -0
- package/dist/routes/subject-roots-backfill.d.ts +4 -0
- package/dist/routes/subject-roots-backfill.d.ts.map +1 -0
- package/dist/routes/subject-roots-backfill.js +15 -0
- package/dist/routes/subject-roots-backfill.js.map +1 -0
- package/dist/routes/workflow.d.ts.map +1 -1
- package/dist/routes/workflow.js +4 -10
- package/dist/routes/workflow.js.map +1 -1
- package/dist/single-read-discriminator.d.ts +17 -0
- package/dist/single-read-discriminator.d.ts.map +1 -0
- package/dist/single-read-discriminator.js +67 -0
- package/dist/single-read-discriminator.js.map +1 -0
- package/dist/subject-roots-backfill.d.ts +24 -0
- package/dist/subject-roots-backfill.d.ts.map +1 -0
- package/dist/subject-roots-backfill.js +133 -0
- package/dist/subject-roots-backfill.js.map +1 -0
- package/dist/write-precondition.d.ts +5 -1
- package/dist/write-precondition.d.ts.map +1 -1
- package/dist/write-precondition.js +11 -3
- package/dist/write-precondition.js.map +1 -1
- package/dist/writes/content-write.d.ts +170 -0
- package/dist/writes/content-write.d.ts.map +1 -0
- package/dist/writes/content-write.js +569 -0
- package/dist/writes/content-write.js.map +1 -0
- package/dist/writes/effects.d.ts +13 -0
- package/dist/writes/effects.d.ts.map +1 -0
- package/dist/writes/effects.js +28 -0
- package/dist/writes/effects.js.map +1 -0
- package/dist/writes/error-shape.d.ts +11 -0
- package/dist/writes/error-shape.d.ts.map +1 -0
- package/dist/writes/error-shape.js +100 -0
- package/dist/writes/error-shape.js.map +1 -0
- package/dist/writes/receipt-store.d.ts +81 -0
- package/dist/writes/receipt-store.d.ts.map +1 -0
- package/dist/writes/receipt-store.js +171 -0
- package/dist/writes/receipt-store.js.map +1 -0
- package/dist/writes/worker.d.ts +9 -0
- package/dist/writes/worker.d.ts.map +1 -0
- package/dist/writes/worker.js +20 -0
- package/dist/writes/worker.js.map +1 -0
- package/openapi/openapi.json +18354 -17673
- package/package.json +4 -4
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { resolveScope } from "../request-scope.js";
|
|
2
|
+
import { requireDeploymentAccess } from "../access-gate.js";
|
|
3
|
+
import { requireCaller } from "../caller-identity.js";
|
|
4
|
+
import { ServiceError } from "../errors.js";
|
|
5
|
+
import { parsePatchRequest } from "../patches/parse.js";
|
|
6
|
+
import { assertPatchOwnership } from "../patches/access.js";
|
|
7
|
+
import { patchEngineDeps } from "../patches/service.js";
|
|
8
|
+
import { applyPatch, getPatchStatus, listPatchRecords, listPatches, loadPatchForAccess, planPatch, removePatchGuards, revertPatch, } from "../patches/engine.js";
|
|
9
|
+
function patchIdOf(req) {
|
|
10
|
+
const patchId = req.params.patchId?.trim() ?? "";
|
|
11
|
+
if (!patchId)
|
|
12
|
+
throw new ServiceError("PATCH_INVALID", "patchId required", 400, { field: "patchId" });
|
|
13
|
+
return patchId;
|
|
14
|
+
}
|
|
15
|
+
function limitOf(raw) {
|
|
16
|
+
if (raw === undefined || raw === "")
|
|
17
|
+
return undefined;
|
|
18
|
+
const n = Number(raw);
|
|
19
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
20
|
+
throw new ServiceError("VALIDATION", "limit must be a positive integer", 400, { field: "limit" });
|
|
21
|
+
}
|
|
22
|
+
return n;
|
|
23
|
+
}
|
|
24
|
+
export async function registerPatchRoutes(app, platform) {
|
|
25
|
+
const context = async (req, access) => {
|
|
26
|
+
requireDeploymentAccess(req, access);
|
|
27
|
+
const scope = resolveScope(req);
|
|
28
|
+
const caller = requireCaller(req);
|
|
29
|
+
const deps = patchEngineDeps(platform, scope, caller);
|
|
30
|
+
const owns = (objectType, contentTypes) => assertPatchOwnership({
|
|
31
|
+
metadata: platform.metadata,
|
|
32
|
+
agentIds: deps.scope.agentIds,
|
|
33
|
+
caller,
|
|
34
|
+
objectType,
|
|
35
|
+
contentTypes,
|
|
36
|
+
});
|
|
37
|
+
return { scope, caller, deps, owns };
|
|
38
|
+
};
|
|
39
|
+
/** The stored patch must belong to content the caller's agents write. */
|
|
40
|
+
const ownedPatch = async (deps, owns, patchId) => {
|
|
41
|
+
const doc = await loadPatchForAccess(deps, patchId);
|
|
42
|
+
owns(doc.objectType, doc.contentTypes);
|
|
43
|
+
return doc;
|
|
44
|
+
};
|
|
45
|
+
app.post("/api/data/patches", async (req) => {
|
|
46
|
+
const { deps, owns } = await context(req, "write");
|
|
47
|
+
const request = parsePatchRequest(req.body);
|
|
48
|
+
owns(request.select.objectType, request.select.contentTypes);
|
|
49
|
+
return planPatch(deps, request);
|
|
50
|
+
});
|
|
51
|
+
app.get("/api/data/patches", async (req) => {
|
|
52
|
+
const { deps, owns } = await context(req, "read");
|
|
53
|
+
const q = (req.query ?? {});
|
|
54
|
+
const listed = (await listPatches(deps, {
|
|
55
|
+
...(q.objectType ? { objectType: q.objectType } : {}),
|
|
56
|
+
...(q.state ? { state: q.state } : {}),
|
|
57
|
+
limit: limitOf(q.limit),
|
|
58
|
+
}));
|
|
59
|
+
return {
|
|
60
|
+
items: listed.items.filter((item) => {
|
|
61
|
+
try {
|
|
62
|
+
owns(item.objectType, item.contentTypes);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
app.get("/api/data/patches/:patchId", async (req) => {
|
|
72
|
+
const { deps, owns } = await context(req, "read");
|
|
73
|
+
const patchId = patchIdOf(req);
|
|
74
|
+
await ownedPatch(deps, owns, patchId);
|
|
75
|
+
return getPatchStatus(deps, patchId);
|
|
76
|
+
});
|
|
77
|
+
app.get("/api/data/patches/:patchId/records", async (req) => {
|
|
78
|
+
const { deps, owns } = await context(req, "read");
|
|
79
|
+
const patchId = patchIdOf(req);
|
|
80
|
+
await ownedPatch(deps, owns, patchId);
|
|
81
|
+
const q = (req.query ?? {});
|
|
82
|
+
return listPatchRecords(deps, patchId, {
|
|
83
|
+
...(q.outcome ? { outcome: q.outcome } : {}),
|
|
84
|
+
...(q.cursor ? { cursor: q.cursor } : {}),
|
|
85
|
+
limit: limitOf(q.limit),
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
app.post("/api/data/patches/:patchId/apply", async (req, reply) => {
|
|
89
|
+
const { scope, deps, owns } = await context(req, "write");
|
|
90
|
+
const patchId = patchIdOf(req);
|
|
91
|
+
await ownedPatch(deps, owns, patchId);
|
|
92
|
+
await platform.analytics?.prepare(scope.orgId);
|
|
93
|
+
const out = await applyPatch(deps, patchId, req.body);
|
|
94
|
+
return reply.code(out.httpStatus).send(out.body);
|
|
95
|
+
});
|
|
96
|
+
app.post("/api/data/patches/:patchId/revert", async (req, reply) => {
|
|
97
|
+
const { scope, deps, owns } = await context(req, "write");
|
|
98
|
+
const patchId = patchIdOf(req);
|
|
99
|
+
await ownedPatch(deps, owns, patchId);
|
|
100
|
+
await platform.analytics?.prepare(scope.orgId);
|
|
101
|
+
const out = await revertPatch(deps, patchId, req.body);
|
|
102
|
+
return reply.code(out.httpStatus).send(out.body);
|
|
103
|
+
});
|
|
104
|
+
app.delete("/api/data/patches/:patchId/guards", async (req) => {
|
|
105
|
+
const { deps, owns } = await context(req, "write");
|
|
106
|
+
const patchId = patchIdOf(req);
|
|
107
|
+
await ownedPatch(deps, owns, patchId);
|
|
108
|
+
return removePatchGuards(deps, patchId);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=patches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patches.js","sourceRoot":"","sources":["../../src/routes/patches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { MemorixPlatform } from "../platform.js";
|
|
3
|
+
export declare function registerSubjectRootsBackfillRoutes(app: FastifyInstance, platform: MemorixPlatform): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=subject-roots-backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-roots-backfill.d.ts","sourceRoot":"","sources":["../../src/routes/subject-roots-backfill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAQtD,wBAAsB,kCAAkC,CACtD,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { requireDeploymentAccess } from "../access-gate.js";
|
|
2
|
+
import { ServiceError } from "../errors.js";
|
|
3
|
+
import { parseSubjectRootsBackfillRequest, runSubjectRootsBackfill, } from "../subject-roots-backfill.js";
|
|
4
|
+
export async function registerSubjectRootsBackfillRoutes(app, platform) {
|
|
5
|
+
app.post("/api/admin/content/relocate-roots", async (req) => {
|
|
6
|
+
requireDeploymentAccess(req, "write");
|
|
7
|
+
const request = parseSubjectRootsBackfillRequest(req.body);
|
|
8
|
+
const client = platform.getMongoClient();
|
|
9
|
+
if (!client) {
|
|
10
|
+
throw new ServiceError("BACKFILL_UNAVAILABLE", "scope and context backfill requires a connected Mongo deployment", 503);
|
|
11
|
+
}
|
|
12
|
+
return runSubjectRootsBackfill(client, request, new Date().toISOString());
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=subject-roots-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-roots-backfill.js","sourceRoot":"","sources":["../../src/routes/subject-roots-backfill.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,gCAAgC,EAChC,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,GAAoB,EACpB,QAAyB;IAEzB,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1D,uBAAuB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,gCAAgC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,YAAY,CACpB,sBAAsB,EACtB,kEAAkE,EAClE,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAuHf"}
|
package/dist/routes/workflow.js
CHANGED
|
@@ -2,7 +2,7 @@ import { resolveScope } from "../request-scope.js";
|
|
|
2
2
|
import { ServiceError } from "../errors.js";
|
|
3
3
|
import { resolveWorkflowObjectType } from "../land-v2-guards.js";
|
|
4
4
|
export async function registerWorkflowRoutes(app, platform) {
|
|
5
|
-
app.get("/api/workflow", async (req
|
|
5
|
+
app.get("/api/workflow", async (req) => {
|
|
6
6
|
const scope = resolveScope(req);
|
|
7
7
|
const q = req.query;
|
|
8
8
|
if (!q.id) {
|
|
@@ -14,9 +14,7 @@ export async function registerWorkflowRoutes(app, platform) {
|
|
|
14
14
|
currentRevision: null,
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
-
const
|
|
18
|
-
if (deprecated)
|
|
19
|
-
reply.header("Deprecation", deprecated);
|
|
17
|
+
const objectType = resolveWorkflowObjectType(q.objectType);
|
|
20
18
|
const ports = platform.portsFor(scope);
|
|
21
19
|
const record = await ports.reader.getContent(scope, {
|
|
22
20
|
objectType,
|
|
@@ -30,18 +28,15 @@ export async function registerWorkflowRoutes(app, platform) {
|
|
|
30
28
|
contentType: "workflow",
|
|
31
29
|
record,
|
|
32
30
|
currentRevision: record.revision,
|
|
33
|
-
...(deprecated ? { deprecation: deprecated } : {}),
|
|
34
31
|
};
|
|
35
32
|
});
|
|
36
|
-
app.put("/api/workflow", async (req
|
|
33
|
+
app.put("/api/workflow", async (req) => {
|
|
37
34
|
const scope = resolveScope(req);
|
|
38
35
|
const body = req.body;
|
|
39
36
|
if (!body?.id || !body.record) {
|
|
40
37
|
throw new ServiceError("VALIDATION", "id and record required", 400);
|
|
41
38
|
}
|
|
42
|
-
const
|
|
43
|
-
if (deprecated)
|
|
44
|
-
reply.header("Deprecation", deprecated);
|
|
39
|
+
const objectType = resolveWorkflowObjectType(body.objectType);
|
|
45
40
|
if (body.currentRevision !== undefined &&
|
|
46
41
|
body.expectedRevision !== undefined &&
|
|
47
42
|
body.currentRevision !== body.expectedRevision) {
|
|
@@ -98,7 +93,6 @@ export async function registerWorkflowRoutes(app, platform) {
|
|
|
98
93
|
status: "accepted",
|
|
99
94
|
conflict: false,
|
|
100
95
|
result,
|
|
101
|
-
...(deprecated ? { deprecation: deprecated } : {}),
|
|
102
96
|
};
|
|
103
97
|
}
|
|
104
98
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAoB,EACpB,QAAyB;IAEzB,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/routes/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SafeFilter } from "./safe-query.js";
|
|
2
|
+
/**
|
|
3
|
+
* The value that picks one instance of a discriminated content type.
|
|
4
|
+
* `filter` may only carry an `eq` on the discriminator path; any other filter
|
|
5
|
+
* with `recordId` is READ_QUERY_INVALID instead of being dropped.
|
|
6
|
+
*/
|
|
7
|
+
export declare function singleReadDiscriminatorValue(args: {
|
|
8
|
+
discriminatorValue?: string;
|
|
9
|
+
filters?: SafeFilter[];
|
|
10
|
+
discriminatorPath?: string;
|
|
11
|
+
}): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* READ_DISCRIMINATOR_REQUIRED names the query parameter that supplies the value
|
|
14
|
+
* and, when the pack declares them, the values it accepts.
|
|
15
|
+
*/
|
|
16
|
+
export declare function withDiscriminatorHelp(err: unknown, allowedValues: () => string[] | undefined): unknown;
|
|
17
|
+
//# sourceMappingURL=single-read-discriminator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-read-discriminator.d.ts","sourceRoot":"","sources":["../src/single-read-discriminator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,GAAG,SAAS,CA8CrB;AAQD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,MAAM,MAAM,EAAE,GAAG,SAAS,GACxC,OAAO,CAiBT"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discriminator selection for single-record reads (`recordId` set) on
|
|
3
|
+
* GET /api/data/content and GET /api/data/content/context.
|
|
4
|
+
*/
|
|
5
|
+
import { ServiceError } from "./errors.js";
|
|
6
|
+
/**
|
|
7
|
+
* The value that picks one instance of a discriminated content type.
|
|
8
|
+
* `filter` may only carry an `eq` on the discriminator path; any other filter
|
|
9
|
+
* with `recordId` is READ_QUERY_INVALID instead of being dropped.
|
|
10
|
+
*/
|
|
11
|
+
export function singleReadDiscriminatorValue(args) {
|
|
12
|
+
const explicit = args.discriminatorValue?.trim() || undefined;
|
|
13
|
+
if (!args.filters?.length)
|
|
14
|
+
return explicit;
|
|
15
|
+
const path = args.discriminatorPath;
|
|
16
|
+
const fromFilter = new Set();
|
|
17
|
+
const unused = [];
|
|
18
|
+
for (const f of args.filters) {
|
|
19
|
+
if (path && f.field === path && f.op === "eq" && typeof f.value === "string" && f.value.trim()) {
|
|
20
|
+
fromFilter.add(f.value.trim());
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
unused.push(f);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (unused.length) {
|
|
27
|
+
throw new ServiceError("READ_QUERY_INVALID", path
|
|
28
|
+
? `filter is not allowed with recordId. Only an eq filter on the discriminator ${path} is read; pass discriminatorValue to pick the instance.`
|
|
29
|
+
: "filter is not allowed with recordId. This content type has no discriminator; drop filter or omit recordId to list.", 400, {
|
|
30
|
+
field: "filter",
|
|
31
|
+
parameter: "filter",
|
|
32
|
+
unused,
|
|
33
|
+
...(path ? { discriminatorPath: path } : {}),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (fromFilter.size > 1) {
|
|
37
|
+
throw new ServiceError("READ_QUERY_INVALID", `filter names more than one value for ${path}; a single-record read picks one instance.`, 400, { field: "filter", parameter: "filter", discriminatorPath: path, values: [...fromFilter] });
|
|
38
|
+
}
|
|
39
|
+
const [filtered] = [...fromFilter];
|
|
40
|
+
if (explicit && filtered && explicit !== filtered) {
|
|
41
|
+
throw new ServiceError("READ_QUERY_INVALID", `discriminatorValue '${explicit}' and the filter on ${path} ('${filtered}') disagree.`, 400, { field: "discriminatorValue", parameter: "discriminatorValue", discriminatorPath: path });
|
|
42
|
+
}
|
|
43
|
+
return explicit ?? filtered;
|
|
44
|
+
}
|
|
45
|
+
function errorCode(err) {
|
|
46
|
+
return err && typeof err === "object" && typeof err.code === "string"
|
|
47
|
+
? err.code
|
|
48
|
+
: "";
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* READ_DISCRIMINATOR_REQUIRED names the query parameter that supplies the value
|
|
52
|
+
* and, when the pack declares them, the values it accepts.
|
|
53
|
+
*/
|
|
54
|
+
export function withDiscriminatorHelp(err, allowedValues) {
|
|
55
|
+
if (errorCode(err) !== "READ_DISCRIMINATOR_REQUIRED")
|
|
56
|
+
return err;
|
|
57
|
+
const raw = err.details;
|
|
58
|
+
const details = raw && typeof raw === "object" && !Array.isArray(raw) ? { ...raw } : {};
|
|
59
|
+
const declared = Array.isArray(details.allowedValues) ? undefined : allowedValues();
|
|
60
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
61
|
+
return new ServiceError("READ_DISCRIMINATOR_REQUIRED", `${message}. Pass discriminatorValue in the query string to pick the instance.`, 400, {
|
|
62
|
+
...details,
|
|
63
|
+
parameter: "discriminatorValue",
|
|
64
|
+
...(declared ? { allowedValues: declared } : {}),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=single-read-discriminator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-read-discriminator.js","sourceRoot":"","sources":["../src/single-read-discriminator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Move estate scope onto `_metadata`, context payloads onto `context`,
|
|
3
|
+
* and noise out of subject `data`.
|
|
4
|
+
* Does not patch security-map rows. Does not change revision or `_system.modifiedAt`.
|
|
5
|
+
*/
|
|
6
|
+
import type { MongoClient } from "mongodb";
|
|
7
|
+
export type SubjectRootsBackfillRequest = {
|
|
8
|
+
confirm: true;
|
|
9
|
+
dryRun: boolean;
|
|
10
|
+
includeHistory: false;
|
|
11
|
+
};
|
|
12
|
+
export type SubjectRootsBackfillResult = {
|
|
13
|
+
dryRun: boolean;
|
|
14
|
+
scanned: number;
|
|
15
|
+
wouldPatch: number;
|
|
16
|
+
unchanged: number;
|
|
17
|
+
skippedSecurityMap: number;
|
|
18
|
+
skippedInvalid: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function parseSubjectRootsBackfillRequest(body: unknown): SubjectRootsBackfillRequest;
|
|
21
|
+
export declare function runSubjectRootsBackfill(client: MongoClient, request: SubjectRootsBackfillRequest, now: string, options?: {
|
|
22
|
+
onlyOrgIds?: string[];
|
|
23
|
+
}): Promise<SubjectRootsBackfillResult>;
|
|
24
|
+
//# sourceMappingURL=subject-roots-backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-roots-backfill.d.ts","sourceRoot":"","sources":["../src/subject-roots-backfill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAc3C,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAwBF,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,OAAO,GAAG,2BAA2B,CAgB3F;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,2BAA2B,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC,OAAO,CAAC,0BAA0B,CAAC,CAuErC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { jsonMarkdown, relocateStoredSubject } from "@x12i/memorix-data";
|
|
2
|
+
import { ServiceError } from "./errors.js";
|
|
3
|
+
import { resolveObjectAndContentType } from "./data-changes.js";
|
|
4
|
+
import { normalizeOrgId } from "./scope.js";
|
|
5
|
+
const CATEGORY_SUFFIXES = ["entity", "event", "knowledge"];
|
|
6
|
+
const RESERVED_COLLECTIONS = new Set([
|
|
7
|
+
"relationships",
|
|
8
|
+
"record-directory",
|
|
9
|
+
"system.profile",
|
|
10
|
+
]);
|
|
11
|
+
function isContentCollectionName(name) {
|
|
12
|
+
if (!name || RESERVED_COLLECTIONS.has(name))
|
|
13
|
+
return false;
|
|
14
|
+
if (name.startsWith("system."))
|
|
15
|
+
return false;
|
|
16
|
+
if (name.includes("_"))
|
|
17
|
+
return false;
|
|
18
|
+
if (!name.includes("-"))
|
|
19
|
+
return false;
|
|
20
|
+
return /^[a-z][a-z0-9-]*$/.test(name);
|
|
21
|
+
}
|
|
22
|
+
function orgFromDatabase(name) {
|
|
23
|
+
for (const kind of CATEGORY_SUFFIXES) {
|
|
24
|
+
const suffix = `-memorix-${kind}`;
|
|
25
|
+
if (!name.endsWith(suffix))
|
|
26
|
+
continue;
|
|
27
|
+
const orgId = name.slice(0, -suffix.length);
|
|
28
|
+
return orgId || null;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
function isPlainObject(value) {
|
|
33
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
34
|
+
}
|
|
35
|
+
export function parseSubjectRootsBackfillRequest(body) {
|
|
36
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) {
|
|
37
|
+
throw new ServiceError("VALIDATION", "backfill body must be an object", 400);
|
|
38
|
+
}
|
|
39
|
+
const raw = body;
|
|
40
|
+
if (raw.confirm !== true) {
|
|
41
|
+
throw new ServiceError("VALIDATION", "confirm: true is required", 400);
|
|
42
|
+
}
|
|
43
|
+
if (raw.includeHistory === true) {
|
|
44
|
+
throw new ServiceError("VALIDATION", "includeHistory must be false; only the current head is patched", 400);
|
|
45
|
+
}
|
|
46
|
+
return { confirm: true, dryRun: raw.dryRun !== false, includeHistory: false };
|
|
47
|
+
}
|
|
48
|
+
export async function runSubjectRootsBackfill(client, request, now, options) {
|
|
49
|
+
const result = {
|
|
50
|
+
dryRun: request.dryRun,
|
|
51
|
+
scanned: 0,
|
|
52
|
+
wouldPatch: 0,
|
|
53
|
+
unchanged: 0,
|
|
54
|
+
skippedSecurityMap: 0,
|
|
55
|
+
skippedInvalid: 0,
|
|
56
|
+
};
|
|
57
|
+
const listed = await client.db().admin().listDatabases();
|
|
58
|
+
for (const entry of listed.databases ?? []) {
|
|
59
|
+
const databaseName = String(entry.name ?? "");
|
|
60
|
+
const orgId = orgFromDatabase(databaseName);
|
|
61
|
+
if (!orgId)
|
|
62
|
+
continue;
|
|
63
|
+
if (options?.onlyOrgIds &&
|
|
64
|
+
!options.onlyOrgIds.some((id) => normalizeOrgId(id) === normalizeOrgId(orgId))) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const objectTypes = await objectTypesFor(client, orgId);
|
|
68
|
+
const collections = await client.db(databaseName).listCollections().toArray();
|
|
69
|
+
for (const collection of collections) {
|
|
70
|
+
const collectionName = String(collection.name ?? "");
|
|
71
|
+
if (!isContentCollectionName(collectionName))
|
|
72
|
+
continue;
|
|
73
|
+
const fromName = resolveObjectAndContentType(collectionName, objectTypes);
|
|
74
|
+
const coll = client.db(databaseName).collection(collectionName);
|
|
75
|
+
const cursor = coll.find({});
|
|
76
|
+
for await (const doc of cursor) {
|
|
77
|
+
result.scanned += 1;
|
|
78
|
+
const record = doc;
|
|
79
|
+
if (!isPlainObject(record.data)) {
|
|
80
|
+
result.skippedInvalid += 1;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const objectType = typeof record.objectType === "string" ? record.objectType : fromName.objectType;
|
|
84
|
+
const contentType = typeof record.contentType === "string" ? record.contentType : fromName.contentType;
|
|
85
|
+
const relocated = relocateStoredSubject({
|
|
86
|
+
objectType,
|
|
87
|
+
contentType,
|
|
88
|
+
data: record.data,
|
|
89
|
+
metadata: isPlainObject(record._metadata) ? record._metadata : undefined,
|
|
90
|
+
context: isPlainObject(record.context) ? record.context : undefined,
|
|
91
|
+
});
|
|
92
|
+
if (relocated.skipped === "security-map") {
|
|
93
|
+
result.skippedSecurityMap += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!relocated.changed) {
|
|
97
|
+
result.unchanged += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
result.wouldPatch += 1;
|
|
101
|
+
if (request.dryRun)
|
|
102
|
+
continue;
|
|
103
|
+
const $set = { data: relocated.data };
|
|
104
|
+
if (relocated.metadata)
|
|
105
|
+
$set._metadata = relocated.metadata;
|
|
106
|
+
if (relocated.context)
|
|
107
|
+
$set.context = relocated.context;
|
|
108
|
+
if (relocated.dataChanged) {
|
|
109
|
+
const markdown = record._markdown;
|
|
110
|
+
const source = isPlainObject(markdown) ? markdown.source : undefined;
|
|
111
|
+
if (source === undefined || source === "json") {
|
|
112
|
+
$set._markdown = jsonMarkdown(relocated.data, now);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
await coll.updateOne({ _id: String(record._id) }, { $set });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
async function objectTypesFor(client, orgId) {
|
|
122
|
+
try {
|
|
123
|
+
const types = await client
|
|
124
|
+
.db(`${orgId}-memorix-operational`)
|
|
125
|
+
.collection("record-directory")
|
|
126
|
+
.distinct("objectType");
|
|
127
|
+
return types.map((type) => String(type)).filter((type) => type.length > 0);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=subject-roots-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-roots-backfill.js","sourceRoot":"","sources":["../src/subject-roots-backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
export type WireWritePrecondition = "absent" | "exact-revision" | {
|
|
1
|
+
export type WireWritePrecondition = "absent" | "exact-revision" | "none" | {
|
|
2
2
|
kind: "absent";
|
|
3
|
+
} | {
|
|
4
|
+
kind: "none";
|
|
3
5
|
} | {
|
|
4
6
|
kind: "revision";
|
|
5
7
|
revision: number;
|
|
6
8
|
};
|
|
7
9
|
export type NormalizedWritePrecondition = {
|
|
8
10
|
form: "absent";
|
|
11
|
+
} | {
|
|
12
|
+
form: "none";
|
|
9
13
|
} | {
|
|
10
14
|
form: "exact-revision";
|
|
11
15
|
expectedRevision: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-precondition.d.ts","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write-precondition.d.ts","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,gBAAgB,GAChB,MAAM,GACN;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,MAAM,2BAA2B,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,EACZ,gBAAgB,CAAC,EAAE,OAAO,GACzB,2BAA2B,CAmD7B"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Normalize POST /api/data/content write preconditions.
|
|
3
3
|
*
|
|
4
|
-
* Canonical wire form is string `"absent" | "exact-revision"` (+ `expectedRevision`
|
|
5
|
-
*
|
|
4
|
+
* Canonical wire form is string `"absent" | "exact-revision" | "none"` (+ `expectedRevision`
|
|
5
|
+
* when the precondition is exact-revision).
|
|
6
|
+
* Also accept the writer-native object form `{ kind: "absent" | "none" }` /
|
|
6
7
|
* `{ kind: "revision", revision }` so clients do not silently fall through to create.
|
|
8
|
+
* `none` creates a missing row and replaces an existing row.
|
|
7
9
|
*/
|
|
8
10
|
import { ServiceError } from "./errors.js";
|
|
9
11
|
export function normalizeWritePrecondition(raw, expectedRevision) {
|
|
10
12
|
if (raw === "absent") {
|
|
11
13
|
return { form: "absent" };
|
|
12
14
|
}
|
|
15
|
+
if (raw === "none") {
|
|
16
|
+
return { form: "none" };
|
|
17
|
+
}
|
|
13
18
|
if (raw === "exact-revision") {
|
|
14
19
|
if (expectedRevision === undefined || expectedRevision === null || expectedRevision === "") {
|
|
15
20
|
throw new ServiceError("VALIDATION", "expectedRevision required when precondition is exact-revision", 400);
|
|
@@ -25,6 +30,9 @@ export function normalizeWritePrecondition(raw, expectedRevision) {
|
|
|
25
30
|
if (kind === "absent") {
|
|
26
31
|
return { form: "absent" };
|
|
27
32
|
}
|
|
33
|
+
if (kind === "none") {
|
|
34
|
+
return { form: "none" };
|
|
35
|
+
}
|
|
28
36
|
if (kind === "revision") {
|
|
29
37
|
const fromBody = raw.revision;
|
|
30
38
|
const revision = Number(fromBody !== undefined && fromBody !== null && fromBody !== ""
|
|
@@ -36,6 +44,6 @@ export function normalizeWritePrecondition(raw, expectedRevision) {
|
|
|
36
44
|
return { form: "exact-revision", expectedRevision: revision };
|
|
37
45
|
}
|
|
38
46
|
}
|
|
39
|
-
throw new ServiceError("VALIDATION", 'precondition required: "absent" | "exact-revision" | { kind: "absent" } | { kind: "revision", revision }', 400);
|
|
47
|
+
throw new ServiceError("VALIDATION", 'precondition required: "absent" | "exact-revision" | "none" | { kind: "absent" } | { kind: "none" } | { kind: "revision", revision }', 400);
|
|
40
48
|
}
|
|
41
49
|
//# sourceMappingURL=write-precondition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-precondition.js","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"write-precondition.js","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,UAAU,0BAA0B,CACxC,GAAY,EACZ,gBAA0B;IAE1B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QAC7B,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;YAC3F,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,+DAA+D,EAC/D,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,mCAAmC,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAI,GAA0B,CAAC,IAAI,CAAC;QAC9C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAI,GAA8B,CAAC,QAAQ,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CACrB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE;gBAC5D,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,4EAA4E,EAC5E,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,sIAAsI,EACtI,GAAG,CACJ,CAAC;AACJ,CAAC"}
|