Listing new reservations

This commit is contained in:
vinchent 2024-07-24 14:20:30 +02:00
parent f93388a8e9
commit dafd6f21c0
8 changed files with 115 additions and 3 deletions

View File

@ -454,6 +454,7 @@ func (m *Repository) BookRoom(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/make-reservation", http.StatusSeeOther) http.Redirect(w, r, "/make-reservation", http.StatusSeeOther)
} }
// ShowLogin shows the login screen
func (m *Repository) ShowLogin(w http.ResponseWriter, r *http.Request) { func (m *Repository) ShowLogin(w http.ResponseWriter, r *http.Request) {
render.Template(w, r, "login.page.tmpl", &models.TemplateData{ render.Template(w, r, "login.page.tmpl", &models.TemplateData{
Form: forms.New(nil), 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{}) 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) { 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) { func (m *Repository) AdminAllReservations(w http.ResponseWriter, r *http.Request) {
reservations, err := m.DB.AllReservations() reservations, err := m.DB.AllReservations()
if err != nil { if err != nil {

View File

@ -45,6 +45,7 @@ type Reservation struct {
Room Room Room Room
ID int ID int
RoomID int RoomID int
Processed int
} }
// RoomRestriction is the room restriction model // RoomRestriction is the room restriction model

View File

@ -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, 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.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 from reservations r
left join rooms rm on (r.room_id = rm.id) left join rooms rm on (r.room_id = rm.id)
order by r.start_date asc` order by r.start_date asc`
@ -247,6 +247,54 @@ func (m *postgresDBRepo) AllReservations() ([]models.Reservation, error) {
&i.RoomID, &i.RoomID,
&i.CreatedAt, &i.CreatedAt,
&i.UpdatedAt, &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.ID,
&i.Room.RoomName, &i.Room.RoomName,
) )

View File

@ -88,3 +88,10 @@ func (m *testDBRepo) AllReservations() ([]models.Reservation, error) {
return reservations, nil 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
}

View File

@ -17,4 +17,5 @@ type DatabaseRepo interface {
UpdateUser(u models.User) error UpdateUser(u models.User) error
Authenticate(email, testPassword string) (int, string, error) Authenticate(email, testPassword string) (int, string, error)
AllReservations() ([]models.Reservation, error) AllReservations() ([]models.Reservation, error)
AllNewReservations() ([]models.Reservation, error)
} }

View File

@ -0,0 +1 @@
drop_column("reservations", "processed")

View File

@ -0,0 +1 @@
add_column("reservations", "processed", "integer", {"default": 0})

View File

@ -1,12 +1,52 @@
{{template "admin" .}} {{template "admin" .}}
{{define "css"}}
<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" type="text/css">
{{end}}
{{define "page-title"}} {{define "page-title"}}
New Reservations New Reservations
{{end}} {{end}}
{{define "content"}} {{define "content"}}
<div class="col-md-12"> <div class="col-md-12">
New Reservations content {{$res := index .Data "reservations"}}
<table class="table table-striped table-hover" id="new-res">
<thead>
<tr>
<th>ID</th>
<th>Last Name</th>
<th>Room</th>
<th>Arrival</th>
<th>Departure</th>
</tr>
</thead>
<tbody>
{{range $res}}
<tr>
<td>{{ .ID}}</td>
<td>
<a href="/admin/reservations/new/{{.ID}}">
{{ .LastName}}
</a>
</td>
<td>{{ .Room.RoomName}}</td>
<td>{{humanDate .StartDate}}</td>
<td>{{humanDate .EndDate}}</td>
</tr>
{{end}}
</tbody>
</table>
</div> </div>
{{end}} {{end}}
{{define "js"}}
<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" type="text/javascript"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const dataTable = new simpleDatatables.DataTable("#new-res", {
select: 3, sort: "desc",
});
})
</script>
{{end}}