diff --git a/Backend/models/booking.go b/Backend/models/booking.go index 2390fcb..3fb6361 100644 --- a/Backend/models/booking.go +++ b/Backend/models/booking.go @@ -2,6 +2,7 @@ package models import ( "database/sql" + "fmt" "log" "net/url" "strconv" @@ -22,6 +23,8 @@ type Booking struct { Id int `json:"id"` } +var DB *sql.DB + func (b Booking) New(card_id string, reader_id string, booking_type int) Booking { return Booking{ CardID: card_id, @@ -48,24 +51,81 @@ func (b Booking) Verify() bool { return true } -func (b Booking) Insert(db *sql.DB) error { - if !checkLastBooking(b, db) { +func (b *Booking) Insert() error { + if !checkLastBooking(*b) { return SameBookingError{} } - stmt, err := db.Prepare((`INSERT INTO zeiten (card_id, reader_id, booking_type) VALUES ($1, $2, $3)`)) + stmt, err := DB.Prepare((`INSERT INTO zeiten (card_id, reader_id, booking_type) VALUES ($1, $2, $3) RETURNING id, logged_time`)) if err != nil { return err } - _, err = stmt.Query(b.CardID, b.ReaderID, b.BookingType) + err = stmt.QueryRow(b.CardID, b.ReaderID, b.BookingType).Scan(&b.Id, &b.LoggedTime) if err != nil { return err } return nil } -func checkLastBooking(b Booking, db *sql.DB) bool { +func (b *Booking) GetBookingById(booking_id int) (Booking, error) { + var booking Booking + qStr, err := DB.Prepare((`SELECT id, logged_time, card_id, reader_id, booking_type FROM zeiten WHERE id = $1`)) + if err != nil { + return booking, err + } + err = qStr.QueryRow(booking_id).Scan(&booking.Id, &booking.LoggedTime, &booking.CardID, &booking.ReaderID, &booking.BookingType) + if err != nil { + return booking, err + } + if !booking.Verify() { + fmt.Printf("Booking verification failed") + return booking, nil + } + return booking, nil +} + +func (b *Booking) GetBookingsByCardID(card_id string) ([]Booking, error) { + qStr, err := DB.Prepare((`SELECT id, logged_time, card_id, reader_id, booking_type FROM zeiten WHERE card_id = $1`)) + if err != nil { + return nil, err + } + var bookings []Booking + rows, err := qStr.Query(card_id) + if err == sql.ErrNoRows { + return bookings, err + } + if err != nil { + return nil, err + } + defer rows.Close() + for rows.Next() { + var booking Booking + if err := rows.Scan(&booking.Id, &booking.LoggedTime, &booking.CardID, &booking.ReaderID, &booking.BookingType); err != nil { + return bookings, err + } + bookings = append(bookings, booking) + } + if err = rows.Err(); err != nil { + return bookings, err + } + return bookings, nil +} + +func (b Booking) Save() { + qStr, err := DB.Prepare((`UPDATE "zeiten" SET "id" = $1, "card_id" = $2, "reader_id" = $3, "booking_type" = $4 WHERE "id" = $1;`)) + if err != nil { + log.Fatalf("Error preparing query: %v", err) + return + } + _, err = qStr.Query(b.Id, b.CardID, b.ReaderID, b.BookingType) + if err != nil { + log.Fatalf("Error executing query: %v", err) + return + } +} + +func checkLastBooking(b Booking) 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;`)) + 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