refreshSyllabus method

Future<void> refreshSyllabus({
  1. required int offeringId,
  2. required String teacherId,
})

Fetches teacher teacherId's syllabus for offering offeringId and writes it back: content to a Syllabuses row (created on first fetch), instructor email to TeacherSemesters, and the shared header fields (course type, enrolled, withdrawn) to CourseOfferings. Deletes the row when the teacher hasn't submitted a syllabus (getSyllabus returns null).

No-ops when the offering/teacher is missing or the offering has no number; network errors propagate to the caller.

Implementation

Future<void> refreshSyllabus({
  required int offeringId,
  required String teacherId,
}) async {
  final offering = await (_database.select(
    _database.courseOfferings,
  )..where((o) => o.id.equals(offeringId))).getSingleOrNull();
  if (offering == null || offering.number == null) return;

  final teacher = await (_database.select(
    _database.teachers,
  )..where((t) => t.code.equals(teacherId))).getSingleOrNull();
  if (teacher == null) return;

  final syllabus = await _authRepository.withAuth(
    () => _courseService.getSyllabus(
      courseNumber: offering.number!,
      teacherId: teacherId,
    ),
    sso: [.courseService],
  );

  await _database.transaction(() async {
    if (syllabus == null) {
      // Teacher hasn't submitted a syllabus; drop any cached row.
      await (_database.delete(_database.syllabuses)..where(
            (s) =>
                s.courseOffering.equals(offeringId) &
                s.teacher.equals(teacher.id),
          ))
          .go();
      return;
    }

    await _database
        .into(_database.syllabuses)
        .insert(
          SyllabusesCompanion.insert(
            courseOffering: offeringId,
            teacher: teacher.id,
            updatedAt: Value(syllabus.lastUpdated),
            objective: Value(syllabus.objective),
            weeklyPlan: Value(syllabus.weeklyPlan),
            evaluation: Value(syllabus.evaluation),
            textbooks: Value(syllabus.materials),
            remarks: Value(syllabus.remarks),
          ),
          onConflict: DoUpdate(
            (_) => SyllabusesCompanion(
              updatedAt: Value(syllabus.lastUpdated),
              objective: Value(syllabus.objective),
              weeklyPlan: Value(syllabus.weeklyPlan),
              evaluation: Value(syllabus.evaluation),
              textbooks: Value(syllabus.materials),
              remarks: Value(syllabus.remarks),
            ),
            target: [
              _database.syllabuses.courseOffering,
              _database.syllabuses.teacher,
            ],
          ),
        );

    await (_database.update(
      _database.courseOfferings,
    )..where((o) => o.id.equals(offeringId))).write(
      CourseOfferingsCompanion(
        courseType: Value(syllabus.type),
        enrolled: Value(syllabus.enrolled),
        withdrawn: Value(syllabus.withdrawn),
        fetchedAt: Value(DateTime.now()),
      ),
    );

    await (_database.update(_database.teacherSemesters)..where(
          (ts) =>
              ts.teacher.equals(teacher.id) &
              ts.semester.equals(offering.semester),
        ))
        .write(TeacherSemestersCompanion(email: Value(syllabus.email)));
  });
}