Add instructor-only, selective Canvas material import on the Core course detail page so professors can choose which course files to sync into EduAI for RAG (Core chat), without bundling this into roster sync.
Scope
- Course page only: Show a separate Sync from Canvas button on the instructor course detail view when the course is Canvas-linked (
externalSource = canvas).
- Selective import: Opening the dialog auto-discovers Canvas files for that course; the instructor checks which files to import and clicks Sync selected (pre-check files not yet imported).
- Instructor-only (v1): No TA or student access to sync.
- Backend:
GET discover endpoint (list Canvas files + local import status) and POST sync endpoint (body: selected canvasFileIds only). Reuse existing CourseMaterial ingest + embedding pipeline (externalSource / externalId on CourseMaterial).
- Canvas sources (v1): Course Files API + module file items; supported mime types aligned with manual upload (PDF, DOCX, PPTX, TXT, MD).
- Tests: Unit tests for discover/sync services; integration tests with Canvas test-mode mocks (same pattern as
canvas.integration.test.ts).
Hours to complete (Week 7): 5.5
EPIC: #59
Add instructor-only, selective Canvas material import on the Core course detail page so professors can choose which course files to sync into EduAI for RAG (Core chat), without bundling this into roster sync.
Scope
externalSource = canvas).GETdiscover endpoint (list Canvas files + local import status) andPOSTsync endpoint (body: selectedcanvasFileIdsonly). Reuse existingCourseMaterialingest + embedding pipeline (externalSource/externalIdonCourseMaterial).canvas.integration.test.ts).Hours to complete (Week 7): 5.5
EPIC: #59