feat: implement course certificate generation system with organization-level toggles

This commit is contained in:
2026-04-14 11:30:00 -04:00
parent c750ad0423
commit e0e6655b91
14 changed files with 1027 additions and 7 deletions
@@ -0,0 +1,28 @@
-- Issued Certificates Table
-- Stores certificates generated when students complete courses
CREATE TABLE IF NOT EXISTS issued_certificates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
course_id UUID NOT NULL,
certificate_html TEXT NOT NULL,
issued_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
certificate_hash TEXT NOT NULL, -- For dedup and verification
verification_code TEXT NOT NULL UNIQUE, -- Public verification code
metadata JSONB DEFAULT '{}'::jsonb -- Extra data: score, completion_date, etc.
);
-- Indexes for performance
CREATE INDEX idx_issued_certificates_user_id ON issued_certificates(user_id);
CREATE INDEX idx_issued_certificates_course_id ON issued_certificates(course_id);
CREATE INDEX idx_issued_certificates_verification_code ON issued_certificates(verification_code);
-- Unique constraint: one certificate per user per course
CREATE UNIQUE INDEX idx_issued_certificates_user_course_unique
ON issued_certificates(user_id, course_id);
-- Comments
COMMENT ON TABLE issued_certificates IS 'Certificates issued to students upon course completion';
COMMENT ON COLUMN issued_certificates.certificate_hash IS 'SHA256 hash of the certificate HTML for verification';
COMMENT ON COLUMN issued_certificates.verification_code IS 'Public code for certificate verification (e.g., VER-ABC123)';
COMMENT ON COLUMN issued_certificates.metadata IS 'Additional data: final_score, completion_date, instructor_signature, etc';
@@ -0,0 +1,8 @@
-- Add certificates_enabled flag to organizations table in LMS
-- This is synced from CMS exercise_settings when organization data is ingested
ALTER TABLE organizations
ADD COLUMN IF NOT EXISTS certificates_enabled BOOLEAN NOT NULL DEFAULT TRUE;
COMMENT ON COLUMN organizations.certificates_enabled
IS 'Whether built-in certificate generation is enabled for this organization (synced from CMS).';