// officeHour package repositories import ( "database/sql" "sprechstundentool/models" ) type OfficeHourRepo struct { db *sql.DB roomRepo *RoomRepo tutorRepo *TutorRepo courseRepo *CourseRepo } func NewOfficeHourRepo(db *sql.DB, roomRepo *RoomRepo, tutorRepo *TutorRepo, courseRepo *CourseRepo) *OfficeHourRepo { return &OfficeHourRepo{ db: db, roomRepo: roomRepo, tutorRepo: tutorRepo, courseRepo: courseRepo, } } func (r *OfficeHourRepo) GetAll(activeOnly bool) ([]models.OfficeHour, error) { var rows *sql.Rows var err error if activeOnly { rows, err = r.db.Query("SELECT * FROM officeHour WHERE active") } else { rows, err = r.db.Query("SELECT * FROM officeHour") } if err != nil { return nil, err } defer rows.Close() return r.getFromRows(rows) } func (r *OfficeHourRepo) FindByCourse(course models.Course, activeOnly bool) ([]models.OfficeHour, error) { var rows *sql.Rows var err error if activeOnly { rows, err = r.db.Query("SELECT * FROM officeHour WHERE course=? and active", course.Id) } else { rows, err = r.db.Query("SELECT * FROM officeHour WHERE course=?", course.Id) } if err != nil { return nil, err } defer rows.Close() return r.getFromRows(rows) } func (r *OfficeHourRepo) FindByRoom(room models.Room, activeOnly bool) ([]models.OfficeHour, error) { var rows *sql.Rows var err error if activeOnly { rows, err = r.db.Query("SELECT * FROM officeHour WHERE room=? AND active", room.Id) } else { rows, err = r.db.Query("SELECT * FROM officeHour WHERE room=?", room.Id) } if err != nil { return nil, err } defer rows.Close() return r.getFromRows(rows) } func (r *OfficeHourRepo) FindById(id int) (models.OfficeHour, error) { return r.getFromRow(r.db.QueryRow("SELECT * FROM officeHour WHERE id=?", id)) } func (r *OfficeHourRepo) Add(officeHour models.OfficeHour) (id int, err error) { // Find correct tutor or add if not existent r.tutorRepo.Add(officeHour.Tutor) officeHour.Tutor, err = r.tutorRepo.FindByNameAndEmail(officeHour.Tutor.Name, officeHour.Tutor.Email) if err != nil { return 0, err } //Don't add identical officeHours officeHours, err := r.FindByCourse(officeHour.Course, false) if err != nil { return 0, err } for _, oldOfficeHour := range officeHours { if officeHour.Tutor == oldOfficeHour.Tutor && officeHour.Date == oldOfficeHour.Date && officeHour.Room == oldOfficeHour.Room && // officeHour.Course == oldOfficeHour.Course && already filtered above officeHour.Info == oldOfficeHour.Info && officeHour.Active == oldOfficeHour.Active && officeHour.Duration == oldOfficeHour.Duration { return officeHour.Id, nil } } sqlResult, err := r.db.Exec("INSERT INTO `officeHour` (tutor, day, hour, minute, room, course, week, info, active, duration) VALUES (?,?,?,?,?,?,?,?,?,?)", officeHour.Tutor.Id, officeHour.Date.Day, officeHour.Date.Hour, officeHour.Date.Minute, officeHour.Room.Id, officeHour.Course.Id, officeHour.Date.Week, officeHour.Info, officeHour.Active, officeHour.Duration) id64, _ := sqlResult.LastInsertId() return int(id64), err } func (r *OfficeHourRepo) Delete(officeHour models.OfficeHour) error { return nil } func (r *OfficeHourRepo) getFromRow(row *sql.Row) (models.OfficeHour, error) { var officeHour models.OfficeHour var week, day, hour, minute, tutorid int var roomName, courseName string err := row.Scan(&officeHour.Id, &tutorid, &day, &hour, &minute, &roomName, &courseName, &week, &officeHour.Info, &officeHour.Active, &officeHour.Duration) if err != nil { return models.OfficeHour{}, err } officeHour.Date = models.Date{week, day, hour, minute} officeHour.Room, _ = r.roomRepo.FindByName(roomName) officeHour.Tutor, _ = r.tutorRepo.FindById(tutorid) officeHour.Course, _ = r.courseRepo.FindByName(courseName) return officeHour, nil } func (r *OfficeHourRepo) getFromRows(rows *sql.Rows) ([]models.OfficeHour, error) { var officeHours []models.OfficeHour for rows.Next() { var officeHour models.OfficeHour var week, day, hour, minute, tutorId, roomId, courseId int if err := rows.Scan(&officeHour.Id, &tutorId, &day, &hour, &minute, &roomId, &courseId, &week, &officeHour.Info, &officeHour.Active, &officeHour.Duration); err != nil { return officeHours, err } officeHour.Date = models.Date{week, day, hour, minute} officeHour.Room, _ = r.roomRepo.FindById(roomId) officeHour.Tutor, _ = r.tutorRepo.FindById(tutorId) officeHour.Course, _ = r.courseRepo.FindById(courseId) officeHours = append(officeHours, officeHour) } return officeHours, nil }