Features implemented: - F1: Email digest notifications with cron endpoint and per-user frequency - F2: Jury availability windows and workload preferences in smart assignment - F3: Round templates with save-from-round and CRUD management - F4: Side-by-side project comparison view for jury members - F5: Real-time voting dashboard with Server-Sent Events (SSE) - F6: Live voting UX: QR codes, audience voting, tie-breaking, score animations - F7: File versioning, inline preview, bulk download with presigned URLs - F8: Mentor dashboard: milestones, private notes, activity tracking - F9: Communication hub with broadcasts, templates, and recipient targeting - F10: Advanced analytics: cross-round comparison, juror consistency, diversity metrics, PDF export - F11: Applicant draft saving with magic link resume and cron cleanup - F12: Webhook integration layer with HMAC signing, retry, and delivery logs - F13: Peer review discussions with anonymized scores and threaded comments - F14: Audit log enhancements: before/after diffs, session grouping, anomaly detection, retention - F15: i18n foundation with next-intl (EN/FR), cookie-based locale, language switcher Schema: 12 new models, field additions to User, Project, ProjectFile, LiveVotingSession, LiveVote, MentorAssignment, AuditLog, Program New routers: roundTemplate, message, webhook (registered in _app.ts) New services: email-digest, webhook-dispatcher New cron endpoints: /api/cron/digest, /api/cron/draft-cleanup, /api/cron/audit-cleanup New API routes: /api/live-voting/stream (SSE), /api/files/bulk-download All features are admin-configurable via SystemSettings or per-model settingsJson fields. Docker build verified successfully. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import { router } from '../trpc'
|
|
import { programRouter } from './program'
|
|
import { roundRouter } from './round'
|
|
import { projectRouter } from './project'
|
|
import { userRouter } from './user'
|
|
import { assignmentRouter } from './assignment'
|
|
import { evaluationRouter } from './evaluation'
|
|
import { fileRouter } from './file'
|
|
import { exportRouter } from './export'
|
|
import { auditRouter } from './audit'
|
|
import { settingsRouter } from './settings'
|
|
import { gracePeriodRouter } from './gracePeriod'
|
|
// Phase 2 routers
|
|
import { learningResourceRouter } from './learningResource'
|
|
import { partnerRouter } from './partner'
|
|
import { notionImportRouter } from './notion-import'
|
|
import { typeformImportRouter } from './typeform-import'
|
|
// Phase 2B routers
|
|
import { tagRouter } from './tag'
|
|
import { applicantRouter } from './applicant'
|
|
import { liveVotingRouter } from './live-voting'
|
|
import { analyticsRouter } from './analytics'
|
|
// Storage routers
|
|
import { avatarRouter } from './avatar'
|
|
import { logoRouter } from './logo'
|
|
// Applicant system routers
|
|
import { applicationRouter } from './application'
|
|
import { mentorRouter } from './mentor'
|
|
import { filteringRouter } from './filtering'
|
|
import { specialAwardRouter } from './specialAward'
|
|
import { notificationRouter } from './notification'
|
|
// Feature expansion routers
|
|
import { roundTemplateRouter } from './roundTemplate'
|
|
import { messageRouter } from './message'
|
|
import { webhookRouter } from './webhook'
|
|
|
|
/**
|
|
* Root tRPC router that combines all domain routers
|
|
*/
|
|
export const appRouter = router({
|
|
program: programRouter,
|
|
round: roundRouter,
|
|
project: projectRouter,
|
|
user: userRouter,
|
|
assignment: assignmentRouter,
|
|
evaluation: evaluationRouter,
|
|
file: fileRouter,
|
|
export: exportRouter,
|
|
audit: auditRouter,
|
|
settings: settingsRouter,
|
|
gracePeriod: gracePeriodRouter,
|
|
// Phase 2 routers
|
|
learningResource: learningResourceRouter,
|
|
partner: partnerRouter,
|
|
notionImport: notionImportRouter,
|
|
typeformImport: typeformImportRouter,
|
|
// Phase 2B routers
|
|
tag: tagRouter,
|
|
applicant: applicantRouter,
|
|
liveVoting: liveVotingRouter,
|
|
analytics: analyticsRouter,
|
|
// Storage routers
|
|
avatar: avatarRouter,
|
|
logo: logoRouter,
|
|
// Applicant system routers
|
|
application: applicationRouter,
|
|
mentor: mentorRouter,
|
|
filtering: filteringRouter,
|
|
specialAward: specialAwardRouter,
|
|
notification: notificationRouter,
|
|
// Feature expansion routers
|
|
roundTemplate: roundTemplateRouter,
|
|
message: messageRouter,
|
|
webhook: webhookRouter,
|
|
})
|
|
|
|
export type AppRouter = typeof appRouter
|