refreshSemesters method

Future<void> refreshSemesters()

Fetches fresh semester data from network and writes to DB.

The watchSemesters stream automatically emits the updated value. Network errors propagate to the caller.

Implementation

Future<void> refreshSemesters() async {
  final dtos = await _authRepository.withAuth(
    _courseService.getCourseSemesterList,
    sso: [.courseService],
  );

  await _database.transaction(() async {
    final fetchedSemesterIds = <int>{};
    for (final dto in dtos) {
      if (dto case (year: final year?, term: final term?)) {
        final semester = await _database.getOrCreateSemester(
          year,
          term,
          inCourseSemesterList: true,
        );
        fetchedSemesterIds.add(semester.id);
      }
    }

    // Keep membership flag in sync with the latest course semester response.
    // Skip on empty.
    if (fetchedSemesterIds.isNotEmpty) {
      await (_database.update(_database.semesters)..where(
            (s) =>
                s.inCourseSemesterList.equals(true) &
                s.id.isNotIn(fetchedSemesterIds),
          ))
          .write(
            const SemestersCompanion(inCourseSemesterList: Value(false)),
          );
    }

    await (_database.update(_database.users)).write(
      UsersCompanion(semestersFetchedAt: Value(DateTime.now())),
    );
  });
}