upsertTeacherSemester method

Future<int> upsertTeacherSemester({
  1. required String code,
  2. required int semesterId,
  3. required String nameZh,
  4. String? nameEn,
  5. String? email,
  6. int? departmentId,
  7. String? title,
  8. double? teachingHours,
  9. String? officeHoursNote,
  10. DateTime? fetchedAt,
})

Returns the ID of an existing teacher semester, or creates/updates one.

Implementation

Future<int> upsertTeacherSemester({
  required String code,
  required int semesterId,
  required String nameZh,
  String? nameEn,
  String? email,
  int? departmentId,
  String? title,
  double? teachingHours,
  String? officeHoursNote,
  DateTime? fetchedAt,
}) async {
  return transaction(() async {
    final teacher = await into(teachers).insertReturning(
      TeachersCompanion.insert(
        code: code,
        nameZh: nameZh,
        nameEn: Value(nameEn),
      ),
      onConflict: DoUpdate(
        (old) => TeachersCompanion(
          nameZh: Value(nameZh),
          nameEn: Value.absentIfNull(nameEn),
        ),
        target: [teachers.code],
      ),
    );

    final semesterProfile = await into(teacherSemesters).insertReturning(
      TeacherSemestersCompanion.insert(
        teacher: teacher.id,
        semester: semesterId,
        email: Value(email),
        department: Value(departmentId),
        title: Value(title),
        teachingHours: Value(teachingHours),
        officeHoursNote: Value(officeHoursNote),
        fetchedAt: Value.absentIfNull(fetchedAt),
      ),
      onConflict: DoUpdate(
        (old) => TeacherSemestersCompanion(
          teacher: Value(teacher.id),
          email: Value.absentIfNull(email),
          department: Value.absentIfNull(departmentId),
          title: Value.absentIfNull(title),
          teachingHours: Value.absentIfNull(teachingHours),
          officeHoursNote: Value.absentIfNull(officeHoursNote),
          fetchedAt: Value.absentIfNull(fetchedAt),
        ),
        target: [teacherSemesters.teacher, teacherSemesters.semester],
      ),
    );

    return semesterProfile.id;
  });
}