// DevPerf Dashboard - Shared Types (Single Source of Truth) // Both frontend and backend reference these type definitions export interface ApiResponse { code: number; data: T; message: string; } export interface PaginatedData { items: T[]; total: number; page: number; pageSize: number; } export type UserRole = 'admin' | 'manager' | 'developer' | 'viewer'; export type TaskStatus = 'todo' | 'in_progress' | 'review' | 'done'; export type TaskPriority = 'urgent' | 'high' | 'medium' | 'low' | 'none'; export type SprintStatus = 'upcoming' | 'active' | 'completed'; export type MilestoneStatus = 'backlog' | 'active' | 'completed' | 'cancelled'; export type PRState = 'open' | 'closed' | 'merged'; export type SyncSource = 'plane' | 'gitea'; export type SyncStatus = 'success' | 'error'; // Auth export interface LoginRequest { email: string; password: string; } export interface UserBasic { id: string; displayName: string; email: string; role: UserRole; } export interface LoginResponseData { token: string; user: UserBasic; } // Overview export interface SprintCycleData { name: string; plannedPoints: number; completedPoints: number; deliveryRate: number; } export interface TaskDistributionData { todo: number; inProgress: number; review: number; done: number; } export interface ProjectProgressItem { projectId: string; name: string; identifier: string; currentCycleProgress: number; totalPoints: number; completedPoints: number; } export interface MemberCodeData { userId: string; name: string; commits: number; prs: number; } export interface WeekCodeData { weekStart: string; members: MemberCodeData[]; } export interface KRProgressItem { title: string; current: number; target: number; unit: string; } export interface OKRProgressItem { id: string; title: string; ownerName: string; progress: number; keyResults: KRProgressItem[]; } export interface WeekPRData { weekStart: string; avgHours: number; prCount: number; } export interface OverviewData { sprintDelivery: { cycles: SprintCycleData[] }; taskDistribution: TaskDistributionData; projectProgress: ProjectProgressItem[]; weeklyCodeActivity: { weeks: WeekCodeData[] }; okrProgress: OKRProgressItem[]; prMergeTime: { weeks: WeekPRData[] }; } // Projects export interface ProjectListItem { id: string; name: string; identifier: string; lastSyncedAt: string | null; } export interface BurndownPoint { date: string; ideal: number; actual: number; } export interface CurrentCycleData { name: string; startDate: string; endDate: string; deliveryRate: number; burndown: BurndownPoint[]; } export interface MilestoneItem { id: string; name: string; status: MilestoneStatus; targetDate: string; progress: number; totalIssues: number; completedIssues: number; } export interface TaskMatrixMember { userId: string; name: string; todo: number; inProgress: number; review: number; done: number; totalPoints: number; } export interface WeeklyGitTrend { weekStart: string; commits: number; prs: number; } export interface ProjectDetailData { project: ProjectListItem; currentCycle: CurrentCycleData | null; milestones: MilestoneItem[]; taskMatrix: { members: TaskMatrixMember[] }; gitActivity: { recentCommits: number; recentPRs: number; weeklyTrend: WeeklyGitTrend[] }; } // Members export interface MemberCycleData { name: string; assignedPoints: number; completedPoints: number; rate: number; } export interface HeatmapDay { date: string; commits: number; prsCreated: number; prsMerged: number; tasksCompleted: number; } export interface CurrentTaskItem { id: string; title: string; projectName: string; status: TaskStatus; priority: TaskPriority; storyPoints: number | null; dueDate: string | null; } export interface KPIScorecard { sprintDeliveryRate: number; avgDeliveryDays: number; bugDensity: number; prMergeTimeAvg: number; reviewParticipation: number; activityStreak: number; } export interface MemberDetailData { member: UserBasic; deliveryTrend: { cycles: MemberCycleData[] }; contributionHeatmap: { days: HeatmapDay[] }; currentTasks: CurrentTaskItem[]; kpiScorecard: KPIScorecard; } // OKR export interface KeyResultItem { id: string; title: string; targetValue: number; currentValue: number; unit: string; weight: number; progress: number; } export interface ObjectiveItem { id: string; title: string; ownerName: string; projectName: string; period: string; progress: number; keyResults: KeyResultItem[]; } export interface CreateObjectiveRequest { title: string; ownerId: string; projectId: string; period: string; } export interface CreateKeyResultRequest { title: string; targetValue: number; unit: string; weight: number; } export interface UpdateKeyResultRequest { currentValue: number; } // Git export interface GitHeatmapDay { date: string; commits: number; additions: number; deletions: number; } export interface PRMetrics { totalPRs: number; mergedPRs: number; avgMergeTimeHours: number; reviewedPRs: number; } export interface WeeklyGitActivity { weekStart: string; commits: number; prs: number; additions: number; deletions: number; } export interface GitActivityData { heatmap: GitHeatmapDay[]; prMetrics: PRMetrics; weeklyTrend: WeeklyGitActivity[]; } // Admin export interface AdminUser { id: string; displayName: string; email: string; role: UserRole; planeUserId: string | null; gitUsername: string | null; createdAt: string; } export interface CreateUserRequest { displayName: string; email: string; password: string; role: UserRole; planeUserId?: string; gitUsername?: string; } export interface AuthorMappingItem { id: string; gitEmail: string | null; gitUsername: string | null; userId: string | null; userName: string | null; } export interface SyncLogItem { id: string; source: SyncSource; status: SyncStatus; message: string | null; recordsProcessed: number; syncedAt: string; } // Health export interface HealthData { status: 'ok'; version: string; uptime: number; dbConnected: boolean; } // Error export interface ApiError { code: number; data: null; message: string; }