Compare commits
	
		
			2 Commits
		
	
	
		
			74e9fee942
			...
			b9f974cd1f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b9f974cd1f | |||
| 42a88034bf | 
@ -64,3 +64,65 @@ func (m *postgresDBRepo) InsertRoomRestriction(r models.RoomRestriction) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SearchAvailabilityByDatesByRoomID returns true if availability exists for roomID, and false if no availability
 | 
				
			||||||
 | 
					func (m *postgresDBRepo) SearchAvailabilityByDatesByRoomID(start, end time.Time, roomID int) (bool, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var numRows int
 | 
				
			||||||
 | 
						stmt := `select count(id) from room_restrictions
 | 
				
			||||||
 | 
					             where room_id = $1 and
 | 
				
			||||||
 | 
					             $2 < end_date and $3> start_date`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						row := m.DB.QueryRowContext(ctx, stmt, roomID, start, end)
 | 
				
			||||||
 | 
						err := row.Scan(&numRows)
 | 
				
			||||||
 | 
						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 *postgresDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]models.Room, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var rooms []models.Room
 | 
				
			||||||
 | 
						stmt := `select
 | 
				
			||||||
 | 
					                r.id, r.room_name
 | 
				
			||||||
 | 
					            from
 | 
				
			||||||
 | 
					                rooms r
 | 
				
			||||||
 | 
					            where r.id not in
 | 
				
			||||||
 | 
					                (select
 | 
				
			||||||
 | 
					                    roomId
 | 
				
			||||||
 | 
					                from
 | 
				
			||||||
 | 
					                    room_restrictions rr
 | 
				
			||||||
 | 
					                where
 | 
				
			||||||
 | 
					                    $1 < rr.end_date and $2> rr.start_date)`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rows, err := m.DB.QueryContext(ctx, stmt, start, end)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for rows.Next() {
 | 
				
			||||||
 | 
							var room models.Room
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err := rows.Scan(&room.ID, &room.RoomName)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return rooms, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							rooms = append(rooms, room)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err = rows.Err(); err != nil {
 | 
				
			||||||
 | 
							return rooms, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return rooms, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,15 @@
 | 
				
			|||||||
package repository
 | 
					package repository
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "go-udemy-web-1/internal/models"
 | 
					import (
 | 
				
			||||||
 | 
						"go-udemy-web-1/internal/models"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type DatabaseRepo interface {
 | 
					type DatabaseRepo interface {
 | 
				
			||||||
	AllUsers() bool
 | 
						AllUsers() bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	InsertReservation(res models.Reservation) (int, error)
 | 
						InsertReservation(res models.Reservation) (int, error)
 | 
				
			||||||
	InsertRoomRestriction(res models.RoomRestriction) error
 | 
						InsertRoomRestriction(res models.RoomRestriction) error
 | 
				
			||||||
 | 
						SearchAvailabilityByDatesByRoomID(start, end time.Time, roomID int) (bool, error)
 | 
				
			||||||
 | 
						SearchAvailabilityForAllRooms(start, end time.Time) ([]models.Room, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					change_column("room_restrictions", "reservation_id", "integer", {"null": false})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					change_column("room_restrictions", "reservation_id", "integer", {"null": true})
 | 
				
			||||||
@ -107,7 +107,7 @@ CREATE TABLE public.room_restrictions (
 | 
				
			|||||||
    start_date date NOT NULL,
 | 
					    start_date date NOT NULL,
 | 
				
			||||||
    end_date date NOT NULL,
 | 
					    end_date date NOT NULL,
 | 
				
			||||||
    room_id integer NOT NULL,
 | 
					    room_id integer NOT NULL,
 | 
				
			||||||
    reservation_id integer NOT NULL,
 | 
					    reservation_id integer,
 | 
				
			||||||
    restriction_id integer NOT NULL,
 | 
					    restriction_id integer NOT NULL,
 | 
				
			||||||
    created_at timestamp without time zone NOT NULL,
 | 
					    created_at timestamp without time zone NOT NULL,
 | 
				
			||||||
    updated_at timestamp without time zone NOT NULL
 | 
					    updated_at timestamp without time zone NOT NULL
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user