Skip to content

Commit 082e2ad

Browse files
committed
fix: 마감일이 지난 완료 Todo의 receipt를 주기적으로 제거하도록 수정
1 parent 4cac1de commit 082e2ad

2 files changed

Lines changed: 52 additions & 6 deletions

File tree

Firebase/functions/src/index.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ import {
3333
} from "./fcm/schedule";
3434

3535
import {
36-
deleteTodoNotificationReceipts,
37-
deleteCompletedTodoReceipts
36+
removeTodoNotificationDocuments,
37+
removeCompletedTodoReceipts,
38+
removeExpiredCompletedTodoReceipts
3839
} from "./todo/delete";
3940

4041

@@ -74,6 +75,7 @@ export {
7475
};
7576

7677
export {
77-
deleteTodoNotificationReceipts,
78-
deleteCompletedTodoReceipts
78+
removeTodoNotificationDocuments,
79+
removeCompletedTodoReceipts,
80+
removeExpiredCompletedTodoReceipts
7981
};

Firebase/functions/src/todo/delete.ts

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { onDocumentDeleted, onDocumentUpdated } from "firebase-functions/v2/firestore";
2+
import { onSchedule } from "firebase-functions/v2/scheduler";
23
import * as admin from "firebase-admin";
34
import * as logger from "firebase-functions/logger";
45

56
const LOCATION = "asia-northeast3";
67
const DELETE_BATCH_SIZE = 200;
8+
const CLEANUP_QUERY_BATCH_SIZE = 100;
79

8-
export const deleteTodoNotificationReceipts = onDocumentDeleted({
10+
export const removeTodoNotificationDocuments = onDocumentDeleted({
911
document: "users/{userId}/todoLists/{todoId}",
1012
region: LOCATION
1113
},
@@ -26,7 +28,7 @@ export const deleteTodoNotificationReceipts = onDocumentDeleted({
2628
}
2729
);
2830

29-
export const deleteCompletedTodoReceipts = onDocumentUpdated({
31+
export const removeCompletedTodoReceipts = onDocumentUpdated({
3032
document: "users/{userId}/todoLists/{todoId}",
3133
region: LOCATION
3234
},
@@ -61,6 +63,48 @@ export const deleteCompletedTodoReceipts = onDocumentUpdated({
6163
}
6264
);
6365

66+
export const removeExpiredCompletedTodoReceipts = onSchedule({
67+
region: LOCATION,
68+
schedule: "0 * * * *",
69+
timeZone: "UTC"
70+
},
71+
async () => {
72+
try {
73+
let lastDoc: FirebaseFirestore.QueryDocumentSnapshot<FirebaseFirestore.DocumentData> | undefined;
74+
75+
while (true) {
76+
let query = admin.firestore()
77+
.collectionGroup("todoLists")
78+
.where("dueDate", "<", admin.firestore.Timestamp.now())
79+
.orderBy("dueDate")
80+
.limit(CLEANUP_QUERY_BATCH_SIZE);
81+
82+
if (lastDoc) {
83+
query = query.startAfter(lastDoc);
84+
}
85+
86+
const snapshot = await query.get();
87+
if (snapshot.empty) { return; }
88+
89+
for (const todoDoc of snapshot.docs) {
90+
const todoData = todoDoc.data();
91+
if (todoData.isCompleted !== true) { continue; }
92+
93+
const userId = todoDoc.ref.parent.parent?.id;
94+
if (!userId) { continue; }
95+
96+
await deleteByTodoId(userId, "notificationReceipts", todoDoc.id);
97+
}
98+
99+
if (snapshot.size < CLEANUP_QUERY_BATCH_SIZE) { return; }
100+
lastDoc = snapshot.docs[snapshot.docs.length - 1];
101+
}
102+
} catch (error) {
103+
logger.error("지난 마감일의 완료된 todo receipt 정리 실패", { error });
104+
}
105+
}
106+
);
107+
64108
async function deleteByTodoId(
65109
userId: string,
66110
collectionName: "notificationReceipts" | "notifications",

0 commit comments

Comments
 (0)