watchCourseOffering method

Stream<CourseOfferingDetail?> watchCourseOffering(
  1. 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 null when 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);
  }
}