diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index fa95dc8..3807643 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -454,6 +454,7 @@ func (m *Repository) BookRoom(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/make-reservation", http.StatusSeeOther) } +// ShowLogin shows the login screen func (m *Repository) ShowLogin(w http.ResponseWriter, r *http.Request) { render.Template(w, r, "login.page.tmpl", &models.TemplateData{ Form: forms.New(nil), @@ -508,10 +509,22 @@ func (m *Repository) AdminDashboard(w http.ResponseWriter, r *http.Request) { render.Template(w, r, "admin-dashboard.page.tmpl", &models.TemplateData{}) } +// AdminNewReservations shows all new reservations in admin tool func (m *Repository) AdminNewReservations(w http.ResponseWriter, r *http.Request) { - render.Template(w, r, "admin-new-reservations.page.tmpl", &models.TemplateData{}) + reservations, err := m.DB.AllNewReservations() + if err != nil { + helpers.ServerError(w, err) + return + } + data := make(map[string]interface{}) + data["reservations"] = reservations + + render.Template(w, r, "admin-new-reservations.page.tmpl", &models.TemplateData{ + Data: data, + }) } +// AdminNewReservations shows all reservations in admin tool func (m *Repository) AdminAllReservations(w http.ResponseWriter, r *http.Request) { reservations, err := m.DB.AllReservations() if err != nil { diff --git a/internal/models/models.go b/internal/models/models.go index b1167ce..65d7c1e 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -45,6 +45,7 @@ type Reservation struct { Room Room ID int RoomID int + Processed int } // RoomRestriction is the room restriction model diff --git a/internal/repository/dbrepo/postgres.go b/internal/repository/dbrepo/postgres.go index ec0708b..882e9ce 100644 --- a/internal/repository/dbrepo/postgres.go +++ b/internal/repository/dbrepo/postgres.go @@ -223,7 +223,7 @@ func (m *postgresDBRepo) AllReservations() ([]models.Reservation, error) { query := `select r.id, r.first_name, r.last_name, r.email, r.phone, r.start_date, r.end_date, r.room_id, r.created_at, - r.updated_at, rm.id, rm.room_name + r.updated_at, r.processed, rm.id, rm.room_name from reservations r left join rooms rm on (r.room_id = rm.id) order by r.start_date asc` @@ -247,6 +247,54 @@ func (m *postgresDBRepo) AllReservations() ([]models.Reservation, error) { &i.RoomID, &i.CreatedAt, &i.UpdatedAt, + &i.Processed, + &i.Room.ID, + &i.Room.RoomName, + ) + if err != nil { + return reservations, err + } + reservations = append(reservations, i) + } + + return reservations, nil +} + +// AllNewReservations returns a slice of all new reservations +func (m *postgresDBRepo) AllNewReservations() ([]models.Reservation, error) { + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + var reservations []models.Reservation + + query := `select r.id, r.first_name, r.last_name, r.email, r.phone, + r.start_date, r.end_date, r.room_id, r.created_at, + r.updated_at, r.processed, rm.id, rm.room_name + from reservations r + left join rooms rm on (r.room_id = rm.id) + where r.processed = 0 + order by r.start_date asc` + + rows, err := m.DB.QueryContext(ctx, query) + if err != nil { + return reservations, err + } + defer rows.Close() // To avoid memory leak + + for rows.Next() { + var i models.Reservation + err := rows.Scan( + &i.ID, + &i.FirstName, + &i.LastName, + &i.Email, + &i.Phone, + &i.StartDate, + &i.EndDate, + &i.RoomID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Processed, &i.Room.ID, &i.Room.RoomName, ) diff --git a/internal/repository/dbrepo/test-repo.go b/internal/repository/dbrepo/test-repo.go index d028b4a..bfff4c3 100644 --- a/internal/repository/dbrepo/test-repo.go +++ b/internal/repository/dbrepo/test-repo.go @@ -88,3 +88,10 @@ func (m *testDBRepo) AllReservations() ([]models.Reservation, error) { return reservations, nil } + +// AllNewReservations returns a slice of all new reservations +func (m *testDBRepo) AllNewReservations() ([]models.Reservation, error) { + var reservations []models.Reservation + + return reservations, nil +} diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 7ae6612..2dd597b 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -17,4 +17,5 @@ type DatabaseRepo interface { UpdateUser(u models.User) error Authenticate(email, testPassword string) (int, string, error) AllReservations() ([]models.Reservation, error) + AllNewReservations() ([]models.Reservation, error) } diff --git a/migrations/20240724120444_add_processed_to_reservations_table.down.fizz b/migrations/20240724120444_add_processed_to_reservations_table.down.fizz new file mode 100644 index 0000000..0fb3b86 --- /dev/null +++ b/migrations/20240724120444_add_processed_to_reservations_table.down.fizz @@ -0,0 +1 @@ +drop_column("reservations", "processed") diff --git a/migrations/20240724120444_add_processed_to_reservations_table.up.fizz b/migrations/20240724120444_add_processed_to_reservations_table.up.fizz new file mode 100644 index 0000000..7678400 --- /dev/null +++ b/migrations/20240724120444_add_processed_to_reservations_table.up.fizz @@ -0,0 +1 @@ +add_column("reservations", "processed", "integer", {"default": 0}) diff --git a/templates/admin-new-reservations.page.tmpl b/templates/admin-new-reservations.page.tmpl index f2b2b14..2153be0 100644 --- a/templates/admin-new-reservations.page.tmpl +++ b/templates/admin-new-reservations.page.tmpl @@ -1,12 +1,52 @@ {{template "admin" .}} +{{define "css"}} + +{{end}} + {{define "page-title"}} New Reservations {{end}} {{define "content"}}
- New Reservations content + {{$res := index .Data "reservations"}} + + + + + + + + + + + + {{range $res}} + + + + + + + + {{end}} + +
IDLast NameRoomArrivalDeparture
{{ .ID}} + + {{ .LastName}} + + {{ .Room.RoomName}}{{humanDate .StartDate}}{{humanDate .EndDate}}
{{end}} +{{define "js"}} + + +{{end}}