watchCourseOffering method
- String number
Watches a course offering's joined detail (overview + schedule + teachers
- classes), selected by its course number (課號) and composed from the
database — no network. A teacher's syllabus is fetched separately via
watchSyllabus. Emits
nullwhen the offering is missing; re-emits when a syllabus refresh writes the offering's header fields.
Course numbers are only unique per semester, so the newest semester wins when the same number was reused across semesters.
Implementation
Stream<CourseOfferingDetail?> watchCourseOffering(String number) async* {
final overviews = _database.courseOfferingOverviews;
final query =
_database.select(overviews).join([
innerJoin(
_database.semesters,
_database.semesters.id.equalsExp(overviews.semester),
),
])
..where(overviews.number.equals(number))
..orderBy([
.desc(_database.semesters.year),
.desc(_database.semesters.term),
])
..limit(1);
await for (final rows in query.watch()) {
final overview = rows.firstOrNull?.readTable(overviews);
if (overview == null) {
yield null;
continue;
}
yield await _readCourseOfferingDetail(overview);
}
}