Skip to content

[STAGING] FAC-116 to FAC-121 feat: Moodle seeding toolkit, tree explorer, audit trail, semester fix, bulk course provisioning, program filter enhancements#289

Merged
y4nder merged 6 commits intostagingfrom
feat/staging/fac-116-to-121
Apr 11, 2026
Merged

[STAGING] FAC-116 to FAC-121 feat: Moodle seeding toolkit, tree explorer, audit trail, semester fix, bulk course provisioning, program filter enhancements#289
y4nder merged 6 commits intostagingfrom
feat/staging/fac-116-to-121

Conversation

@y4nder
Copy link
Copy Markdown
Member

@y4nder y4nder commented Apr 11, 2026

Summary

Cherry-picks FAC-116 through FAC-121 from develop onto staging.

Test plan

  • Verify Moodle seeding toolkit endpoints respond correctly
  • Verify Moodle tree explorer endpoints return expected category/course tree
  • Verify audit trail query endpoints return paginated results
  • Verify semester year derivation is correct after fix
  • Verify category preview endpoint returns expected data
  • Verify bulk course provisioning cascading dropdowns work end-to-end
  • Verify ProgramFilterOptionResponseDto includes moodleCategoryId field

y4nder and others added 6 commits April 12, 2026 03:25
* FAC-116 feat: add Moodle seeding toolkit API

Add provisioning endpoints for creating Moodle categories, courses, and
users via REST API, replacing the manual Rust CLI workflow.

Closes #278

* chore: add bmad artifacts for Moodle seeding toolkit
* FAC-117 feat: add Moodle tree explorer API endpoints

Add read-only endpoints for browsing live Moodle category hierarchy
and course listings to support admin provisioning visibility.

* chore: add tech spec for moodle tree explorer
* feat: add audit trail query endpoints

Add GET /audit-logs (paginated, filtered list) and GET /audit-logs/:id
(single record) endpoints for superadmin audit log visibility.

https://claude.ai/code/session_01D6jVaVQiXM5y8P8XmsmzG5

* fix: startup issue

---------

