From 2b534743d6ac40beb8e7e37e31fbd4ef9a2d18f6 Mon Sep 17 00:00:00 2001 From: ttipo Date: Mon, 22 Jun 2026 17:49:37 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=A4=91=EA=B0=84=20=EC=A0=90=EA=B2=80?= =?UTF-8?q?=20=EB=B3=B4=EA=B3=A0=20=EC=8B=9C=20=ED=99=9C=EB=8F=99=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=20=EA=B8=B0=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 보고 제출 시 알림만 보내고 활동(activity)에는 적재되지 않아 프로젝트 활동 피드·업무 활동 탭에 표시되지 않던 누락을 보완. - ActivityType/ApiActivityType 에 task.checkpoint_reported 추가 - submitCheckpointReport 에서 activity.record 호출 - 프론트 활동 렌더링 케이스(프로젝트 피드/업무 탭) 추가 Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/modules/activity/entities/activity.entity.ts | 1 + backend/src/modules/task/task.service.ts | 9 +++++++++ frontend/src/stores/activity.store.ts | 2 ++ frontend/src/stores/task.store.ts | 2 ++ frontend/src/types/activity.ts | 1 + 5 files changed, 15 insertions(+) diff --git a/backend/src/modules/activity/entities/activity.entity.ts b/backend/src/modules/activity/entities/activity.entity.ts index 2a32fab..79653c3 100644 --- a/backend/src/modules/activity/entities/activity.entity.ts +++ b/backend/src/modules/activity/entities/activity.entity.ts @@ -28,6 +28,7 @@ export type ActivityType = | 'task.assignees_changed' | 'task.due_changed' | 'task.edited' + | 'task.checkpoint_reported' | 'task.file_removed' | 'task.removed'; diff --git a/backend/src/modules/task/task.service.ts b/backend/src/modules/task/task.service.ts index 0d25a19..3f76c3f 100644 --- a/backend/src/modules/task/task.service.ts +++ b/backend/src/modules/task/task.service.ts @@ -1420,6 +1420,15 @@ export class TaskService { }), ); + // 활동 적재 — 중간 점검 보고 + await this.activity.record({ + projectId: project.id, + actorId: actingUserId, + type: 'task.checkpoint_reported', + payload: { taskTitle: task.title }, + taskSeq: task.seq, + }); + // 지시자에게 알림(행위자=작업자는 자동 제외) await this.notification.notify({ recipientIds: task.issuer ? [task.issuer.id] : [], diff --git a/frontend/src/stores/activity.store.ts b/frontend/src/stores/activity.store.ts index fb1e8a3..6b0cf44 100644 --- a/frontend/src/stores/activity.store.ts +++ b/frontend/src/stores/activity.store.ts @@ -100,6 +100,8 @@ function toProjectActivityItem(api: ApiActivity): ProjectActivityItem { } case 'task.edited': return { ...base, tone: 'task', icon: 'pencil', html: `${actor}님이 ${title} 업무를 수정했습니다` } + case 'task.checkpoint_reported': + return { ...base, tone: 'task', icon: 'check', html: `${actor}님이 ${title} 업무의 중간 점검을 보고했습니다` } case 'task.file_removed': return { ...base, diff --git a/frontend/src/stores/task.store.ts b/frontend/src/stores/task.store.ts index 7545534..e1dd542 100644 --- a/frontend/src/stores/task.store.ts +++ b/frontend/src/stores/task.store.ts @@ -159,6 +159,8 @@ function toTaskActivityView(api: ApiActivity): ActivityView { } case 'task.edited': return { tone: '', icon: 'check', html: `${actor}님이 업무를 수정했습니다`, time } + case 'task.checkpoint_reported': + return { tone: 'blue', icon: 'check', html: `${actor}님이 중간 점검 상태를 보고했습니다`, time } case 'task.file_removed': return { tone: '', icon: 'paperclip', html: `${actor}님이 첨부 파일을 삭제했습니다`, time, file: pstr(p, 'fileName') } default: diff --git a/frontend/src/types/activity.ts b/frontend/src/types/activity.ts index d86aeb2..0a92829 100644 --- a/frontend/src/types/activity.ts +++ b/frontend/src/types/activity.ts @@ -16,6 +16,7 @@ export type ApiActivityType = | 'task.assignees_changed' | 'task.due_changed' | 'task.edited' + | 'task.checkpoint_reported' | 'task.file_removed' | 'task.removed'