watchStudentRoster method

Stream<CourseStudentRoster> watchStudentRoster(
  1. int courseOfferingId
)

Watches the cached I-School Plus student roster for courseOfferingId.

The fetch timestamp distinguishes a successfully cached empty roster from a roster that has never been fetched.

Implementation

Stream<CourseStudentRoster> watchStudentRoster(int courseOfferingId) {
  final query =
      _database.select(_database.courseOfferings).join([
          leftOuterJoin(
            _database.courseOfferingStudents,
            _database.courseOfferingStudents.courseOffering.equalsExp(
              _database.courseOfferings.id,
            ),
          ),
          leftOuterJoin(
            _database.students,
            _database.students.id.equalsExp(
              _database.courseOfferingStudents.student,
            ),
          ),
        ])
        ..where(_database.courseOfferings.id.equals(courseOfferingId))
        ..orderBy([OrderingTerm.asc(_database.students.studentId)]);

  return query.watch().map((rows) {
    if (rows.isEmpty) {
      return (students: const <Student>[], fetchedAt: null);
    }

    return (
      students: rows
          .map((row) => row.readTableOrNull(_database.students))
          .nonNulls
          .toList(growable: false),
      fetchedAt: rows.first
          .readTable(_database.courseOfferings)
          .studentRosterFetchedAt,
    );
  });
}