refreshSyllabus method
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)));
});
}