Verbessere Logging und Fehlerbehandlung
This commit is contained in:
parent
c737818ce4
commit
6e97d867de
14 changed files with 223 additions and 88 deletions
|
@ -3,6 +3,9 @@ package repositories
|
|||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"officeHours/models"
|
||||
)
|
||||
|
||||
|
@ -17,26 +20,17 @@ func NewCourseRepo(db *sql.DB) *CourseRepo {
|
|||
}
|
||||
|
||||
func (r *CourseRepo) FindByName(name string) (models.Course, error) {
|
||||
row := r.db.QueryRow("SELECT * FROM course WHERE name=?", name)
|
||||
var course models.Course
|
||||
if err := row.Scan(&course.Id, &course.Name); err != nil {
|
||||
return models.Course{}, err
|
||||
}
|
||||
return course, nil
|
||||
return r.getFromRow(r.db.QueryRow("SELECT * FROM course WHERE name=?", name))
|
||||
}
|
||||
|
||||
func (r *CourseRepo) FindById(id int) (models.Course, error) {
|
||||
row := r.db.QueryRow("SELECT * FROM course WHERE id=?", id)
|
||||
var course models.Course
|
||||
if err := row.Scan(&course.Id, &course.Name); err != nil {
|
||||
return models.Course{}, err
|
||||
}
|
||||
return course, nil
|
||||
return r.getFromRow(r.db.QueryRow("SELECT * FROM course WHERE id=?", id))
|
||||
}
|
||||
|
||||
func (r *CourseRepo) GetAll() ([]models.Course, error) {
|
||||
rows, err := r.db.Query("SELECT * FROM course")
|
||||
if err != nil {
|
||||
log.Printf("Error getting all courses: %s", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
@ -49,9 +43,22 @@ func (r *CourseRepo) getFromRows(rows *sql.Rows) ([]models.Course, error) {
|
|||
for rows.Next() {
|
||||
var course models.Course
|
||||
if err := rows.Scan(&course.Id, &course.Name); err != nil {
|
||||
log.Printf("Error scanning course row: %s", err.Error())
|
||||
return courses, err
|
||||
}
|
||||
courses = append(courses, course)
|
||||
}
|
||||
return courses, nil
|
||||
}
|
||||
|
||||
func (r *CourseRepo) getFromRow(row *sql.Row) (models.Course, error) {
|
||||
var course models.Course
|
||||
if err := row.Scan(&course.Id, &course.Name); err != nil {
|
||||
err = fmt.Errorf("Error getting course row: %w", err)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
log.Printf(err.Error())
|
||||
}
|
||||
return models.Course{}, err
|
||||
}
|
||||
return course, nil
|
||||
}
|
||||
|
|
|
@ -3,7 +3,9 @@ package repositories
|
|||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"officeHours/config"
|
||||
"officeHours/models"
|
||||
)
|
||||
|
@ -35,7 +37,11 @@ func (r *OfficeHourRepo) GetAll(activeOnly bool) ([]models.OfficeHour, error) {
|
|||
rows, err = r.db.Query("SELECT * FROM officeHour")
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error getting all officeHours from database: %s", err.Error())
|
||||
err = fmt.Errorf("Error getting all officeHours from database: %w", err)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
log.Println(err.Error())
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
return r.getFromRows(rows)
|
||||
|
@ -49,10 +55,14 @@ func (r *OfficeHourRepo) FindByCourse(course models.Course, activeOnly bool) ([]
|
|||
} else {
|
||||
rows, err = r.db.Query("SELECT * FROM officeHour WHERE course=?", course.Id)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error getting officeHours by course from database: %s", err.Error())
|
||||
}
|
||||
defer rows.Close()
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error getting officeHours by course from database: %w", err)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
log.Println(err.Error())
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return r.getFromRows(rows)
|
||||
}
|
||||
|
||||
|
@ -65,7 +75,11 @@ func (r *OfficeHourRepo) FindByRoom(room models.Room, activeOnly bool) ([]models
|
|||
rows, err = r.db.Query("SELECT * FROM officeHour WHERE room=?", room.Id)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error getting officeHours by room from database: %s", err.Error())
|
||||
err = fmt.Errorf("Error getting officeHours by room from database: %w", err)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
log.Println(err.Error())
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
return r.getFromRows(rows)
|
||||
|
@ -75,11 +89,16 @@ 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) {
|
||||
func (r *OfficeHourRepo) Add(officeHour models.OfficeHour) (int, error) {
|
||||
// Find correct tutor or add if not existent
|
||||
r.tutorRepo.Add(officeHour.Tutor)
|
||||
_, err := r.tutorRepo.Add(officeHour.Tutor)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
officeHour.Tutor, err = r.tutorRepo.FindByNameAndEmail(officeHour.Tutor.Name, officeHour.Tutor.Email)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Newly added tutor not found: %w", err)
|
||||
log.Println(err.Error())
|
||||
return 0, err
|
||||
}
|
||||
|
||||
|
@ -111,14 +130,19 @@ func (r *OfficeHourRepo) Add(officeHour models.OfficeHour) (id int, err error) {
|
|||
officeHour.Info,
|
||||
officeHour.Active,
|
||||
officeHour.Duration)
|
||||
id64, _ := sqlResult.LastInsertId()
|
||||
return int(id64), err
|
||||
id, lastInsertIdErr := sqlResult.LastInsertId()
|
||||
if lastInsertIdErr != nil {
|
||||
log.Printf("Error getting Id for new tutor: %s", lastInsertIdErr.Error())
|
||||
}
|
||||
return int(id), err
|
||||
}
|
||||
|
||||
func (r *OfficeHourRepo) Delete(officeHour models.OfficeHour) error {
|
||||
_, err := r.db.Exec("DELETE FROM officeHour WHERE id=?", officeHour.Id)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error deleting officeHour from database: %s", err.Error())
|
||||
err = fmt.Errorf("Error deleting officeHour from database: %w", err)
|
||||
log.Println(err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -128,12 +152,29 @@ func (r *OfficeHourRepo) getFromRow(row *sql.Row) (models.OfficeHour, error) {
|
|||
var week, day, hour, minute, tutorId, courseId, roomId int
|
||||
err := row.Scan(&officeHour.Id, &tutorId, &day, &hour, &minute, &roomId, &courseId, &week, &officeHour.Info, &officeHour.Active, &officeHour.Duration)
|
||||
if err != nil {
|
||||
return models.OfficeHour{}, fmt.Errorf("Error getting single officeHours row from database: %s", err.Error())
|
||||
err = fmt.Errorf("Error getting single officeHour row from database: %w", err)
|
||||
log.Println(err.Error())
|
||||
return models.OfficeHour{}, err
|
||||
}
|
||||
officeHour.Date = models.Date{Week: week, Day: day, Hour: hour, Minute: minute}
|
||||
officeHour.Room, _ = r.roomRepo.FindById(roomId)
|
||||
officeHour.Tutor, _ = r.tutorRepo.FindById(tutorId)
|
||||
officeHour.Course, _ = r.courseRepo.FindById(courseId)
|
||||
officeHour.Room, err = r.roomRepo.FindById(roomId)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error finding room by id %d for office hour: %w", roomId, err)
|
||||
log.Println(err.Error())
|
||||
return officeHour, err
|
||||
}
|
||||
officeHour.Tutor, err = r.tutorRepo.FindById(tutorId)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error finding tutor by id %d for office hour: %w", tutorId, err)
|
||||
log.Println(err.Error())
|
||||
return officeHour, err
|
||||
}
|
||||
officeHour.Course, err = r.courseRepo.FindById(courseId)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error finding course by id %d for office hour: %w", courseId, err)
|
||||
log.Println(err.Error())
|
||||
return officeHour, err
|
||||
}
|
||||
return officeHour, nil
|
||||
}
|
||||
|
||||
|
@ -142,13 +183,29 @@ func (r *OfficeHourRepo) getFromRows(rows *sql.Rows) ([]models.OfficeHour, error
|
|||
for rows.Next() {
|
||||
var officeHour models.OfficeHour
|
||||
var week, day, hour, minute, tutorId, roomId, courseId int
|
||||
var err error
|
||||
if err := rows.Scan(&officeHour.Id, &tutorId, &day, &hour, &minute, &roomId, &courseId, &week, &officeHour.Info, &officeHour.Active, &officeHour.Duration); err != nil {
|
||||
return officeHours, fmt.Errorf("Error getting multiple officeHour rows from database: %s", err.Error())
|
||||
return officeHours, fmt.Errorf("Error getting multiple officeHour rows from database: %w", err)
|
||||
}
|
||||
officeHour.Date = models.Date{Week: week, Day: day, Hour: hour, Minute: minute}
|
||||
officeHour.Room, _ = r.roomRepo.FindById(roomId)
|
||||
officeHour.Tutor, _ = r.tutorRepo.FindById(tutorId)
|
||||
officeHour.Course, _ = r.courseRepo.FindById(courseId)
|
||||
officeHour.Room, err = r.roomRepo.FindById(roomId)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error finding room by id %d for office hour: %w", roomId, err)
|
||||
log.Println(err.Error())
|
||||
return officeHours, err
|
||||
}
|
||||
officeHour.Tutor, err = r.tutorRepo.FindById(tutorId)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error finding tutor by id %d for office hour: %w", tutorId, err)
|
||||
log.Println(err.Error())
|
||||
return officeHours, err
|
||||
}
|
||||
officeHour.Course, err = r.courseRepo.FindById(courseId)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error finding course by id %d for office hour: %w", courseId, err)
|
||||
log.Println(err.Error())
|
||||
return officeHours, err
|
||||
}
|
||||
officeHours = append(officeHours, officeHour)
|
||||
}
|
||||
return officeHours, nil
|
||||
|
@ -163,7 +220,9 @@ func (r *OfficeHourRepo) NumberByTimeSpanAndRoom(date models.Date, duration int,
|
|||
rows, err = r.db.Query("SELECT * FROM officeHour WHERE room=?", room.Id)
|
||||
}
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("Error getting officeHours by timespan and room from database: %s", err.Error())
|
||||
err = fmt.Errorf("Error getting officeHours by timespan and room from database: %w", err)
|
||||
log.Println(err.Error())
|
||||
return 0, err
|
||||
}
|
||||
defer rows.Close()
|
||||
officeHours, err := r.getFromRows(rows)
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"bytes"
|
||||
"crypto/rand"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"math/big"
|
||||
|
@ -53,6 +54,8 @@ func (r *RequestRepo) FindByOfficeHour(officeHour models.OfficeHour) ([]models.R
|
|||
var request models.Request
|
||||
var officeHourId int
|
||||
if err := rows.Scan(&request.Id, &officeHourId, &request.Action, &request.Secret); err != nil {
|
||||
err = fmt.Errorf("Error scanning request row: %w", err)
|
||||
log.Println(err.Error())
|
||||
return requests, err
|
||||
}
|
||||
request.OfficeHour, err = r.officeHourRepo.FindById(officeHourId)
|
||||
|
@ -66,7 +69,7 @@ func (r *RequestRepo) FindByOfficeHour(officeHour models.OfficeHour) ([]models.R
|
|||
|
||||
func (r *RequestRepo) Add(officeHour models.OfficeHour, action int) (int, error) {
|
||||
existents, err := r.FindByOfficeHour(officeHour)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||
return 0, err
|
||||
}
|
||||
/* Resend confirmation mail if identical request exists,
|
||||
|
@ -100,10 +103,10 @@ func (r *RequestRepo) Execute(request models.Request) error {
|
|||
_, err = r.db.Exec("UPDATE officeHour SET active=true WHERE id=?", request.OfficeHour.Id)
|
||||
r.db.Exec("DELETE FROM request WHERE officeHour=?", request.OfficeHour.Id)
|
||||
case models.RequestDelete:
|
||||
r.officeHourRepo.Delete(request.OfficeHour)
|
||||
err = r.officeHourRepo.Delete(request.OfficeHour)
|
||||
r.db.Exec("DELETE FROM request WHERE officeHour=?", request.OfficeHour.Id)
|
||||
default:
|
||||
r.db.Exec("DELETE FROM request WHERE id=?", request.Id)
|
||||
_, err = r.db.Exec("DELETE FROM request WHERE id=?", request.Id)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
@ -112,10 +115,10 @@ func (r *RequestRepo) newSecret() (string, error) {
|
|||
var err error
|
||||
var secret string
|
||||
// find unused secret
|
||||
for err != sql.ErrNoRows {
|
||||
for !errors.Is(err, sql.ErrNoRows) {
|
||||
secret = randomString(r.config.Request.SecretLength)
|
||||
_, err = r.FindBySecret(secret)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
if err != nil && errors.Is(err, sql.ErrNoRows) {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
@ -130,7 +133,8 @@ func (r *RequestRepo) sendConfirmationMail(request models.Request) error {
|
|||
}{r.config, request}
|
||||
err := controllers.Templates.ExecuteTemplate(&message, "confirmationMail", data)
|
||||
if err != nil {
|
||||
log.Printf("Error parsing confirmation Mail: %s", err.Error())
|
||||
err = fmt.Errorf("Error parsing confirmation Mail: %w", err)
|
||||
log.Println(err.Error())
|
||||
return err
|
||||
}
|
||||
switch r.config.Mailer.Type {
|
||||
|
@ -142,7 +146,12 @@ func (r *RequestRepo) sendConfirmationMail(request models.Request) error {
|
|||
if r.config.Mailer.SmtpUseAuth {
|
||||
auth = smtp.PlainAuth(r.config.Mailer.SmtpIdentity, r.config.Mailer.FromAddress, r.config.Mailer.SmtpPassword, r.config.Mailer.SmtpHost)
|
||||
}
|
||||
return smtp.SendMail(fmt.Sprintf("%s:%d", r.config.Mailer.SmtpHost, r.config.Mailer.SmtpPort), auth, string(r.config.Mailer.FromName), to, message.Bytes())
|
||||
err = smtp.SendMail(fmt.Sprintf("%s:%d", r.config.Mailer.SmtpHost, r.config.Mailer.SmtpPort), auth, string(r.config.Mailer.FromName), to, message.Bytes())
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error sending mail by smtp: %w", err)
|
||||
log.Println(err.Error())
|
||||
}
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -154,7 +163,10 @@ func randomString(n int) string {
|
|||
|
||||
s := make([]rune, n)
|
||||
for i := range s {
|
||||
position, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
|
||||
position, err := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
|
||||
if err != nil {
|
||||
log.Printf("Error getting random position in randomString(n int): %s", err.Error())
|
||||
}
|
||||
s[i] = letters[position.Int64()]
|
||||
}
|
||||
return string(s)
|
||||
|
|
|
@ -3,6 +3,9 @@ package repositories
|
|||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"officeHours/models"
|
||||
)
|
||||
|
||||
|
@ -29,6 +32,10 @@ func (r *RoomRepo) FindById(id int) (models.Room, error) {
|
|||
row := r.db.QueryRow("SELECT * FROM room WHERE id=?", id)
|
||||
var room models.Room
|
||||
if err := row.Scan(&room.Id, &room.Name, &room.MaxOccupy); err != nil {
|
||||
err = fmt.Errorf("Error scanning row to get room: %w", err)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
log.Println(err.Error())
|
||||
}
|
||||
return models.Room{}, err
|
||||
}
|
||||
return room, nil
|
||||
|
@ -37,6 +44,8 @@ func (r *RoomRepo) FindById(id int) (models.Room, error) {
|
|||
func (r *RoomRepo) GetAll() ([]models.Room, error) {
|
||||
rows, err := r.db.Query("SELECT * FROM room")
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error getting all rooms: %w", err)
|
||||
log.Println(err.Error())
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
@ -45,15 +54,10 @@ func (r *RoomRepo) GetAll() ([]models.Room, error) {
|
|||
for rows.Next() {
|
||||
var room models.Room
|
||||
if err := rows.Scan(&room.Id, &room.Name, &room.MaxOccupy); err != nil {
|
||||
err = fmt.Errorf("Error scanning row to get room: %w", err)
|
||||
return rooms, err
|
||||
}
|
||||
rooms = append(rooms, room)
|
||||
}
|
||||
return rooms, nil
|
||||
}
|
||||
func (r *RoomRepo) Save(room models.Room) error {
|
||||
return nil
|
||||
}
|
||||
func (r *RoomRepo) Add(room models.Room) error {
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -3,6 +3,9 @@ package repositories
|
|||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"officeHours/models"
|
||||
)
|
||||
|
||||
|
@ -27,6 +30,8 @@ func (r *TutorRepo) FindByEmail(email string) ([]models.Tutor, error) {
|
|||
for rows.Next() {
|
||||
var tutor models.Tutor
|
||||
if err := rows.Scan(&tutor.Id, &tutor.Name, &tutor.Email); err != nil {
|
||||
err = fmt.Errorf("Error scanning tutor row: %w", err)
|
||||
log.Println(err.Error())
|
||||
return tutors, err
|
||||
}
|
||||
tutors = append(tutors, tutor)
|
||||
|
@ -63,23 +68,24 @@ func (r *TutorRepo) GetAll() ([]models.Tutor, error) {
|
|||
for rows.Next() {
|
||||
var tutor models.Tutor
|
||||
if err := rows.Scan(&tutor.Id, &tutor.Name, &tutor.Email); err != nil {
|
||||
err = fmt.Errorf("Error scanning tutor row: %w", err)
|
||||
log.Println(err.Error())
|
||||
return tutors, err
|
||||
}
|
||||
tutors = append(tutors, tutor)
|
||||
}
|
||||
return tutors, nil
|
||||
}
|
||||
func (r *TutorRepo) Save(tutor models.Tutor) error {
|
||||
return nil
|
||||
}
|
||||
func (r *TutorRepo) Add(tutor models.Tutor) (int, error) {
|
||||
//Don't add identical tutors
|
||||
existentTutor, err := r.FindByNameAndEmail(tutor.Name, tutor.Email)
|
||||
if err == sql.ErrNoRows {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
sqlResult, err := r.db.Exec("INSERT INTO `tutor` (name, email) VALUES (?,?)", tutor.Name, tutor.Email)
|
||||
id, _ := sqlResult.LastInsertId()
|
||||
id, lastInsertIdErr := sqlResult.LastInsertId()
|
||||
if lastInsertIdErr != nil {
|
||||
log.Printf("Error getting Id for new tutor: %s", lastInsertIdErr.Error())
|
||||
}
|
||||
return int(id), err
|
||||
}
|
||||
return existentTutor.Id, err
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue