@mxpicture/gcp-functions-backend 2.1.57 → 2.1.58
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/api/BackendCrudApi.d.ts +13 -0
- package/dist/api/BackendCrudApi.d.ts.map +1 -1
- package/dist/api/BackendCrudApi.js +14 -0
- package/dist/api/BackendCrudApi.js.map +1 -1
- package/dist/api/BackendDefaultApi.d.ts +3 -3
- package/dist/api/BackendDefaultApi.d.ts.map +1 -1
- package/dist/api/BackendDefaultApi.js +6 -3
- package/dist/api/BackendDefaultApi.js.map +1 -1
- package/dist/store/cascade.d.ts +27 -0
- package/dist/store/cascade.d.ts.map +1 -0
- package/dist/store/cascade.js +27 -0
- package/dist/store/cascade.js.map +1 -0
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ApiFromRoutes, CrudRoutes, DocumentKey, ApiFilter, DocumentKeyAdmin, CreateInput, UpdateInput, UpsertInput, DocumentData } from "@mxpicture/gcp-functions-common/types";
|
|
2
2
|
import type { Store } from "../store/Store.js";
|
|
3
|
+
import type { CascadeChild } from "../store/cascade.js";
|
|
3
4
|
import type { Validation } from "../validation/Validation.js";
|
|
4
5
|
import { BackendStoreApi } from "./BackendStoreApi.js";
|
|
5
6
|
/**
|
|
@@ -17,6 +18,18 @@ export declare abstract class BackendCrudApi<STORE_DOC extends DocumentKeyAdmin,
|
|
|
17
18
|
protected abstract loadVirtualFields(doc: STORE_DOC): Promise<DTO>;
|
|
18
19
|
protected processVirtualFields(doc: DTO): Promise<STORE_DOC>;
|
|
19
20
|
protected abstract processSideEffects(current: DTO, prev: DTO | null, sideEffects: Partial<SIDE_EFFECTS>): Promise<DTO>;
|
|
21
|
+
/**
|
|
22
|
+
* Cascade-delete tree of child collections removed together with a document.
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* Defaults to no children. Generated APIs override this when a sibling
|
|
26
|
+
* decorator marks a property with `.parent(<this decorator>)`; the returned
|
|
27
|
+
* tree is honored by {@link BackendDefaultApi.delete} and
|
|
28
|
+
* {@link BackendDefaultApi.bulkDelete} via {@link cascadeDelete}.
|
|
29
|
+
*
|
|
30
|
+
* @returns The cascade tree of child collections.
|
|
31
|
+
*/
|
|
32
|
+
protected cascadeChildren(): CascadeChild[];
|
|
20
33
|
/**
|
|
21
34
|
* Delete a document by its key.
|
|
22
35
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackendCrudApi.d.ts","sourceRoot":"","sources":["../../src/api/BackendCrudApi.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackendCrudApi.d.ts","sourceRoot":"","sources":["../../src/api/BackendCrudApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,20 @@ export class BackendCrudApi extends BackendStoreApi {
|
|
|
26
26
|
delete doc[key];
|
|
27
27
|
return doc;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Cascade-delete tree of child collections removed together with a document.
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* Defaults to no children. Generated APIs override this when a sibling
|
|
34
|
+
* decorator marks a property with `.parent(<this decorator>)`; the returned
|
|
35
|
+
* tree is honored by {@link BackendDefaultApi.delete} and
|
|
36
|
+
* {@link BackendDefaultApi.bulkDelete} via {@link cascadeDelete}.
|
|
37
|
+
*
|
|
38
|
+
* @returns The cascade tree of child collections.
|
|
39
|
+
*/
|
|
40
|
+
cascadeChildren() {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
29
43
|
async toDto(doc) {
|
|
30
44
|
let cloned = toTimestampsDeep(doc, this.datePaths);
|
|
31
45
|
cloned = toDatesDeep(cloned, this.datePaths);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackendCrudApi.js","sourceRoot":"","sources":["../../src/api/BackendCrudApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"BackendCrudApi.js","sourceRoot":"","sources":["../../src/api/BackendCrudApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ import { BackendCrudApi } from "./BackendCrudApi.js";
|
|
|
25
25
|
export declare abstract class BackendDefaultApi<STORE_DOC extends DocumentKeyAdmin, DTO extends STORE_DOC, INPUT_DTO extends DocumentData = DTO, SIDE_EFFECTS extends DocumentData = DocumentData, STORE extends Store<STORE_DOC> = Store<STORE_DOC>, VAL extends Validation<INPUT_DTO> = Validation<INPUT_DTO>> extends BackendCrudApi<STORE_DOC, DTO, INPUT_DTO, SIDE_EFFECTS, STORE, VAL> {
|
|
26
26
|
protected processVirtualFields(doc: DTO): Promise<STORE_DOC>;
|
|
27
27
|
/**
|
|
28
|
-
* Delete a document by its key.
|
|
28
|
+
* Delete a document by its key, cascading to its {@link cascadeChildren}.
|
|
29
29
|
*
|
|
30
30
|
* @param request - The document key identifying the document to delete.
|
|
31
31
|
* @returns An object confirming the deletion.
|
|
@@ -95,10 +95,10 @@ export declare abstract class BackendDefaultApi<STORE_DOC extends DocumentKeyAdm
|
|
|
95
95
|
*/
|
|
96
96
|
bulkUpsert(request: UpsertInput<INPUT_DTO>[]): Promise<DTO[]>;
|
|
97
97
|
/**
|
|
98
|
-
* Delete many documents by their keys.
|
|
98
|
+
* Delete many documents by their keys, cascading to their {@link cascadeChildren}.
|
|
99
99
|
*
|
|
100
100
|
* @param request - The document keys identifying the documents to delete.
|
|
101
|
-
* @returns The number of documents deleted.
|
|
101
|
+
* @returns The number of documents deleted (excluding cascaded children).
|
|
102
102
|
*/
|
|
103
103
|
bulkDelete(request: DocumentKey[]): Promise<{
|
|
104
104
|
deleted: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackendDefaultApi.d.ts","sourceRoot":"","sources":["../../src/api/BackendDefaultApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACb,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"BackendDefaultApi.d.ts","sourceRoot":"","sources":["../../src/api/BackendDefaultApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACb,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAAsB,iBAAiB,CACrC,SAAS,SAAS,gBAAgB,EAClC,GAAG,SAAS,SAAS,EACrB,SAAS,SAAS,YAAY,GAAG,GAAG,EACpC,YAAY,SAAS,YAAY,GAAG,YAAY,EAChD,KAAK,SAAS,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EACjD,GAAG,SAAS,UAAU,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CACzD,SAAQ,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC;cAElD,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;IAW3E;;;;;OAKG;IACmB,MAAM,CAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC;IAM7B;;;;;OAKG;IACmB,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAI7D;;;;;OAKG;IACmB,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAIvE;;;;;OAKG;IACmB,KAAK,CACzB,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,GACzB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAI7B;;;;;OAKG;IACmB,MAAM,CAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAI/B;;;;;;OAMG;IACmB,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAO3E;;;;;;OAMG;IACmB,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAM3E;;;;;;;;;;;OAWG;IACmB,UAAU,CAC9B,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,GAChC,OAAO,CAAC,GAAG,EAAE,CAAC;IAajB;;;;;OAKG;IACmB,UAAU,CAC9B,OAAO,EAAE,WAAW,EAAE,GACrB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;cASf,aAAa,CAC3B,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,GAC9B,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;KAAE,CAAC;cAOrC,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC;cAIJ,QAAQ,CACtB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,EACzB,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAQrD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { cascadeDelete } from "../store/cascade.js";
|
|
1
2
|
import { BackendCrudApi } from "./BackendCrudApi.js";
|
|
2
3
|
/**
|
|
3
4
|
* Concrete default implementation of {@link BackendCrudApi}.
|
|
@@ -34,12 +35,13 @@ export class BackendDefaultApi extends BackendCrudApi {
|
|
|
34
35
|
return doc;
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
|
-
* Delete a document by its key.
|
|
38
|
+
* Delete a document by its key, cascading to its {@link cascadeChildren}.
|
|
38
39
|
*
|
|
39
40
|
* @param request - The document key identifying the document to delete.
|
|
40
41
|
* @returns An object confirming the deletion.
|
|
41
42
|
*/
|
|
42
43
|
async delete(request) {
|
|
44
|
+
await cascadeDelete(this.cascadeChildren(), [request.id]);
|
|
43
45
|
await this.store().delete(request.id);
|
|
44
46
|
return { deleted: true };
|
|
45
47
|
}
|
|
@@ -127,12 +129,13 @@ export class BackendDefaultApi extends BackendCrudApi {
|
|
|
127
129
|
return this.toDtos(await this.store().bulkUpsert(storeDocs));
|
|
128
130
|
}
|
|
129
131
|
/**
|
|
130
|
-
* Delete many documents by their keys.
|
|
132
|
+
* Delete many documents by their keys, cascading to their {@link cascadeChildren}.
|
|
131
133
|
*
|
|
132
134
|
* @param request - The document keys identifying the documents to delete.
|
|
133
|
-
* @returns The number of documents deleted.
|
|
135
|
+
* @returns The number of documents deleted (excluding cascaded children).
|
|
134
136
|
*/
|
|
135
137
|
async bulkDelete(request) {
|
|
138
|
+
await cascadeDelete(this.cascadeChildren(), request.map((k) => k.id));
|
|
136
139
|
const deleted = await this.store().bulkDelete(...request.map((k) => k.id));
|
|
137
140
|
return { deleted };
|
|
138
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackendDefaultApi.js","sourceRoot":"","sources":["../../src/api/BackendDefaultApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BackendDefaultApi.js","sourceRoot":"","sources":["../../src/api/BackendDefaultApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DocumentKeyAdmin } from "@mxpicture/gcp-functions-common/types";
|
|
2
|
+
import type { Store } from "./Store.js";
|
|
3
|
+
/**
|
|
4
|
+
* One child collection of a cascade-delete tree.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Children reference their parent through the conventional `parentId` field
|
|
8
|
+
* (see {@link Store.refByParent}). Nested `children` describe grandchildren,
|
|
9
|
+
* so a whole entity family can be deleted from its root.
|
|
10
|
+
*/
|
|
11
|
+
export interface CascadeChild {
|
|
12
|
+
/** Store of the child collection. */
|
|
13
|
+
store: Store<DocumentKeyAdmin>;
|
|
14
|
+
/** Cascade tree of this child's own children (grandchildren). */
|
|
15
|
+
children?: CascadeChild[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Deletes every document of the given child trees that belongs (via
|
|
19
|
+
* `parentId`) to one of `parentIds`, depth-first so grandchildren are removed
|
|
20
|
+
* before the children they reference.
|
|
21
|
+
*
|
|
22
|
+
* @param children - The cascade tree of child collections.
|
|
23
|
+
* @param parentIds - The parent document IDs whose descendants are deleted.
|
|
24
|
+
* @returns The total number of deleted descendant documents.
|
|
25
|
+
*/
|
|
26
|
+
export declare const cascadeDelete: (children: CascadeChild[], parentIds: string[]) => Promise<number>;
|
|
27
|
+
//# sourceMappingURL=cascade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade.d.ts","sourceRoot":"","sources":["../../src/store/cascade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GACxB,UAAU,YAAY,EAAE,EACxB,WAAW,MAAM,EAAE,KAClB,OAAO,CAAC,MAAM,CAgBhB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deletes every document of the given child trees that belongs (via
|
|
3
|
+
* `parentId`) to one of `parentIds`, depth-first so grandchildren are removed
|
|
4
|
+
* before the children they reference.
|
|
5
|
+
*
|
|
6
|
+
* @param children - The cascade tree of child collections.
|
|
7
|
+
* @param parentIds - The parent document IDs whose descendants are deleted.
|
|
8
|
+
* @returns The total number of deleted descendant documents.
|
|
9
|
+
*/
|
|
10
|
+
export const cascadeDelete = async (children, parentIds) => {
|
|
11
|
+
if (children.length === 0 || parentIds.length === 0)
|
|
12
|
+
return 0;
|
|
13
|
+
let deleted = 0;
|
|
14
|
+
for (const child of children) {
|
|
15
|
+
const ids = [];
|
|
16
|
+
for (const parentId of parentIds) {
|
|
17
|
+
const snapshot = await child.store.refByParent(parentId).get();
|
|
18
|
+
ids.push(...snapshot.docs.map((doc) => doc.id));
|
|
19
|
+
}
|
|
20
|
+
if (ids.length === 0)
|
|
21
|
+
continue;
|
|
22
|
+
deleted += await cascadeDelete(child.children ?? [], ids);
|
|
23
|
+
deleted += await child.store.bulkDelete(...ids);
|
|
24
|
+
}
|
|
25
|
+
return deleted;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=cascade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade.js","sourceRoot":"","sources":["../../src/store/cascade.ts"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,QAAwB,EACxB,SAAmB,EACF,EAAE;IACnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE9D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE/B,OAAO,IAAI,MAAM,aAAa,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,IAAI,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
package/dist/store/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
package/dist/store/index.js
CHANGED
package/dist/store/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mxpicture/gcp-functions-backend",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.58",
|
|
4
4
|
"description": "Utils for google cloud functions, publishing both CommonJS and ESM builds",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "MXPicture",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@google-cloud/tasks": "^6.2.1",
|
|
62
|
-
"@mxpicture/gcp-functions-common": "^2.1.
|
|
62
|
+
"@mxpicture/gcp-functions-common": "^2.1.58",
|
|
63
63
|
"express": "^5.2.1",
|
|
64
64
|
"firebase-admin": "^13.7.0",
|
|
65
65
|
"firebase-functions": "^7.0.6",
|