Skip to content

Commit 092544d

Browse files
committed
feat: add support for recursive deletes
1 parent ce4856e commit 092544d

5 files changed

Lines changed: 26 additions & 0 deletions

File tree

packages/admin/src/lib/firestore/firestore-service.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ const make = (db: Firestore) => {
116116
try: () => db.doc(path).withConverter(converter).delete(),
117117
catch: (error) => mapError(error),
118118
}),
119+
deleteRecursive: (path) =>
120+
Effect.tryPromise({
121+
try: () => db.recursiveDelete(db.doc(path)),
122+
catch: (error) => mapError(error),
123+
}),
119124
query: (collectionPath, constraints) =>
120125
Effect.tryPromise({
121126
try: async () => {

packages/client/src/lib/firestore/firestore-service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ const make = (db: Firestore) => {
6464
try: () => deleteDoc(doc(db, path).withConverter(converter)),
6565
catch: (error) => FirestoreError.fromError(error),
6666
}),
67+
deleteRecursive: (_path) =>
68+
Effect.die(
69+
new Error('deleteRecursive is not supported by the client SDK')
70+
),
6771
query: (collectionPath, constraints) =>
6872
Effect.tryPromise({
6973
try: async () => {

packages/effect-firebase/src/lib/firestore/firestore-service.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,19 @@ type FirestoreCRUD = {
6363
readonly remove: (
6464
path: string
6565
) => Effect.Effect<void, FirestoreError | UnknownException>;
66+
67+
/**
68+
* Recursively delete a document and all its subcollections.
69+
*
70+
* **Admin SDK only.** Calling this method with the client SDK layer will
71+
* cause a defect (`Effect.die`). Repositories and models that use this
72+
* method must only be run in an admin context.
73+
*
74+
* @param path - The path to the document.
75+
*/
76+
readonly deleteRecursive: (
77+
path: string
78+
) => Effect.Effect<void, FirestoreError | UnknownException>;
6679
};
6780

6881
type FirestoreQuery = {

packages/effect-firebase/src/lib/firestore/noop-layer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const noopLayer = Layer.succeed(FirestoreService, {
2020
set: NotInitiallized,
2121
update: NotInitiallized,
2222
remove: NotInitiallized,
23+
deleteRecursive: NotInitiallized,
2324
query: NotInitiallized,
2425
streamDoc: NotInitiallized,
2526
streamQuery: NotInitiallized,

packages/mock/src/lib/firestore/firestore-service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ export const MockFirestoreService = (
2525
remove: () => {
2626
throw new Error('MockFirestoreService.remove not implemented.');
2727
},
28+
deleteRecursive: () => {
29+
throw new Error('MockFirestoreService.deleteRecursive not implemented.');
30+
},
2831
query: () => {
2932
throw new Error('MockFirestoreService.query not implemented.');
3033
},

0 commit comments

Comments
 (0)