import { redirect } from 'next/navigation'; import { getCurrentUser, toPublicUser } from '@/lib/auth/getCurrentUser'; import { createProjectService, createActivityLogService, } from '@/lib/api/services'; import { Header } from '@/components/layout/Header'; import { ProjectNav } from '@/components/layout/ProjectNav'; import { ForbiddenError, NotFoundError } from '@/lib/errors'; export const dynamic = 'force-dynamic'; const ACTION_LABELS: Record = { todo_created: 'ToDo作成', todo_updated: 'ToDo更新', todo_completed: 'ToDo完了', file_uploaded: 'ファイルアップロード', board_posted: '掲示板投稿', comment_added: 'コメント追加', note_created: 'メモ作成', note_updated: 'メモ更新', meeting_created: 'ミーティング作成', member_added: 'メンバー追加', milestone_updated: 'マイルストーン更新', }; export default async function ProjectActivityPage({ params, }: { params: Promise<{ projectId: string }>; }) { const user = await getCurrentUser(); if (!user) { redirect('/login'); } const { projectId } = await params; const projectService = createProjectService(); let project; try { project = projectService.getProject(user.id, Number(projectId)); } catch (error) { if (error instanceof ForbiddenError || error instanceof NotFoundError) { redirect('/dashboard'); } throw error; } const activityService = createActivityLogService(); const { items } = activityService.listByProject(project.id, 1); return (

アクティビティログ

{items.length === 0 ? (

アクティビティはありません。

) : (
    {items.map((log) => (
  • {ACTION_LABELS[log.action] ?? log.action} {log.createdAt}

    {log.targetType} {log.targetId !== null ? ` #${log.targetId}` : ''}

  • ))}
)}
); }