@sixb/sqlite 0.1.13 → 0.1.15
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/auth-storage/auth-storage.d.ts +2 -1
- package/dist/auth-storage/auth-storage.d.ts.map +1 -1
- package/dist/auth-storage/rows.d.ts +1 -1
- package/dist/auth-storage/rows.d.ts.map +1 -1
- package/dist/index.js +726 -286
- package/dist/index.js.map +12 -12
- package/dist/latest-run-query.d.ts +2 -0
- package/dist/latest-run-query.d.ts.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/ontology-storage/materialization-state.d.ts.map +1 -1
- package/dist/ontology-storage/shared.d.ts +11 -8
- package/dist/ontology-storage/shared.d.ts.map +1 -1
- package/dist/ontology-storage/source-cleanup.d.ts +7 -1
- package/dist/ontology-storage/source-cleanup.d.ts.map +1 -1
- package/dist/ontology-storage/source-roots.d.ts +14 -2
- package/dist/ontology-storage/source-roots.d.ts.map +1 -1
- package/dist/ontology-storage/sources.d.ts +8 -3
- package/dist/ontology-storage/sources.d.ts.map +1 -1
- package/dist/projection-run-storage.d.ts +3 -1
- package/dist/projection-run-storage.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/auth-storage/auth-storage.ts +44 -79
- package/src/auth-storage/rows.ts +1 -1
- package/src/latest-run-query.ts +8 -2
- package/src/migrations/050-directory-group-memberships.sql +21 -0
- package/src/migrations/051-projection-run-supersession.sql +126 -0
- package/src/migrations/052-compact-source-storage.sql +181 -0
- package/src/migrations.ts +42 -0
- package/src/ontology-storage/materialization-state.ts +34 -44
- package/src/ontology-storage/shared.ts +20 -11
- package/src/ontology-storage/source-cleanup.ts +61 -24
- package/src/ontology-storage/source-roots.ts +166 -110
- package/src/ontology-storage/sources.ts +169 -118
- package/src/projection-run-storage.ts +59 -1
|
@@ -17,6 +17,8 @@ export declare function queryLatestRunsByOwnerId<TRow>(input: {
|
|
|
17
17
|
readonly ownerIds: readonly string[];
|
|
18
18
|
readonly projectId: string;
|
|
19
19
|
readonly ownerIdFor: (row: TRow) => string;
|
|
20
|
+
/** A status that never counts as the latest run, such as a run made stale by a newer one. */
|
|
21
|
+
readonly excludedStatus?: string;
|
|
20
22
|
} & SqliteLatestRunTarget): readonly TRow[];
|
|
21
23
|
export {};
|
|
22
24
|
//# sourceMappingURL=latest-run-query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"latest-run-query.d.ts","sourceRoot":"","sources":["../src/latest-run-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C,KAAK,qBAAqB,GACtB;IAAE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAA;CAAE,GACpE;IAAE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAA;CAAE,CAAA;AAEhF,wBAAgB,wBAAwB,CAAC,IAAI,EAC3C,KAAK,EAAE;IACL,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"latest-run-query.d.ts","sourceRoot":"","sources":["../src/latest-run-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C,KAAK,qBAAqB,GACtB;IAAE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAA;CAAE,GACpE;IAAE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAA;CAAE,CAAA;AAEhF,wBAAgB,wBAAwB,CAAC,IAAI,EAC3C,KAAK,EAAE;IACL,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAA;IAC1C,6FAA6F;IAC7F,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC,GAAG,qBAAqB,GACxB,SAAS,IAAI,EAAE,CA0CjB"}
|
package/dist/migrations.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAGV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACrB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAGV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACrB,MAAM,oBAAoB,CAAA;AA8H3B,eAAO,MAAM,yBAAyB,sBAAsB,CAAA;AAC5D,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD,eAAO,MAAM,uBAAuB,wBA6GlC,CAAA;AAEF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAQ9E;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC1C,OAAO,GAAE,oBAAyB,GACjC,aAAa,CAAC,QAAQ,CAAC,CAEzB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAS3D;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE,CAOzF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;CAC5C,GAAG,eAAe,CAoBlB;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialization-state.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/materialization-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAGV,eAAe,EACf,iBAAiB,EAEjB,kBAAkB,EACnB,MAAM,qCAAqC,CAAA;AAe5C,OAAO,KAAK,EACV,gCAAgC,EAChC,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,EAO5B,oBAAoB,EACrB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"materialization-state.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/materialization-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ export interface SqliteOntologyCommitRow {
|
|
|
23
23
|
readonly committed_at: string;
|
|
24
24
|
}
|
|
25
25
|
export interface SqliteOntologySourceRow {
|
|
26
|
+
readonly version_id: number;
|
|
26
27
|
readonly project_id: string;
|
|
27
28
|
readonly source_id: string;
|
|
28
29
|
readonly materialization_id: string;
|
|
@@ -48,19 +49,21 @@ export interface SqliteOntologySourceRow {
|
|
|
48
49
|
readonly last_commit_id: string | null;
|
|
49
50
|
readonly updated_at: string;
|
|
50
51
|
}
|
|
52
|
+
/** An assertion with its root and version, as `SOURCE_ASSERTION_COLUMNS` selects it. */
|
|
51
53
|
export interface SqliteOntologySourceAssertionRow {
|
|
52
|
-
readonly project_id: string;
|
|
53
54
|
readonly source_id: string;
|
|
54
55
|
readonly materialization_id: string;
|
|
55
|
-
readonly entity_kind: "object" | "link";
|
|
56
|
-
readonly entity_key: string;
|
|
57
|
-
readonly entity_sort_key: string;
|
|
58
|
-
readonly root_kind: "object" | "link";
|
|
59
56
|
readonly root_key: string;
|
|
60
|
-
readonly root_sort_key: string;
|
|
61
57
|
readonly staging_ordinal: number;
|
|
62
|
-
readonly
|
|
63
|
-
readonly
|
|
58
|
+
readonly entity_kind: "object" | "link";
|
|
59
|
+
readonly object_type_id: string | null;
|
|
60
|
+
readonly primary_id: string | null;
|
|
61
|
+
readonly source_type_id: string | null;
|
|
62
|
+
readonly source_primary_id: string | null;
|
|
63
|
+
readonly link_id: string | null;
|
|
64
|
+
readonly target_type_id: string | null;
|
|
65
|
+
readonly target_primary_id: string | null;
|
|
66
|
+
readonly payload: string | null;
|
|
64
67
|
}
|
|
65
68
|
export interface SqliteStoredOverrideRow {
|
|
66
69
|
readonly value: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
|
-
import type { CleanupTerminalSourceMaterializationsInput, CleanupTerminalSourceMaterializationsResult } from "@sixb/core/storage";
|
|
2
|
+
import type { CleanupTerminalSourceMaterializationsInput, CleanupTerminalSourceMaterializationsResult, PurgeAbandonedSourceMaterializationsInput } from "@sixb/core/storage";
|
|
3
|
+
/**
|
|
4
|
+
* Superseded versions can still hold live roots (a delta keeps unchanged roots where they were),
|
|
5
|
+
* so they are cleaned root by root once retired. An abandoned candidate was never published:
|
|
6
|
+
* everything it holds goes, one whole version at a time, each delete on its own version prefix.
|
|
7
|
+
*/
|
|
8
|
+
export declare function purgeAbandonedSourceVersions(db: Database, input: PurgeAbandonedSourceMaterializationsInput): CleanupTerminalSourceMaterializationsResult;
|
|
3
9
|
export declare function cleanupSourceVersions(db: Database, input: CleanupTerminalSourceMaterializationsInput): CleanupTerminalSourceMaterializationsResult;
|
|
4
10
|
//# sourceMappingURL=source-cleanup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-cleanup.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/source-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EACV,0CAA0C,EAC1C,2CAA2C,
|
|
1
|
+
{"version":3,"file":"source-cleanup.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/source-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EACV,0CAA0C,EAC1C,2CAA2C,EAC3C,yCAAyC,EAC1C,MAAM,oBAAoB,CAAA;AAE3B;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,yCAAyC,GAC/C,2CAA2C,CAmC7C;AAED,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,0CAA0C,GAChD,2CAA2C,CAwC7C"}
|
|
@@ -3,19 +3,31 @@ import type { ProjectionEntityRef } from "@sixb/core/internal/materialization";
|
|
|
3
3
|
import type { SourceActivationWrite, StageSourceRowsInput } from "@sixb/core/storage";
|
|
4
4
|
import type { SqliteOntologySourceAssertionRow } from "./shared";
|
|
5
5
|
import { type SqliteOntologySourceRow } from "./shared";
|
|
6
|
-
|
|
6
|
+
/** The columns `sourceAssertion` reads, over `versions`, `roots` and `rows`. */
|
|
7
|
+
export declare const SOURCE_ASSERTION_COLUMNS = "versions.source_id, versions.materialization_id,\n roots.root_key, roots.staging_ordinal, rows.entity_kind, rows.object_type_id, rows.primary_id,\n rows.source_type_id, rows.source_primary_id, rows.link_id, rows.target_type_id,\n rows.target_primary_id, rows.payload";
|
|
8
|
+
/**
|
|
9
|
+
* Keeps `rows` to those of live roots, joined as `roots` and `versions`; binds the project id.
|
|
10
|
+
* CROSS JOIN keeps it a filter on the rows already selected: as a plain JOIN, SQLite may start
|
|
11
|
+
* from every live root of the project instead.
|
|
12
|
+
*/
|
|
13
|
+
export declare const LIVE_SOURCE_ROWS_JOIN = "\n CROSS JOIN ontology_source_roots AS roots ON roots.id = rows.root_id\n AND roots.project_id = ? AND roots.retired_at IS NULL AND roots.deleted = 0\n CROSS JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ('active', 'superseded')";
|
|
14
|
+
/** The candidate's rows, plus the rows of the live roots it may replace. */
|
|
15
|
+
export declare function replacementSourceRows(db: Database, input: {
|
|
7
16
|
readonly projectId: string;
|
|
8
17
|
readonly sourceId: string;
|
|
9
18
|
readonly materializationId: string;
|
|
10
19
|
readonly incremental: boolean;
|
|
11
20
|
}): {
|
|
12
21
|
readonly sql: string;
|
|
13
|
-
readonly values: readonly string[];
|
|
22
|
+
readonly values: readonly (string | number | null)[];
|
|
14
23
|
};
|
|
15
24
|
export declare function stageSourceRoots(db: Database, manifest: SqliteOntologySourceRow, input: StageSourceRowsInput): void;
|
|
25
|
+
/** Retires what the candidate replaces; its own roots go live when its version turns active. */
|
|
16
26
|
export declare function activateSourceRoots(db: Database, projectId: string, candidate: SqliteOntologySourceRow, activation: SourceActivationWrite): void;
|
|
17
27
|
export declare function assertSourceRootCoverage(db: Database, manifest: SqliteOntologySourceRow): void;
|
|
28
|
+
/** The live assertions of `refs`, whichever source asserts them. */
|
|
18
29
|
export declare function activeSourceRows(db: Database, projectId: string, refs: readonly ProjectionEntityRef[]): SqliteOntologySourceAssertionRow[];
|
|
30
|
+
/** The candidate's assertions of `refs`, and optionally the live ones they would replace. */
|
|
19
31
|
export declare function replacementAssertionRows(db: Database, input: {
|
|
20
32
|
projectId: string;
|
|
21
33
|
sourceId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-roots.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/source-roots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"source-roots.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/source-roots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AAU9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACrF,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAA;AAChE,OAAO,EAAiB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAatE,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,kRAGE,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,wSAIM,CAAA;AAmDxC,4EAA4E;AAC5E,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B,GACA;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;CAAE,CAsBhF;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,uBAAuB,EACjC,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAiCN;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,uBAAuB,EAClC,UAAU,EAAE,qBAAqB,GAChC,IAAI,CA8BN;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAY9F;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,mBAAmB,EAAE,GACnC,gCAAgC,EAAE,CAgBpC;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,OAAO,CAAA;IACpB,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,EAAE,SAAS,mBAAmB,EAAE,CAAA;CACrC,GACA,gCAAgC,EAAE,CAmCpC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
|
-
import type { AbandonSourceMaterializationCandidateInput, BeginSourceMaterializationInput, CleanupTerminalSourceMaterializationsInput, CleanupTerminalSourceMaterializationsResult, GetActiveOntologySourceInput, MarkSourceMaterializationReadyInput, OntologySourceRecord, OntologySourceStorage,
|
|
2
|
+
import type { AbandonRunSourceMaterializationInput, AbandonSourceMaterializationCandidateInput, AdoptedSourceMaterialization, AdoptSourceMaterializationInput, BeginSourceMaterializationInput, CleanupTerminalSourceMaterializationsInput, CleanupTerminalSourceMaterializationsResult, GetActiveOntologySourceInput, MarkSourceMaterializationReadyInput, OntologySourceRecord, OntologySourceStorage, PurgeAbandonedSourceMaterializationsInput, StageSourceRowsInput, StageSourceRowsResult, SummarizeTerminalSourceMaterializationsInput, TerminalSourceMaterializationSummary } from "@sixb/core/storage";
|
|
3
3
|
import { type SqliteRootOperation } from "./shared";
|
|
4
4
|
export declare class SqliteOntologySourceStorage implements OntologySourceStorage {
|
|
5
5
|
private readonly db;
|
|
@@ -9,14 +9,19 @@ export declare class SqliteOntologySourceStorage implements OntologySourceStorag
|
|
|
9
9
|
stageRows(input: StageSourceRowsInput): Promise<StageSourceRowsResult>;
|
|
10
10
|
markReady(input: MarkSourceMaterializationReadyInput): Promise<OntologySourceRecord>;
|
|
11
11
|
getActive(input: GetActiveOntologySourceInput): Promise<OntologySourceRecord | null>;
|
|
12
|
+
adopt(input: AdoptSourceMaterializationInput): Promise<AdoptedSourceMaterialization | null>;
|
|
12
13
|
abandon(input: AbandonSourceMaterializationCandidateInput): Promise<OntologySourceRecord>;
|
|
13
|
-
abandon(input:
|
|
14
|
+
abandon(input: AbandonRunSourceMaterializationInput): Promise<OntologySourceRecord | null>;
|
|
14
15
|
cleanupTerminal(input: CleanupTerminalSourceMaterializationsInput): Promise<CleanupTerminalSourceMaterializationsResult>;
|
|
16
|
+
purgeAbandoned(input: PurgeAbandonedSourceMaterializationsInput): Promise<CleanupTerminalSourceMaterializationsResult>;
|
|
15
17
|
summarizeTerminal(input: SummarizeTerminalSourceMaterializationsInput): Promise<TerminalSourceMaterializationSummary>;
|
|
16
18
|
private abandonCandidate;
|
|
17
|
-
|
|
19
|
+
/** The run's one staging or ready candidate, whichever execution staged it. */
|
|
20
|
+
private findRunCandidate;
|
|
21
|
+
private lastStagedOrdinal;
|
|
18
22
|
private transitionToAbandoned;
|
|
19
23
|
private assertReadyState;
|
|
24
|
+
/** Already staged assertions sharing a root or an ordinal with `rows`. */
|
|
20
25
|
private findStageRows;
|
|
21
26
|
private insertStageRows;
|
|
22
27
|
private assertExecution;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAkB1C,OAAO,KAAK,EACV,0CAA0C,
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAkB1C,OAAO,KAAK,EACV,oCAAoC,EACpC,0CAA0C,EAE1C,4BAA4B,EAC5B,+BAA+B,EAE/B,+BAA+B,EAC/B,0CAA0C,EAC1C,2CAA2C,EAC3C,4BAA4B,EAC5B,mCAAmC,EACnC,oBAAoB,EACpB,qBAAqB,EACrB,yCAAyC,EACzC,oBAAoB,EACpB,qBAAqB,EACrB,4CAA4C,EAC5C,oCAAoC,EACrC,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EASL,KAAK,mBAAmB,EAGzB,MAAM,UAAU,CAAA;AAQjB,qBAAa,2BAA4B,YAAW,qBAAqB;IAErE,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBADhB,EAAE,EAAE,QAAQ,EACZ,gBAAgB,EAAE,mBAAmB;IAGlD,oBAAoB,CACxB,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAuE1B,SAAS,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA2BtE,SAAS,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8DpF,SAAS,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAepF,KAAK,CACT,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC;IAwCzC,OAAO,CAAC,KAAK,EAAE,0CAA0C,GAAG,OAAO,CAAC,oBAAoB,CAAC;IACzF,OAAO,CAAC,KAAK,EAAE,oCAAoC,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAa1F,eAAe,CACnB,KAAK,EAAE,0CAA0C,GAChD,OAAO,CAAC,2CAA2C,CAAC;IASjD,cAAc,CAClB,KAAK,EAAE,yCAAyC,GAC/C,OAAO,CAAC,2CAA2C,CAAC;IAQjD,iBAAiB,CACrB,KAAK,EAAE,4CAA4C,GAClD,OAAO,CAAC,oCAAoC,CAAC;IAsBhD,OAAO,CAAC,gBAAgB;IAuBxB,+EAA+E;IAC/E,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAuC7B,OAAO,CAAC,gBAAgB;IA0FxB,0EAA0E;IAC1E,OAAO,CAAC,aAAa;IAkCrB,OAAO,CAAC,eAAe;IA4CvB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,eAAe;CASxB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AdvanceProjectionTelemetryCheckpointInput, ExecutionStorage, FailProjectionRunEnqueueInput, FinishProjectionRunInput, ListLatestProjectionRunsInput, ListLatestProjectionRunsResult, ListProjectionRunsInput, ListProjectionRunsResult, LockProjectionRunForMaterializationInput, ProjectionRunClaim, ProjectionRunRecord, ProjectionRunStorage, QueueProjectionRunInput, RecordProjectionMissingTargetInput, StartOrReclaimProjectionRunInput, TelemetryProjectionRunRecord, UpdateProjectionRunInput } from "@sixb/core/storage";
|
|
1
|
+
import type { AdvanceProjectionTelemetryCheckpointInput, ExecutionStorage, FailProjectionRunEnqueueInput, FindSupersedingProjectionRunInput, FinishProjectionRunInput, ListLatestProjectionRunsInput, ListLatestProjectionRunsResult, ListProjectionRunsInput, ListProjectionRunsResult, LockProjectionRunForMaterializationInput, ProjectionRunClaim, ProjectionRunRecord, ProjectionRunStorage, QueueProjectionRunInput, RecordProjectionAttemptFailureInput, RecordProjectionMissingTargetInput, StartOrReclaimProjectionRunInput, TelemetryProjectionRunRecord, UpdateProjectionRunInput } from "@sixb/core/storage";
|
|
2
2
|
import { type SqliteStoreConnection } from "./transactions";
|
|
3
3
|
export interface SqliteProjectionRunStorageOptions {
|
|
4
4
|
/** Execution lookup sharing the same provider transaction. */
|
|
@@ -18,6 +18,7 @@ export declare class SqliteProjectionRunStorage implements ProjectionRunStorage
|
|
|
18
18
|
failEnqueue(input: FailProjectionRunEnqueueInput): Promise<ProjectionRunRecord>;
|
|
19
19
|
lockForMaterialization(input: LockProjectionRunForMaterializationInput): Promise<ProjectionRunRecord>;
|
|
20
20
|
update(input: UpdateProjectionRunInput): Promise<ProjectionRunRecord>;
|
|
21
|
+
recordAttemptFailure(input: RecordProjectionAttemptFailureInput): Promise<ProjectionRunRecord>;
|
|
21
22
|
finish(input: FinishProjectionRunInput): Promise<ProjectionRunRecord>;
|
|
22
23
|
advanceTelemetryCheckpoint(input: AdvanceProjectionTelemetryCheckpointInput): Promise<TelemetryProjectionRunRecord>;
|
|
23
24
|
recordMissingTarget(input: RecordProjectionMissingTargetInput): Promise<TelemetryProjectionRunRecord>;
|
|
@@ -26,6 +27,7 @@ export declare class SqliteProjectionRunStorage implements ProjectionRunStorage
|
|
|
26
27
|
id: string;
|
|
27
28
|
}): Promise<ProjectionRunRecord | null>;
|
|
28
29
|
list(input: ListProjectionRunsInput): Promise<ListProjectionRunsResult>;
|
|
30
|
+
findSupersedingRun(input: FindSupersedingProjectionRunInput): Promise<ProjectionRunRecord | null>;
|
|
29
31
|
listLatestByProjectionIds(input: ListLatestProjectionRunsInput): Promise<ListLatestProjectionRunsResult>;
|
|
30
32
|
close(): void;
|
|
31
33
|
private assertDatasetVersionIsImmutable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection-run-storage.d.ts","sourceRoot":"","sources":["../src/projection-run-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projection-run-storage.d.ts","sourceRoot":"","sources":["../src/projection-run-storage.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EACV,yCAAyC,EACzC,gBAAgB,EAChB,6BAA6B,EAC7B,iCAAiC,EACjC,wBAAwB,EACxB,6BAA6B,EAC7B,8BAA8B,EAC9B,uBAAuB,EACvB,wBAAwB,EACxB,wCAAwC,EAExC,kBAAkB,EAElB,mBAAmB,EAEnB,oBAAoB,EACpB,uBAAuB,EACvB,mCAAmC,EACnC,kCAAkC,EAClC,gCAAgC,EAChC,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,oBAAoB,CAAA;AAI3B,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAA;AAEvB,MAAM,WAAW,iCAAiC;IAChD,8DAA8D;IAC9D,UAAU,EAAE,gBAAgB,CAAA;IAC5B,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,UAAU,CAAC,EAAE,qBAAqB,CAAA;CACnC;AAED,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;gBAEjC,OAAO,EAAE,iCAAiC;IAUhD,KAAK,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA0DnE,cAAc,CAAC,KAAK,EAAE,gCAAgC,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyDpF,WAAW,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA0B/E,sBAAsB,CAC1B,KAAK,EAAE,wCAAwC,GAC9C,OAAO,CAAC,mBAAmB,CAAC;IAIzB,MAAM,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAYrE,oBAAoB,CACxB,KAAK,EAAE,mCAAmC,GACzC,OAAO,CAAC,mBAAmB,CAAC;IAuBzB,MAAM,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAuCrE,0BAA0B,CAC9B,KAAK,EAAE,yCAAyC,GAC/C,OAAO,CAAC,4BAA4B,CAAC;IAsClC,mBAAmB,CACvB,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,4BAA4B,CAAC;IAmClC,OAAO,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAKvF,IAAI,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAmFvE,kBAAkB,CACtB,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IA0BhC,yBAAyB,CAC7B,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,8BAA8B,CAAC;IAa1C,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,+BAA+B;IAoBvC,OAAO,CAAC,YAAY;IA2CpB,OAAO,CAAC,cAAc;IA6BtB,OAAO,CAAC,+BAA+B;IAQvC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,UAAU;CAOnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sixb/sqlite",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "SQLite storage provider for Sixb",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sixb",
|
|
@@ -37,10 +37,10 @@
|
|
|
37
37
|
"prepack": "bun run build"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@sixb/core": "0.1.
|
|
40
|
+
"@sixb/core": "0.1.15"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@sixb/core": "0.1.
|
|
43
|
+
"@sixb/core": "0.1.15",
|
|
44
44
|
"@types/bun": "latest",
|
|
45
45
|
"typescript": "^5.7.0"
|
|
46
46
|
},
|
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
CompleteSignInResult,
|
|
9
9
|
DeviceAuthorizationRecord,
|
|
10
10
|
GroupMembershipRecord,
|
|
11
|
+
GroupMembershipSource,
|
|
11
12
|
InvitationRecord,
|
|
12
13
|
SessionRecord,
|
|
13
14
|
SuspendUserAndRevokeSessionsInput,
|
|
@@ -200,27 +201,6 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
200
201
|
}
|
|
201
202
|
}
|
|
202
203
|
|
|
203
|
-
if (
|
|
204
|
-
shouldCreateUser &&
|
|
205
|
-
!activeInvitation &&
|
|
206
|
-
input.allowUserCreationWithoutInvitation &&
|
|
207
|
-
input.requireNoActiveUsersForUserCreation &&
|
|
208
|
-
hasActiveUsers(this.db, projectId)
|
|
209
|
-
) {
|
|
210
|
-
consumeMagicLink(this.db, {
|
|
211
|
-
projectId,
|
|
212
|
-
id: input.magicLinkId,
|
|
213
|
-
tokenHash: input.tokenHash,
|
|
214
|
-
consumedAt: completedAt,
|
|
215
|
-
})
|
|
216
|
-
return {
|
|
217
|
-
error: new AuthStorageError(
|
|
218
|
-
"user_creation_not_allowed",
|
|
219
|
-
`[Sixb] Magic link '${input.magicLinkId}' cannot create a user for project '${projectId}'.`
|
|
220
|
-
),
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
204
|
validateCompleteSessionInput(this.db, projectId, input.session)
|
|
225
205
|
assertSignInSessionAudience(projectId, input.session.audience, magicLink.audience)
|
|
226
206
|
|
|
@@ -259,8 +239,9 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
259
239
|
projectId,
|
|
260
240
|
user,
|
|
261
241
|
})
|
|
262
|
-
const groupMemberships = this.
|
|
242
|
+
const groupMemberships = this.applyGroups({
|
|
263
243
|
completedAt,
|
|
244
|
+
source: "manual",
|
|
264
245
|
existing: invitation.groupMemberships,
|
|
265
246
|
groupIds: manualGroupIds,
|
|
266
247
|
projectId,
|
|
@@ -338,16 +319,6 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
338
319
|
}
|
|
339
320
|
}
|
|
340
321
|
|
|
341
|
-
if (!identity && userRow && (!input.autoLinkByVerifiedEmail || !input.emailVerified)) {
|
|
342
|
-
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
343
|
-
return {
|
|
344
|
-
error: new AuthStorageError(
|
|
345
|
-
"email_link_not_allowed",
|
|
346
|
-
`[Sixb] OIDC identity cannot auto-link to user '${userRow.id}' for project '${projectId}'.`
|
|
347
|
-
),
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
322
|
if (userRow?.status === "suspended") {
|
|
352
323
|
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
353
324
|
return {
|
|
@@ -358,16 +329,6 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
358
329
|
}
|
|
359
330
|
}
|
|
360
331
|
|
|
361
|
-
if (shouldCreateUser && !input.emailVerified) {
|
|
362
|
-
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
363
|
-
return {
|
|
364
|
-
error: new AuthStorageError(
|
|
365
|
-
"user_creation_not_allowed",
|
|
366
|
-
`[Sixb] OIDC authorization attempt '${input.oidcAuthorizationAttemptId}' cannot create a user for project '${projectId}'.`
|
|
367
|
-
),
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
|
|
371
332
|
if (shouldCreateUser && !activeInvitation && !input.allowUserCreationWithoutInvitation) {
|
|
372
333
|
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
373
334
|
return {
|
|
@@ -378,22 +339,6 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
378
339
|
}
|
|
379
340
|
}
|
|
380
341
|
|
|
381
|
-
if (
|
|
382
|
-
shouldCreateUser &&
|
|
383
|
-
!activeInvitation &&
|
|
384
|
-
input.allowUserCreationWithoutInvitation &&
|
|
385
|
-
input.requireNoActiveUsersForUserCreation &&
|
|
386
|
-
hasActiveUsers(this.db, projectId)
|
|
387
|
-
) {
|
|
388
|
-
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
389
|
-
return {
|
|
390
|
-
error: new AuthStorageError(
|
|
391
|
-
"user_creation_not_allowed",
|
|
392
|
-
`[Sixb] OIDC authorization attempt '${input.oidcAuthorizationAttemptId}' cannot create a user for project '${projectId}'.`
|
|
393
|
-
),
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
342
|
validateCompleteSessionInput(this.db, projectId, input.session)
|
|
398
343
|
assertSignInSessionAudience(projectId, input.session.audience, attempt.audience)
|
|
399
344
|
|
|
@@ -438,10 +383,17 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
438
383
|
projectId,
|
|
439
384
|
user,
|
|
440
385
|
})
|
|
441
|
-
const groupMemberships = this.
|
|
386
|
+
const groupMemberships = this.syncDirectoryGroups({
|
|
442
387
|
completedAt,
|
|
443
|
-
existing:
|
|
444
|
-
|
|
388
|
+
existing: this.applyGroups({
|
|
389
|
+
completedAt,
|
|
390
|
+
source: "manual",
|
|
391
|
+
existing: invitation.groupMemberships,
|
|
392
|
+
groupIds: manualGroupIds,
|
|
393
|
+
projectId,
|
|
394
|
+
userId: user.id,
|
|
395
|
+
}),
|
|
396
|
+
groupIds: input.directoryGroupIds,
|
|
445
397
|
projectId,
|
|
446
398
|
userId: user.id,
|
|
447
399
|
})
|
|
@@ -684,11 +636,12 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
684
636
|
return { invitation, groupMemberships }
|
|
685
637
|
}
|
|
686
638
|
|
|
687
|
-
private
|
|
639
|
+
private applyGroups(input: {
|
|
688
640
|
readonly completedAt: Date
|
|
689
641
|
readonly existing: readonly GroupMembershipRecord[]
|
|
690
642
|
readonly groupIds: readonly string[]
|
|
691
643
|
readonly projectId: string
|
|
644
|
+
readonly source: GroupMembershipSource
|
|
692
645
|
readonly userId: string
|
|
693
646
|
}): readonly GroupMembershipRecord[] {
|
|
694
647
|
const groupMemberships = [...input.existing]
|
|
@@ -699,7 +652,7 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
699
652
|
projectId: input.projectId,
|
|
700
653
|
userId: input.userId,
|
|
701
654
|
groupId,
|
|
702
|
-
source:
|
|
655
|
+
source: input.source,
|
|
703
656
|
createdAt: input.completedAt,
|
|
704
657
|
})
|
|
705
658
|
)
|
|
@@ -707,6 +660,34 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
707
660
|
|
|
708
661
|
return groupMemberships
|
|
709
662
|
}
|
|
663
|
+
// Directory memberships become exactly `groupIds`. A group the user already holds from another
|
|
664
|
+
// source keeps that source, and memberships from other sources are never removed.
|
|
665
|
+
private syncDirectoryGroups(input: {
|
|
666
|
+
readonly completedAt: Date
|
|
667
|
+
readonly existing: readonly GroupMembershipRecord[]
|
|
668
|
+
readonly groupIds?: readonly string[]
|
|
669
|
+
readonly projectId: string
|
|
670
|
+
readonly userId: string
|
|
671
|
+
}): readonly GroupMembershipRecord[] {
|
|
672
|
+
if (!input.groupIds) {
|
|
673
|
+
return input.existing
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
const groupIds = normalizeGroupIds(input.groupIds)
|
|
677
|
+
this.db
|
|
678
|
+
.query(
|
|
679
|
+
`
|
|
680
|
+
DELETE FROM auth_group_memberships
|
|
681
|
+
WHERE project_id = ?
|
|
682
|
+
AND user_id = ?
|
|
683
|
+
AND source = 'directory'
|
|
684
|
+
AND group_id NOT IN (${groupIds.map(() => "?").join(", ")})
|
|
685
|
+
`
|
|
686
|
+
)
|
|
687
|
+
.run(input.projectId, input.userId, ...groupIds)
|
|
688
|
+
|
|
689
|
+
return this.applyGroups({ ...input, groupIds, source: "directory" })
|
|
690
|
+
}
|
|
710
691
|
|
|
711
692
|
private createSignInSession(input: {
|
|
712
693
|
readonly projectId: string
|
|
@@ -792,22 +773,6 @@ export class SqliteAuthStorage implements AuthStorage {
|
|
|
792
773
|
}
|
|
793
774
|
}
|
|
794
775
|
|
|
795
|
-
function hasActiveUsers(db: Database, projectId: string): boolean {
|
|
796
|
-
const row = db
|
|
797
|
-
.query(
|
|
798
|
-
`
|
|
799
|
-
SELECT 1 AS active
|
|
800
|
-
FROM auth_users
|
|
801
|
-
WHERE project_id = ?
|
|
802
|
-
AND status = 'active'
|
|
803
|
-
LIMIT 1
|
|
804
|
-
`
|
|
805
|
-
)
|
|
806
|
-
.get(projectId) as { readonly active: number } | null
|
|
807
|
-
|
|
808
|
-
return row !== null
|
|
809
|
-
}
|
|
810
|
-
|
|
811
776
|
function assertSignInSessionAudience(
|
|
812
777
|
projectId: string,
|
|
813
778
|
sessionAudience: string,
|
package/src/auth-storage/rows.ts
CHANGED
|
@@ -55,7 +55,7 @@ export interface SqliteAuthServiceAccountGroupMembershipRow {
|
|
|
55
55
|
readonly project_id: string
|
|
56
56
|
readonly service_account_id: string
|
|
57
57
|
readonly group_id: string
|
|
58
|
-
readonly source:
|
|
58
|
+
readonly source: ServiceAccountGroupMembershipRecord["source"]
|
|
59
59
|
readonly created_at: string
|
|
60
60
|
}
|
|
61
61
|
|
package/src/latest-run-query.ts
CHANGED
|
@@ -13,6 +13,8 @@ export function queryLatestRunsByOwnerId<TRow>(
|
|
|
13
13
|
readonly ownerIds: readonly string[]
|
|
14
14
|
readonly projectId: string
|
|
15
15
|
readonly ownerIdFor: (row: TRow) => string
|
|
16
|
+
/** A status that never counts as the latest run, such as a run made stale by a newer one. */
|
|
17
|
+
readonly excludedStatus?: string
|
|
16
18
|
} & SqliteLatestRunTarget
|
|
17
19
|
): readonly TRow[] {
|
|
18
20
|
const ownerIds = [...new Set(input.ownerIds)]
|
|
@@ -21,6 +23,8 @@ export function queryLatestRunsByOwnerId<TRow>(
|
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
const placeholders = ownerIds.map(() => "?").join(", ")
|
|
26
|
+
const statusFilter = input.excludedStatus === undefined ? "" : " AND status <> ?"
|
|
27
|
+
const statusArgs = input.excludedStatus === undefined ? [] : [input.excludedStatus]
|
|
24
28
|
const orderColumn =
|
|
25
29
|
input.tableName === "sync_runs" ||
|
|
26
30
|
input.tableName === "pipeline_runs" ||
|
|
@@ -39,12 +43,14 @@ export function queryLatestRunsByOwnerId<TRow>(
|
|
|
39
43
|
ORDER BY ${orderColumn} DESC, id DESC
|
|
40
44
|
) AS sixb_latest_rank
|
|
41
45
|
FROM ${input.tableName}
|
|
42
|
-
WHERE project_id = ? AND ${input.ownerColumn} IN (${placeholders})
|
|
46
|
+
WHERE project_id = ? AND ${input.ownerColumn} IN (${placeholders})${statusFilter}
|
|
43
47
|
)
|
|
44
48
|
WHERE sixb_latest_rank = 1
|
|
45
49
|
`
|
|
46
50
|
)
|
|
47
|
-
.all(input.projectId, ...ownerIds) as (TRow & {
|
|
51
|
+
.all(input.projectId, ...ownerIds, ...statusArgs) as (TRow & {
|
|
52
|
+
sixb_latest_rank: SqliteValue
|
|
53
|
+
})[]
|
|
48
54
|
|
|
49
55
|
const latestByOwnerId = new Map(rows.map((row) => [input.ownerIdFor(row), row]))
|
|
50
56
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
-- A membership the identity provider owns is recorded with source 'directory' and synced to the
|
|
2
|
+
-- provider's groups on every sign-in. Service accounts never sign in, so their table is unchanged.
|
|
3
|
+
-- SQLite cannot change a CHECK constraint in place, so the table is rebuilt.
|
|
4
|
+
CREATE TABLE auth_group_memberships_next (
|
|
5
|
+
project_id TEXT NOT NULL,
|
|
6
|
+
user_id TEXT NOT NULL,
|
|
7
|
+
group_id TEXT NOT NULL,
|
|
8
|
+
source TEXT NOT NULL CHECK (source IN ('invitation', 'manual', 'agent', 'directory')),
|
|
9
|
+
created_at TEXT NOT NULL,
|
|
10
|
+
PRIMARY KEY (project_id, user_id, group_id)
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
INSERT INTO auth_group_memberships_next (project_id, user_id, group_id, source, created_at)
|
|
14
|
+
SELECT project_id, user_id, group_id, source, created_at
|
|
15
|
+
FROM auth_group_memberships;
|
|
16
|
+
|
|
17
|
+
DROP TABLE auth_group_memberships;
|
|
18
|
+
ALTER TABLE auth_group_memberships_next RENAME TO auth_group_memberships;
|
|
19
|
+
|
|
20
|
+
CREATE INDEX idx_auth_group_memberships_group
|
|
21
|
+
ON auth_group_memberships(project_id, group_id);
|