Co-authored-by: Claude <noreply@anthropic.com>
…w endpoint (#284)

Fix wrong semester tag generation in category provisioning when a single
semester is selected (e.g., S22626 instead of S22526). Add ComputeSchoolYears
utility for school-year-aware year computation. Add POST categories/preview
endpoint with read-only hierarchy walk. Improve webservice_access_exception
error message with actionable hint.
…ns (#286)

* FAC-120 feat: enhance bulk course provisioning with cascading dropdowns

Replace free-text inputs and CSV upload with cascading dropdown selectors
(Semester → Department → Program) and JSON-based bulk preview/execute
endpoints for course provisioning.

* FAC-120 chore: add tech spec for bulk course provisioning enhancement
#288)

* FAC-121 feat: add ProgramFilterOptionResponseDto with moodleCategoryId

Create standalone ProgramFilterOptionResponseDto that exposes moodleCategoryId
in the program filter response, enabling the admin frontend to derive Moodle
category IDs for course fetching via cascading dropdowns.

- Add ProgramFilterOptionResponseDto with static MapProgram() mapper
- Update GetPrograms() service and controller return types
- Add service-level spec for mapping verification
- Update controller spec with moodleCategoryId assertions

* chore: added tech spec
@y4nder y4nder self-assigned this Apr 11, 2026
@y4nder y4nder merged commit 4ccbc4b into staging Apr 11, 2026
2 checks passed
y4nder added a commit that referenced this pull request Apr 11, 2026
…rer, audit trail, semester fix, bulk course provisioning, program filter enhancements (#289)

Cherry-picked from staging (4ccbc4b) with import conflicts resolved.
y4nder added a commit that referenced this pull request Apr 11, 2026
…rer, audit trail, semester fix, bulk course provisioning, program filter enhancements (#289)

* FAC-116 feat: add Moodle seeding toolkit API (#279)

* FAC-116 feat: add Moodle seeding toolkit API

Add provisioning endpoints for creating Moodle categories, courses, and
users via REST API, replacing the manual Rust CLI workflow.

Closes #278

* chore: add bmad artifacts for Moodle seeding toolkit

* FAC-117 feat: add Moodle tree explorer API endpoints (#281)

* FAC-117 feat: add Moodle tree explorer API endpoints

Add read-only endpoints for browsing live Moodle category hierarchy
and course listings to support admin provisioning visibility.

* chore: add tech spec for moodle tree explorer

* FAC-118 feat: add audit trail query endpoints (#282)

* feat: add audit trail query endpoints

Add GET /audit-logs (paginated, filtered list) and GET /audit-logs/:id
(single record) endpoints for superadmin audit log visibility.

https://claude.ai/code/session_01D6jVaVQiXM5y8P8XmsmzG5

* fix: startup issue

---------

Co-authored-by: Claude <noreply@anthropic.com>

* FAC-119 fix: correct semester year derivation and add category preview endpoint (#284)

Fix wrong semester tag generation in category provisioning when a single
semester is selected (e.g., S22626 instead of S22526). Add ComputeSchoolYears
utility for school-year-aware year computation. Add POST categories/preview
endpoint with read-only hierarchy walk. Improve webservice_access_exception
error message with actionable hint.

* FAC-120 feat: enhance bulk course provisioning with cascading dropdowns (#286)

* FAC-120 feat: enhance bulk course provisioning with cascading dropdowns

Replace free-text inputs and CSV upload with cascading dropdown selectors
(Semester → Department → Program) and JSON-based bulk preview/execute
endpoints for course provisioning.

* FAC-120 chore: add tech spec for bulk course provisioning enhancement

* FAC-121 feat: add ProgramFilterOptionResponseDto with moodleCategoryId (#288)

* FAC-121 feat: add ProgramFilterOptionResponseDto with moodleCategoryId

Create standalone ProgramFilterOptionResponseDto that exposes moodleCategoryId
in the program filter response, enabling the admin frontend to derive Moodle
category IDs for course fetching via cascading dropdowns.

- Add ProgramFilterOptionResponseDto with static MapProgram() mapper
- Update GetPrograms() service and controller return types
- Add service-level spec for mapping verification
- Update controller spec with moodleCategoryId assertions

* chore: added tech spec

---------

Co-authored-by: Claude <noreply@anthropic.com>
y4nder added a commit that referenced this pull request Apr 11, 2026
…Moodle Seeding Toolkit, Tree Explorer, Audit Trail, Semester Fix, Bulk Course Provisioning & Program Filter Enhancements (#291)

* FAC-113 feat: scoped program filters for analytics attention endpoint (#269) (#270)

Add programCode filter to GET /analytics/attention with scope
validation. Fix chairperson program scoping in GET /curriculum/programs.
Add scope validation for programCode on GET /analytics/overview.

* [STAGING] FAC-114 feat: add CSV test submission generator (#273) (#274)

* chore: initialize tech-spec WIP for CSV test submission generator

https://claude.ai/code/session_01VbeiqCo7jDVMYYi9dgp5kr

* chore: update tech-spec WIP with deep investigation findings

https://claude.ai/code/session_01VbeiqCo7jDVMYYi9dgp5kr

* chore: finalize tech-spec for CSV test submission generator

Spec passed two rounds of adversarial review. Key decisions:
- Direct submitQuestionnaire() calls instead of ingestion pipeline
- Import QuestionnaireModule for QuestionnaireService access
- em.clear() on failure for EM state recovery
- OpenAI gpt-4o-mini for multilingual comment generation
- Admin console builder UI with two-track selection flow

https://claude.ai/code/session_01VbeiqCo7jDVMYYi9dgp5kr

* feat: add CSV test submission generator API

Add backend endpoints for generating realistic test questionnaire
submissions with OpenAI-powered multilingual comments.

New endpoints:
- GET /admin/generate-submissions/status (lightweight pre-check)
- POST /admin/generate-submissions/preview (generate with comments)
- POST /admin/generate-submissions/commit (submit via QuestionnaireService)
- GET /admin/filters/faculty, courses, questionnaire-types, versions

Includes CommentGeneratorService with gpt-4o-mini integration and
fallback, AdminGenerateService with preview/commit flow, and 31
unit tests across 3 test suites.

---------

Co-authored-by: Claude <noreply@anthropic.com>

* FAC-115 fix: scope recommendation supporting evidence to pipeline submissions (#276) (#277)

TopicAssignment query now filters by submissionIds, preventing cross-faculty
evidence contamination. Replaced Topic.docCount with scoped assignment count
for accurate commentCount in evidence and confidence computation.

* [STAGING] FAC-116 to FAC-121 feat: Moodle seeding toolkit, tree explorer, audit trail, semester fix, bulk course provisioning, program filter enhancements (#289)

* FAC-116 feat: add Moodle seeding toolkit API (#279)

* FAC-116 feat: add Moodle seeding toolkit API

Add provisioning endpoints for creating Moodle categories, courses, and
users via REST API, replacing the manual Rust CLI workflow.

Closes #278

* chore: add bmad artifacts for Moodle seeding toolkit

* FAC-117 feat: add Moodle tree explorer API endpoints (#281)

* FAC-117 feat: add Moodle tree explorer API endpoints

Add read-only endpoints for browsing live Moodle category hierarchy
and course listings to support admin provisioning visibility.

* chore: add tech spec for moodle tree explorer

* FAC-118 feat: add audit trail query endpoints (#282)

* feat: add audit trail query endpoints

Add GET /audit-logs (paginated, filtered list) and GET /audit-logs/:id
(single record) endpoints for superadmin audit log visibility.

https://claude.ai/code/session_01D6jVaVQiXM5y8P8XmsmzG5

* fix: startup issue

---------

Co-authored-by: Claude <noreply@anthropic.com>

* FAC-119 fix: correct semester year derivation and add category preview endpoint (#284)

Fix wrong semester tag generation in category provisioning when a single
semester is selected (e.g., S22626 instead of S22526). Add ComputeSchoolYears
utility for school-year-aware year computation. Add POST categories/preview
endpoint with read-only hierarchy walk. Improve webservice_access_exception
error message with actionable hint.

* FAC-120 feat: enhance bulk course provisioning with cascading dropdowns (#286)

* FAC-120 feat: enhance bulk course provisioning with cascading dropdowns

Replace free-text inputs and CSV upload with cascading dropdown selectors
(Semester → Department → Program) and JSON-based bulk preview/execute
endpoints for course provisioning.

* FAC-120 chore: add tech spec for bulk course provisioning enhancement

* FAC-121 feat: add ProgramFilterOptionResponseDto with moodleCategoryId (#288)

* FAC-121 feat: add ProgramFilterOptionResponseDto with moodleCategoryId

Create standalone ProgramFilterOptionResponseDto that exposes moodleCategoryId
in the program filter response, enabling the admin frontend to derive Moodle
category IDs for course fetching via cascading dropdowns.

- Add ProgramFilterOptionResponseDto with static MapProgram() mapper
- Update GetPrograms() service and controller return types
- Add service-level spec for mapping verification
- Update controller spec with moodleCategoryId assertions

* chore: added tech spec

---------

Co-authored-by: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment