144 lines
3.8 KiB
Go
144 lines
3.8 KiB
Go
|
|
package controllers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"database/sql"
|
||
|
|
"errors"
|
||
|
|
"github.com/jmoiron/sqlx"
|
||
|
|
"go_project/internal/models"
|
||
|
|
"log"
|
||
|
|
)
|
||
|
|
|
||
|
|
type (
|
||
|
|
ListBookingParams struct {
|
||
|
|
Limit int `db:"limit" json:"limit"`
|
||
|
|
Offset int `db:"offset" json:"offset"`
|
||
|
|
}
|
||
|
|
|
||
|
|
CreateBookingParams struct {
|
||
|
|
IdTables int `db:"id_tables" json:"id_tables"`
|
||
|
|
Reservation string `db:"reservation" json:"reservation"`
|
||
|
|
TimeReserve string `db:"time_reserve" json:"time_reserve"`
|
||
|
|
WhoBooked string `db:"who_booked" json:"who_booked"`
|
||
|
|
}
|
||
|
|
|
||
|
|
UpdateBookingParams struct {
|
||
|
|
Id int `db:"id" json:"id"`
|
||
|
|
IdTables int `db:"id_tables" json:"id_tables"`
|
||
|
|
Reservation string `db:"reservation" json:"reservation"`
|
||
|
|
TimeReserve string `db:"time_reserve" json:"time_reserve"`
|
||
|
|
WhoBooked string `db:"who_booked" json:"who_booked"`
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
func BookingById(db *sqlx.DB, id int) (*models.Booking, error) {
|
||
|
|
rows, err := db.Query("SELECT * FROM Bookings WHERE id = ?", id)
|
||
|
|
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
defer rows.Close()
|
||
|
|
|
||
|
|
if isEmpty := !rows.Next(); isEmpty {
|
||
|
|
return nil, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
result := new(models.Booking)
|
||
|
|
err = rows.Scan(&result.Id, &result.IdTables, &result.ReservationDatetime, &result.TimeReserve, &result.WhoBooked)
|
||
|
|
|
||
|
|
return result, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func AllBookings(db *sqlx.DB, params ListBookingParams) ([]models.Booking, error) {
|
||
|
|
query := `SELECT * FROM Bookings ORDER BY id LIMIT $1 OFFSET $2`
|
||
|
|
|
||
|
|
rows, err := db.Query(query, params.Limit, params.Offset)
|
||
|
|
|
||
|
|
if err == sql.ErrNoRows {
|
||
|
|
return nil, nil
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
defer rows.Close()
|
||
|
|
|
||
|
|
var result []models.Booking
|
||
|
|
for rows.Next() {
|
||
|
|
var currentBooking models.Booking
|
||
|
|
|
||
|
|
err = rows.Scan(¤tBooking.Id, ¤tBooking.IdTables, ¤tBooking.ReservationDatetime, ¤tBooking.TimeReserve, ¤tBooking.WhoBooked)
|
||
|
|
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
result = append(result, currentBooking)
|
||
|
|
}
|
||
|
|
return result, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func CreateBooking(db *sqlx.DB, params CreateBookingParams) (*models.Booking, error) {
|
||
|
|
query := `
|
||
|
|
INSERT INTO Bookings (id_tables, reservation, time_reserve, who_booked)
|
||
|
|
VALUES ($1, $2, $3, $4)
|
||
|
|
RETURNING id, id_tables, reservation, time_reserve, who_booked
|
||
|
|
`
|
||
|
|
|
||
|
|
var result models.Booking
|
||
|
|
|
||
|
|
err := db.QueryRow(query,
|
||
|
|
params.IdTables,
|
||
|
|
params.Reservation,
|
||
|
|
params.TimeReserve,
|
||
|
|
params.WhoBooked,
|
||
|
|
).Scan(
|
||
|
|
&result.Id,
|
||
|
|
&result.IdTables,
|
||
|
|
&result.ReservationDatetime,
|
||
|
|
&result.TimeReserve,
|
||
|
|
&result.WhoBooked,
|
||
|
|
)
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("CreateBooking: Insertion operation of the Bookings object is failed: %v\n", err)
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
log.Println("CreateBooking: Insertion operation of the Bookings object is successful")
|
||
|
|
return &result, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func DeleteBookingById(db *sqlx.DB, id int) (sql.Result, error) {
|
||
|
|
sqlResult, err := db.Exec("DELETE FROM Bookings WHERE id = ?", id)
|
||
|
|
|
||
|
|
if err == nil {
|
||
|
|
log.Println("DeleteBookingById: Deletion operation of the Bookings object is successful")
|
||
|
|
}
|
||
|
|
|
||
|
|
return sqlResult, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func UpdateBooking(db *sqlx.DB, params UpdateBookingParams) (*models.Booking, error) {
|
||
|
|
query := `
|
||
|
|
UPDATE Bookings
|
||
|
|
SET id_tables = $1, reservation = $2, time_reserve = $3
|
||
|
|
WHERE id = $4
|
||
|
|
RETURNING id, id_tables, reservation, time_reserve, who_booked
|
||
|
|
`
|
||
|
|
|
||
|
|
result := &models.Booking{}
|
||
|
|
err := db.QueryRow(query, params.IdTables, params.Reservation, params.TimeReserve, params.Id).
|
||
|
|
Scan(&result.Id, &result.IdTables, &result.ReservationDatetime, &result.TimeReserve, &result.WhoBooked)
|
||
|
|
if err != nil {
|
||
|
|
switch {
|
||
|
|
case err == sql.ErrNoRows:
|
||
|
|
log.Printf("UpdateBooking: No rows affected for Booking ID %d", params.Id)
|
||
|
|
return nil, errors.New("update failed: no rows affected")
|
||
|
|
default:
|
||
|
|
log.Printf("UpdateBooking: Error executing query for Booking ID %d: %v", params.Id, err)
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
log.Printf("UpdateBooking: Successfully updated Booking ID %d", result.Id)
|
||
|
|
return result, nil
|
||
|
|
}
|