diff --git a/.temp/cli-latest b/.temp/cli-latest index d4bb21d..1dd6178 100644 --- a/.temp/cli-latest +++ b/.temp/cli-latest @@ -1 +1 @@ -v2.58.5 \ No newline at end of file +v2.75.0 \ No newline at end of file diff --git a/db/migrations/core/61-core-schema.sql b/db/migrations/core/61-core-schema.sql index c5dca44..d49d7b6 100644 --- a/db/migrations/core/61-core-schema.sql +++ b/db/migrations/core/61-core-schema.sql @@ -239,7 +239,62 @@ create table if not exists public.audit_logs ( ); comment on table public.audit_logs is 'System-wide audit trail for important operations'; ---[ 9. Indexes ]-- +--[ 9. Exam Specifications ]-- +create table if not exists public.eb_specifications ( + id uuid primary key default uuid_generate_v4(), + spec_code text unique, + exam_board_code text, + award_code text, + subject_code text, + first_teach text, + spec_ver text, + + -- Document storage details + storage_loc text, + doc_type text check (doc_type in ('pdf', 'json', 'md', 'html', 'txt', 'doctags')), + doc_details jsonb default '{}'::jsonb, -- e.g. Tika extract + docling_docs jsonb default '{}'::jsonb, -- e.g. Docling extracts settings and storage locations + + created_at timestamp with time zone default timezone('utc'::text, now()), + updated_at timestamp with time zone default timezone('utc'::text, now()) +); + +comment on table public.eb_specifications is 'Exam board specifications and their primary document'; +comment on column public.eb_specifications.spec_code is 'Unique code for the specification, used for linking exams'; +comment on column public.eb_specifications.doc_details is 'Tika extract of the specification document'; +comment on column public.eb_specifications.docling_docs is 'Docling extracts settings and storage locations for the specification document'; + +--[ 10. Exam Papers / Entries ]-- +create table if not exists public.eb_exams ( + id uuid primary key default uuid_generate_v4(), + exam_code text unique, + spec_code text references public.eb_specifications(spec_code) on delete cascade, + paper_code text, + tier text, + session text, + type_code text, + + -- Document storage details + storage_loc text, + doc_type text check (doc_type in ('pdf', 'json', 'md', 'html', 'txt', 'doctags')), + doc_details jsonb default '{}'::jsonb, -- e.g. Tika extract + docling_docs jsonb default '{}'::jsonb, -- e.g. Docling extracts settings and storage locations + + created_at timestamp with time zone default timezone('utc'::text, now()), + updated_at timestamp with time zone default timezone('utc'::text, now()) +); + +comment on table public.eb_exams is 'Exam papers and related documents linked to specifications'; +comment on column public.eb_exams.exam_code is 'Unique code for the exam paper, used for linking questions'; +comment on column public.eb_exams.type_code is 'Type code for the exam document: Question Paper (QP), Mark Scheme (MS), Examiner Report (ER), Other (OT)'; +comment on column public.eb_exams.doc_details is 'Tika extract of the exam paper document'; +comment on column public.eb_exams.docling_docs is 'Docling extracts settings and storage locations for the exam paper document'; + +--[ 11. Indexes ]-- +-- Index for geospatial queries +create index if not exists idx_institutes_geo_coordinates on public.institutes using gin(geo_coordinates); +create index if not exists idx_institutes_urn on public.institutes(urn); + -- Document artefacts indexes create index if not exists idx_document_artefacts_file_status on public.document_artefacts(file_id, status); create index if not exists idx_document_artefacts_file_type on public.document_artefacts(file_id, type); @@ -253,7 +308,19 @@ create index if not exists idx_files_category on public.files(category); -- Brain indexes create index if not exists idx_brains_user_id on public.brains(user_id); ---[ 10. Triggers ]-- +-- Exam board indexes +create index if not exists idx_eb_exams_exam_code on public.eb_exams(exam_code); +create index if not exists idx_eb_exams_spec_code on public.eb_exams(spec_code); +create index if not exists idx_eb_exams_paper_code on public.eb_exams(paper_code); +create index if not exists idx_eb_exams_tier on public.eb_exams(tier); +create index if not exists idx_eb_exams_session on public.eb_exams(session); +create index if not exists idx_eb_exams_type_code on public.eb_exams(type_code); +create index if not exists idx_eb_specifications_spec_code on public.eb_specifications(spec_code); +create index if not exists idx_eb_specifications_exam_board_code on public.eb_specifications(exam_board_code); +create index if not exists idx_eb_specifications_award_code on public.eb_specifications(award_code); +create index if not exists idx_eb_specifications_subject_code on public.eb_specifications(subject_code); + +--[ 12. Triggers ]-- -- Set completed_at when document artefact status changes to completed create trigger trigger_set_completed_at before update on public.document_artefacts @@ -284,7 +351,14 @@ create trigger trigger_institute_membership_requests_updated_at for each row execute function public.handle_updated_at(); ---[ 11. Additional Indexes ]-- --- Index for geospatial queries -create index if not exists idx_institutes_geo_coordinates on public.institutes using gin(geo_coordinates); -create index if not exists idx_institutes_urn on public.institutes(urn); +-- Set updated_at on eb_specifications updates +create trigger trigger_eb_specifications_updated_at + before update on public.eb_specifications + for each row + execute function public.handle_updated_at(); + +-- Set updated_at on eb_exams updates +create trigger trigger_eb_exams_updated_at + before update on public.eb_exams + for each row + execute function public.handle_updated_at();