finish pgc impl
This commit is contained in:
		@ -194,6 +194,17 @@ func (q *Queries) AllRooms(ctx context.Context) ([]Room, error) {
 | 
				
			|||||||
	return items, nil
 | 
						return items, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const deleteBlockByID = `-- name: DeleteBlockByID :exec
 | 
				
			||||||
 | 
					DELETE FROM room_restrictions
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					  id = $1
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (q *Queries) DeleteBlockByID(ctx context.Context, id int32) error {
 | 
				
			||||||
 | 
						_, err := q.db.Exec(ctx, deleteBlockByID, id)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const deleteReservation = `-- name: DeleteReservation :exec
 | 
					const deleteReservation = `-- name: DeleteReservation :exec
 | 
				
			||||||
DELETE FROM reservations
 | 
					DELETE FROM reservations
 | 
				
			||||||
WHERE
 | 
					WHERE
 | 
				
			||||||
@ -264,6 +275,64 @@ func (q *Queries) GetReservationByID(ctx context.Context, id int32) (GetReservat
 | 
				
			|||||||
	return i, err
 | 
						return i, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getRestrictionsForRoomByDate = `-- name: GetRestrictionsForRoomByDate :many
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					  id,
 | 
				
			||||||
 | 
					  coalesce(reservation_id, 0),
 | 
				
			||||||
 | 
					  restriction_id,
 | 
				
			||||||
 | 
					  room_id,
 | 
				
			||||||
 | 
					  start_date,
 | 
				
			||||||
 | 
					  end_date
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					  room_restrictions
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					  $1 < end_date
 | 
				
			||||||
 | 
					  AND $2 >= start_date
 | 
				
			||||||
 | 
					  AND room_id = $3
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetRestrictionsForRoomByDateParams struct {
 | 
				
			||||||
 | 
						EndDate   pgtype.Date
 | 
				
			||||||
 | 
						StartDate pgtype.Date
 | 
				
			||||||
 | 
						RoomID    int32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetRestrictionsForRoomByDateRow struct {
 | 
				
			||||||
 | 
						ID            int32
 | 
				
			||||||
 | 
						ReservationID int32
 | 
				
			||||||
 | 
						RestrictionID int32
 | 
				
			||||||
 | 
						RoomID        int32
 | 
				
			||||||
 | 
						StartDate     pgtype.Date
 | 
				
			||||||
 | 
						EndDate       pgtype.Date
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (q *Queries) GetRestrictionsForRoomByDate(ctx context.Context, arg GetRestrictionsForRoomByDateParams) ([]GetRestrictionsForRoomByDateRow, error) {
 | 
				
			||||||
 | 
						rows, err := q.db.Query(ctx, getRestrictionsForRoomByDate, arg.EndDate, arg.StartDate, arg.RoomID)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer rows.Close()
 | 
				
			||||||
 | 
						var items []GetRestrictionsForRoomByDateRow
 | 
				
			||||||
 | 
						for rows.Next() {
 | 
				
			||||||
 | 
							var i GetRestrictionsForRoomByDateRow
 | 
				
			||||||
 | 
							if err := rows.Scan(
 | 
				
			||||||
 | 
								&i.ID,
 | 
				
			||||||
 | 
								&i.ReservationID,
 | 
				
			||||||
 | 
								&i.RestrictionID,
 | 
				
			||||||
 | 
								&i.RoomID,
 | 
				
			||||||
 | 
								&i.StartDate,
 | 
				
			||||||
 | 
								&i.EndDate,
 | 
				
			||||||
 | 
							); err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							items = append(items, i)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := rows.Err(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return items, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getRoomById = `-- name: GetRoomById :one
 | 
					const getRoomById = `-- name: GetRoomById :one
 | 
				
			||||||
SELECT
 | 
					SELECT
 | 
				
			||||||
  id,
 | 
					  id,
 | 
				
			||||||
@ -342,6 +411,41 @@ func (q *Queries) GetUserCred(ctx context.Context, email string) (GetUserCredRow
 | 
				
			|||||||
	return i, err
 | 
						return i, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const insertBlockForRoom = `-- name: InsertBlockForRoom :exec
 | 
				
			||||||
 | 
					INSERT INTO
 | 
				
			||||||
 | 
					  room_restrictions (
 | 
				
			||||||
 | 
					    start_date,
 | 
				
			||||||
 | 
					    end_date,
 | 
				
			||||||
 | 
					    room_id,
 | 
				
			||||||
 | 
					    restriction_id,
 | 
				
			||||||
 | 
					    created_at,
 | 
				
			||||||
 | 
					    updated_at
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					VALUES
 | 
				
			||||||
 | 
					  ($1, $2, $3, $4, $5, $6)
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type InsertBlockForRoomParams struct {
 | 
				
			||||||
 | 
						StartDate     pgtype.Date
 | 
				
			||||||
 | 
						EndDate       pgtype.Date
 | 
				
			||||||
 | 
						RoomID        int32
 | 
				
			||||||
 | 
						RestrictionID int32
 | 
				
			||||||
 | 
						CreatedAt     pgtype.Timestamp
 | 
				
			||||||
 | 
						UpdatedAt     pgtype.Timestamp
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (q *Queries) InsertBlockForRoom(ctx context.Context, arg InsertBlockForRoomParams) error {
 | 
				
			||||||
 | 
						_, err := q.db.Exec(ctx, insertBlockForRoom,
 | 
				
			||||||
 | 
							arg.StartDate,
 | 
				
			||||||
 | 
							arg.EndDate,
 | 
				
			||||||
 | 
							arg.RoomID,
 | 
				
			||||||
 | 
							arg.RestrictionID,
 | 
				
			||||||
 | 
							arg.CreatedAt,
 | 
				
			||||||
 | 
							arg.UpdatedAt,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const insertReservation = `-- name: InsertReservation :one
 | 
					const insertReservation = `-- name: InsertReservation :one
 | 
				
			||||||
INSERT INTO
 | 
					INSERT INTO
 | 
				
			||||||
  reservations (
 | 
					  reservations (
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ import (
 | 
				
			|||||||
	"database/sql"
 | 
						"database/sql"
 | 
				
			||||||
	"go-udemy-web-1/internal/config"
 | 
						"go-udemy-web-1/internal/config"
 | 
				
			||||||
	"go-udemy-web-1/internal/repository"
 | 
						"go-udemy-web-1/internal/repository"
 | 
				
			||||||
 | 
						"go-udemy-web-1/internal/repository/db"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type postgresDBRepo struct {
 | 
					type postgresDBRepo struct {
 | 
				
			||||||
@ -11,6 +12,11 @@ type postgresDBRepo struct {
 | 
				
			|||||||
	DB  *sql.DB
 | 
						DB  *sql.DB
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type pgcDBRepo struct {
 | 
				
			||||||
 | 
						App *config.AppConfig
 | 
				
			||||||
 | 
						Q   *db.Queries
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type testDBRepo struct {
 | 
					type testDBRepo struct {
 | 
				
			||||||
	App *config.AppConfig
 | 
						App *config.AppConfig
 | 
				
			||||||
	DB  *sql.DB
 | 
						DB  *sql.DB
 | 
				
			||||||
@ -28,3 +34,10 @@ func NewTestingRepo(a *config.AppConfig) repository.DatabaseRepo {
 | 
				
			|||||||
		App: a,
 | 
							App: a,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewPgcRepo(q *db.Queries, a *config.AppConfig) repository.DatabaseRepo {
 | 
				
			||||||
 | 
						return &pgcDBRepo{
 | 
				
			||||||
 | 
							App: a,
 | 
				
			||||||
 | 
							Q:   q,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										414
									
								
								internal/repository/dbrepo/pgc.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										414
									
								
								internal/repository/dbrepo/pgc.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,414 @@
 | 
				
			|||||||
 | 
					package dbrepo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"go-udemy-web-1/internal/models"
 | 
				
			||||||
 | 
						"go-udemy-web-1/internal/repository/db"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/jackc/pgx/v5/pgtype"
 | 
				
			||||||
 | 
						"golang.org/x/crypto/bcrypt"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) AllUsers() bool {
 | 
				
			||||||
 | 
						return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InsertReservation inserts a reservation into the database
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) InsertReservation(res models.Reservation) (int, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var newId int32
 | 
				
			||||||
 | 
						newId, err := m.Q.InsertReservation(ctx, db.InsertReservationParams{
 | 
				
			||||||
 | 
							FirstName: res.FirstName,
 | 
				
			||||||
 | 
							LastName:  res.LastName,
 | 
				
			||||||
 | 
							Email:     res.Email,
 | 
				
			||||||
 | 
							Phone:     res.Phone,
 | 
				
			||||||
 | 
							StartDate: pgtype.Date{Time: res.StartDate, Valid: true},
 | 
				
			||||||
 | 
							EndDate:   pgtype.Date{Time: res.EndDate, Valid: true},
 | 
				
			||||||
 | 
							RoomID:    int32(res.Room.ID),
 | 
				
			||||||
 | 
							CreatedAt: pgtype.Timestamp{Time: res.CreatedAt, Valid: true},
 | 
				
			||||||
 | 
							UpdatedAt: pgtype.Timestamp{Time: res.UpdatedAt, Valid: true},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return int(newId), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InsertRoomRestriction inserts a room restriction into the database
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) InsertRoomRestriction(r models.RoomRestriction) error {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := m.Q.InsertRoomRestriction(ctx, db.InsertRoomRestrictionParams{
 | 
				
			||||||
 | 
							StartDate:     pgtype.Date{Time: r.StartDate, Valid: true},
 | 
				
			||||||
 | 
							EndDate:       pgtype.Date{Time: r.EndDate, Valid: true},
 | 
				
			||||||
 | 
							RoomID:        int32(r.Room.ID),
 | 
				
			||||||
 | 
							ReservationID: pgtype.Int4{Int32: int32(r.ID), Valid: true},
 | 
				
			||||||
 | 
							RestrictionID: int32(r.RestrictionID),
 | 
				
			||||||
 | 
							CreatedAt:     pgtype.Timestamp{Time: r.CreatedAt, Valid: true},
 | 
				
			||||||
 | 
							UpdatedAt:     pgtype.Timestamp{Time: r.UpdatedAt, Valid: true},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SearchAvailabilityByDatesByRoomID returns true if availability exists for roomID, and false if no availability
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) SearchAvailabilityByDatesByRoomID(start, end time.Time, roomID int) (bool, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						numRows, err := m.Q.SearchAvailabilityByDatesByRoomID(ctx, db.SearchAvailabilityByDatesByRoomIDParams{
 | 
				
			||||||
 | 
							RoomID:    int32(roomID),
 | 
				
			||||||
 | 
							EndDate:   pgtype.Date{Time: start, Valid: true},
 | 
				
			||||||
 | 
							StartDate: pgtype.Date{Time: end, Valid: false},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return false, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if numRows == 0 {
 | 
				
			||||||
 | 
							return true, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SearchAvailabilityForAllRooms returns a slice of rooms, if any, for given date range
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]models.Room, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var rooms []models.Room
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rows, err := m.Q.SearchAvailabilityForAllRooms(ctx, db.SearchAvailabilityForAllRoomsParams{
 | 
				
			||||||
 | 
							EndDate:   pgtype.Date{Time: start, Valid: true},
 | 
				
			||||||
 | 
							StartDate: pgtype.Date{Time: start, Valid: true},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, row := range rows {
 | 
				
			||||||
 | 
							room := models.Room{
 | 
				
			||||||
 | 
								RoomName: row.RoomName,
 | 
				
			||||||
 | 
								ID:       int(row.ID),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							rooms = append(rooms, room)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return rooms, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetRoomById gets a room by id
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) GetRoomById(id int) (models.Room, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var room models.Room
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						row, err := m.Q.GetRoomById(ctx, int32(id))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return room, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						room = models.Room{
 | 
				
			||||||
 | 
							ID:       int(row.ID),
 | 
				
			||||||
 | 
							RoomName: row.RoomName,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return room, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetUserByID gets a user by id
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) GetUserByID(id int) (models.User, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var u models.User
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						row, err := m.Q.GetUserByID(ctx, int32(id))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return u, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u = models.User{
 | 
				
			||||||
 | 
							ID:          int(row.ID),
 | 
				
			||||||
 | 
							FirstName:   row.FirstName,
 | 
				
			||||||
 | 
							LastName:    row.LastName,
 | 
				
			||||||
 | 
							Email:       row.Email,
 | 
				
			||||||
 | 
							Password:    row.Password,
 | 
				
			||||||
 | 
							AccessLevel: int(row.AccessLevel),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return u, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UpdateUser updates a user in the database
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) UpdateUser(u models.User) error {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := m.Q.UpdateUser(ctx, db.UpdateUserParams{
 | 
				
			||||||
 | 
							FirstName:   u.FirstName,
 | 
				
			||||||
 | 
							LastName:    u.LastName,
 | 
				
			||||||
 | 
							Email:       u.Email,
 | 
				
			||||||
 | 
							AccessLevel: int32(u.AccessLevel),
 | 
				
			||||||
 | 
							UpdatedAt:   pgtype.Timestamp{Time: u.UpdatedAt, Valid: true},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Authenticate authenticates a user
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) Authenticate(email, testPassword string) (int, string, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var id int
 | 
				
			||||||
 | 
						var hashedPassword string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						row, err := m.Q.GetUserCred(ctx, email)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return id, "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						id = int(row.ID)
 | 
				
			||||||
 | 
						hashedPassword = row.Password
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(testPassword))
 | 
				
			||||||
 | 
						if err == bcrypt.ErrMismatchedHashAndPassword {
 | 
				
			||||||
 | 
							return 0, "", errors.New("incorrect password")
 | 
				
			||||||
 | 
						} else if err != nil {
 | 
				
			||||||
 | 
							return 0, "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return id, hashedPassword, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AllReservations returns a slice of all reservations
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) AllReservations() ([]models.Reservation, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var reservations []models.Reservation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rows, err := m.Q.AllReservations(ctx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, row := range rows {
 | 
				
			||||||
 | 
							r := models.Reservation{
 | 
				
			||||||
 | 
								StartDate: row.StartDate.Time,
 | 
				
			||||||
 | 
								EndDate:   row.EndDate.Time,
 | 
				
			||||||
 | 
								FirstName: row.FirstName,
 | 
				
			||||||
 | 
								LastName:  row.LastName,
 | 
				
			||||||
 | 
								Email:     row.Email,
 | 
				
			||||||
 | 
								Phone:     row.Phone,
 | 
				
			||||||
 | 
								Room:      models.Room{ID: int(row.RoomID), RoomName: row.RoomName.String},
 | 
				
			||||||
 | 
								ID:        int(row.ID),
 | 
				
			||||||
 | 
								RoomID:    int(row.RoomID),
 | 
				
			||||||
 | 
								Processed: int(row.Processed),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							reservations = append(reservations, r)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return reservations, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AllNewReservations returns a slice of all new reservations
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) AllNewReservations() ([]models.Reservation, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var reservations []models.Reservation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rows, err := m.Q.AllNewReservations(ctx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, row := range rows {
 | 
				
			||||||
 | 
							r := models.Reservation{
 | 
				
			||||||
 | 
								StartDate: row.StartDate.Time,
 | 
				
			||||||
 | 
								EndDate:   row.EndDate.Time,
 | 
				
			||||||
 | 
								FirstName: row.FirstName,
 | 
				
			||||||
 | 
								LastName:  row.LastName,
 | 
				
			||||||
 | 
								Email:     row.Email,
 | 
				
			||||||
 | 
								Phone:     row.Phone,
 | 
				
			||||||
 | 
								Room:      models.Room{ID: int(row.RoomID), RoomName: row.RoomName.String},
 | 
				
			||||||
 | 
								ID:        int(row.ID),
 | 
				
			||||||
 | 
								RoomID:    int(row.RoomID),
 | 
				
			||||||
 | 
								Processed: int(row.Processed),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							reservations = append(reservations, r)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return reservations, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetReservationByID returns one reservation by ID
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) GetReservationByID(id int) (models.Reservation, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var res models.Reservation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						row, err := m.Q.GetReservationByID(ctx, int32(id))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return res, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res = models.Reservation{
 | 
				
			||||||
 | 
							StartDate: row.StartDate.Time,
 | 
				
			||||||
 | 
							EndDate:   row.EndDate.Time,
 | 
				
			||||||
 | 
							FirstName: row.FirstName,
 | 
				
			||||||
 | 
							LastName:  row.LastName,
 | 
				
			||||||
 | 
							Email:     row.Email,
 | 
				
			||||||
 | 
							Phone:     row.Phone,
 | 
				
			||||||
 | 
							Room:      models.Room{ID: int(row.RoomID), RoomName: row.RoomName.String},
 | 
				
			||||||
 | 
							ID:        int(row.ID),
 | 
				
			||||||
 | 
							RoomID:    int(row.RoomID),
 | 
				
			||||||
 | 
							Processed: int(row.Processed),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return res, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UpdateReservation updates a user in the database
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) UpdateReservation(r models.Reservation) error {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := m.Q.UpdateReservation(ctx, db.UpdateReservationParams{
 | 
				
			||||||
 | 
							ID:        int32(r.ID),
 | 
				
			||||||
 | 
							FirstName: r.FirstName,
 | 
				
			||||||
 | 
							LastName:  r.LastName,
 | 
				
			||||||
 | 
							Email:     r.Email,
 | 
				
			||||||
 | 
							Phone:     r.Phone,
 | 
				
			||||||
 | 
							UpdatedAt: pgtype.Timestamp{Time: r.UpdatedAt, Valid: true},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) DeleteReservation(id int) error {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := m.Q.DeleteReservation(ctx, int32(id))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UpdateProcessedForReservation set processed for a reservation
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) UpdateProcessedForReservation(id, processed int) error {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := m.Q.UpdateProcessedForReservation(ctx, db.UpdateProcessedForReservationParams{
 | 
				
			||||||
 | 
							Processed: int32(processed),
 | 
				
			||||||
 | 
							ID:        int32(id),
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) AllRooms() ([]models.Room, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var rooms []models.Room
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rows, err := m.Q.AllRooms(ctx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, row := range rows {
 | 
				
			||||||
 | 
							room := models.Room{
 | 
				
			||||||
 | 
								RoomName: row.RoomName,
 | 
				
			||||||
 | 
								ID:       int(row.ID),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							rooms = append(rooms, room)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return rooms, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetRestrictionsForRoomByDate returns restrictions for a room by date range
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) GetRestrictionsForRoomByDate(roomId int, start, end time.Time) ([]models.RoomRestriction, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var restrictions []models.RoomRestriction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rows, err := m.Q.GetRestrictionsForRoomByDate(ctx, db.GetRestrictionsForRoomByDateParams{
 | 
				
			||||||
 | 
							EndDate:   pgtype.Date{Time: end, Valid: true},
 | 
				
			||||||
 | 
							StartDate: pgtype.Date{Time: start, Valid: true},
 | 
				
			||||||
 | 
							RoomID:    int32(roomId),
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return restrictions, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, row := range rows {
 | 
				
			||||||
 | 
							r := models.RoomRestriction{
 | 
				
			||||||
 | 
								StartDate:     row.StartDate.Time,
 | 
				
			||||||
 | 
								EndDate:       row.EndDate.Time,
 | 
				
			||||||
 | 
								ID:            int(row.ID),
 | 
				
			||||||
 | 
								RoomID:        int(row.RoomID),
 | 
				
			||||||
 | 
								ReservationID: int(row.ReservationID),
 | 
				
			||||||
 | 
								RestrictionID: int(row.RestrictionID),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							restrictions = append(restrictions, r)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return restrictions, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InsertBlockForRoom inserts a room restriction
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) InsertBlockForRoom(id int, startDate time.Time) error {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := m.Q.InsertBlockForRoom(ctx, db.InsertBlockForRoomParams{
 | 
				
			||||||
 | 
							StartDate:     pgtype.Date{Time: startDate, Valid: true},
 | 
				
			||||||
 | 
							EndDate:       pgtype.Date{Time: startDate.AddDate(0, 0, 1)},
 | 
				
			||||||
 | 
							RoomID:        int32(id),
 | 
				
			||||||
 | 
							RestrictionID: 2,
 | 
				
			||||||
 | 
							CreatedAt:     pgtype.Timestamp{Time: time.Now(), Valid: true},
 | 
				
			||||||
 | 
							UpdatedAt:     pgtype.Timestamp{Time: time.Now(), Valid: true},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeleteBlockByID deletes a block by ID
 | 
				
			||||||
 | 
					func (m *pgcDBRepo) DeleteBlockByID(id int) error {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := m.Q.DeleteBlockByID(ctx, int32(id))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -199,3 +199,36 @@ FROM
 | 
				
			|||||||
  rooms
 | 
					  rooms
 | 
				
			||||||
ORDER BY
 | 
					ORDER BY
 | 
				
			||||||
  room_name;
 | 
					  room_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- name: GetRestrictionsForRoomByDate :many
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					  id,
 | 
				
			||||||
 | 
					  coalesce(reservation_id, 0),
 | 
				
			||||||
 | 
					  restriction_id,
 | 
				
			||||||
 | 
					  room_id,
 | 
				
			||||||
 | 
					  start_date,
 | 
				
			||||||
 | 
					  end_date
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					  room_restrictions
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					  $1 < end_date
 | 
				
			||||||
 | 
					  AND $2 >= start_date
 | 
				
			||||||
 | 
					  AND room_id = $3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- name: InsertBlockForRoom :exec
 | 
				
			||||||
 | 
					INSERT INTO
 | 
				
			||||||
 | 
					  room_restrictions (
 | 
				
			||||||
 | 
					    start_date,
 | 
				
			||||||
 | 
					    end_date,
 | 
				
			||||||
 | 
					    room_id,
 | 
				
			||||||
 | 
					    restriction_id,
 | 
				
			||||||
 | 
					    created_at,
 | 
				
			||||||
 | 
					    updated_at
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					VALUES
 | 
				
			||||||
 | 
					  ($1, $2, $3, $4, $5, $6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- name: DeleteBlockByID :exec
 | 
				
			||||||
 | 
					DELETE FROM room_restrictions
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					  id = $1;
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user