-- Cumulative homework/assignments: definitions, user instances, multi-reports, daily entries. CREATE TABLE `assignment_definitions` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `key` VARCHAR(64) NOT NULL, `sessionOrder` INTEGER NOT NULL, `title` VARCHAR(191) NOT NULL, `description` TEXT NOT NULL, `instructions` TEXT NOT NULL, `assignmentType` ENUM('ONE_TIME', 'DAILY', 'ONGOING') NOT NULL, `formSchema` JSON NULL, `expectedDurationDays` INTEGER NULL, `suggestedEndDay` INTEGER NULL, `requiresReport` BOOLEAN NOT NULL DEFAULT true, `blocksNextSession` BOOLEAN NOT NULL DEFAULT false, `isFinalAssignment` BOOLEAN NOT NULL DEFAULT false, `displayOrder` INTEGER NOT NULL DEFAULT 0, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `assignment_definitions_key_key`(`key`), INDEX `idx_assignment_definitions_session_order`(`sessionOrder`), INDEX `idx_assignment_definitions_display_order`(`displayOrder`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `user_assignments` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `userId` BIGINT UNSIGNED NOT NULL, `definitionId` BIGINT UNSIGNED NOT NULL, `status` ENUM('NOT_STARTED', 'ACTIVE', 'IN_PROGRESS', 'REPORTED', 'COMPLETED') NOT NULL DEFAULT 'ACTIVE', `activatedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `startedAt` DATETIME(3) NULL, `lastActivityAt` DATETIME(3) NULL, `completedAt` DATETIME(3) NULL, `draftData` JSON NULL, `completionNote` TEXT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `idx_user_assignments_user_status`(`userId`, `status`), INDEX `idx_user_assignments_user_activated`(`userId`, `activatedAt`), UNIQUE INDEX `uq_user_assignments_user_definition`(`userId`, `definitionId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `assignment_reports` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `userAssignmentId` BIGINT UNSIGNED NOT NULL, `userId` BIGINT UNSIGNED NOT NULL, `reportText` TEXT NOT NULL, `reportStatus` ENUM('completed', 'in_progress', 'difficult', 'not_started') NOT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `idx_assignment_reports_ua_created`(`userAssignmentId`, `createdAt`), INDEX `idx_assignment_reports_user_created`(`userId`, `createdAt`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `assignment_daily_entries` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `userAssignmentId` BIGINT UNSIGNED NOT NULL, `userId` BIGINT UNSIGNED NOT NULL, `entryDate` DATE NOT NULL, `responseData` JSON NOT NULL, `note` TEXT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `idx_assignment_daily_entries_user_date`(`userId`, `entryDate`), UNIQUE INDEX `uq_assignment_daily_entries_ua_date`(`userAssignmentId`, `entryDate`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE `assignment_definitions` ADD CONSTRAINT `assignment_definitions_sessionOrder_fkey` FOREIGN KEY (`sessionOrder`) REFERENCES `course_sessions`(`order`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `user_assignments` ADD CONSTRAINT `user_assignments_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE `user_assignments` ADD CONSTRAINT `user_assignments_definitionId_fkey` FOREIGN KEY (`definitionId`) REFERENCES `assignment_definitions`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `assignment_reports` ADD CONSTRAINT `assignment_reports_userAssignmentId_fkey` FOREIGN KEY (`userAssignmentId`) REFERENCES `user_assignments`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE `assignment_reports` ADD CONSTRAINT `assignment_reports_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE `assignment_daily_entries` ADD CONSTRAINT `assignment_daily_entries_userAssignmentId_fkey` FOREIGN KEY (`userAssignmentId`) REFERENCES `user_assignments`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE `assignment_daily_entries` ADD CONSTRAINT `assignment_daily_entries_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;