63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package models
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"log"
|
|
)
|
|
|
|
type Booking struct {
|
|
CradID string `json:"cradID"`
|
|
ReaderID string `json:"readerID"`
|
|
BookingType int `json:"bookingTyp"`
|
|
}
|
|
|
|
type SameBookingError struct{}
|
|
|
|
func (e SameBookingError) Error() string {
|
|
return "the same booking already exists!"
|
|
}
|
|
|
|
func VerifyBooking(b Booking) bool {
|
|
if b.CradID == "" || b.ReaderID == "" || b.BookingType == 0 {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func InsertBooking(b Booking, db *sql.DB) error {
|
|
if !checkLastBooking(b, db) {
|
|
return fmt.Errorf("the same booking already exists")
|
|
}
|
|
stmt, err := db.Prepare((`INSERT INTO zeiten (card_id, reader_id, booking_type) VALUES ($1, $2, $3)`))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = stmt.Query(b.CradID, b.ReaderID, b.BookingType)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func checkLastBooking(b Booking, db *sql.DB) bool {
|
|
var booking_type int
|
|
stmt, err := db.Prepare((`SELECT booking_type FROM "zeiten" WHERE "card_id" = $1 ORDER BY "logged_time" DESC LIMIT 1;`))
|
|
if err != nil {
|
|
log.Fatalf("Error preparing query: %v", err)
|
|
return false
|
|
}
|
|
err = stmt.QueryRow(b.CradID).Scan(&booking_type)
|
|
if err == sql.ErrNoRows {
|
|
return true
|
|
}
|
|
if err!= nil {
|
|
log.Println("Error checking last booking: ", err)
|
|
return false
|
|
}
|
|
if booking_type == b.BookingType {
|
|
return false
|
|
}
|
|
return true
|
|
}
|