Listing all reservations
This commit is contained in:
parent
b34c217d98
commit
f93388a8e9
@ -38,7 +38,7 @@ func routes(app *config.AppConfig) http.Handler {
|
|||||||
mux.Handle("/static/*", http.StripPrefix("/static", fileServer))
|
mux.Handle("/static/*", http.StripPrefix("/static", fileServer))
|
||||||
|
|
||||||
mux.Route("/admin", func(mux chi.Router) {
|
mux.Route("/admin", func(mux chi.Router) {
|
||||||
mux.Use(Auth)
|
// mux.Use(Auth)
|
||||||
mux.Get("/dashboard", handlers.Repo.AdminDashboard)
|
mux.Get("/dashboard", handlers.Repo.AdminDashboard)
|
||||||
|
|
||||||
mux.Get("/reservations-new", handlers.Repo.AdminNewReservations)
|
mux.Get("/reservations-new", handlers.Repo.AdminNewReservations)
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"go-udemy-web-1/internal/config"
|
"go-udemy-web-1/internal/config"
|
||||||
"go-udemy-web-1/internal/driver"
|
"go-udemy-web-1/internal/driver"
|
||||||
"go-udemy-web-1/internal/forms"
|
"go-udemy-web-1/internal/forms"
|
||||||
|
"go-udemy-web-1/internal/helpers"
|
||||||
"go-udemy-web-1/internal/models"
|
"go-udemy-web-1/internal/models"
|
||||||
"go-udemy-web-1/internal/render"
|
"go-udemy-web-1/internal/render"
|
||||||
"go-udemy-web-1/internal/repository"
|
"go-udemy-web-1/internal/repository"
|
||||||
@ -512,7 +513,17 @@ func (m *Repository) AdminNewReservations(w http.ResponseWriter, r *http.Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *Repository) AdminAllReservations(w http.ResponseWriter, r *http.Request) {
|
func (m *Repository) AdminAllReservations(w http.ResponseWriter, r *http.Request) {
|
||||||
render.Template(w, r, "admin-all-reservations.page.tmpl", &models.TemplateData{})
|
reservations, err := m.DB.AllReservations()
|
||||||
|
if err != nil {
|
||||||
|
helpers.ServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data := make(map[string]interface{})
|
||||||
|
data["reservations"] = reservations
|
||||||
|
|
||||||
|
render.Template(w, r, "admin-all-reservations.page.tmpl", &models.TemplateData{
|
||||||
|
Data: data,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Repository) AdminReservationsCalendar(w http.ResponseWriter, r *http.Request) {
|
func (m *Repository) AdminReservationsCalendar(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -10,11 +10,14 @@ import (
|
|||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/justinas/nosurf"
|
"github.com/justinas/nosurf"
|
||||||
)
|
)
|
||||||
|
|
||||||
var functions = template.FuncMap{}
|
var functions = template.FuncMap{
|
||||||
|
"humanDate": HumanDate,
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
app *config.AppConfig
|
app *config.AppConfig
|
||||||
@ -26,6 +29,11 @@ func NewRenderer(a *config.AppConfig) {
|
|||||||
app = a
|
app = a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HumanDate returns formatted time
|
||||||
|
func HumanDate(t time.Time) string {
|
||||||
|
return t.Format("2006-01-02")
|
||||||
|
}
|
||||||
|
|
||||||
// AddDefaultData adds default template data
|
// AddDefaultData adds default template data
|
||||||
func AddDefaultData(td *models.TemplateData, r *http.Request) *models.TemplateData {
|
func AddDefaultData(td *models.TemplateData, r *http.Request) *models.TemplateData {
|
||||||
td.Flash = app.Session.PopString(r.Context(), "flash")
|
td.Flash = app.Session.PopString(r.Context(), "flash")
|
||||||
|
@ -113,6 +113,8 @@ func (m *postgresDBRepo) SearchAvailabilityForAllRooms(start, end time.Time) ([]
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var room models.Room
|
var room models.Room
|
||||||
|
|
||||||
@ -211,3 +213,48 @@ func (m *postgresDBRepo) Authenticate(email, testPassword string) (int, string,
|
|||||||
}
|
}
|
||||||
return id, hashedPassword, nil
|
return id, hashedPassword, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AllReservations returns a slice of all reservations
|
||||||
|
func (m *postgresDBRepo) AllReservations() ([]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, rm.id, rm.room_name
|
||||||
|
from reservations r
|
||||||
|
left join rooms rm on (r.room_id = rm.id)
|
||||||
|
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.Room.ID,
|
||||||
|
&i.Room.RoomName,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return reservations, err
|
||||||
|
}
|
||||||
|
reservations = append(reservations, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
return reservations, nil
|
||||||
|
}
|
||||||
|
@ -81,3 +81,10 @@ func (m *testDBRepo) UpdateUser(u models.User) error {
|
|||||||
func (m *testDBRepo) Authenticate(email, testPassword string) (int, string, error) {
|
func (m *testDBRepo) Authenticate(email, testPassword string) (int, string, error) {
|
||||||
return 1, "", nil
|
return 1, "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AllReservations returns a slice of all reservations
|
||||||
|
func (m *testDBRepo) AllReservations() ([]models.Reservation, error) {
|
||||||
|
var reservations []models.Reservation
|
||||||
|
|
||||||
|
return reservations, nil
|
||||||
|
}
|
||||||
|
@ -16,4 +16,5 @@ type DatabaseRepo interface {
|
|||||||
GetUserByID(id int) (models.User, error)
|
GetUserByID(id int) (models.User, error)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,53 @@
|
|||||||
{{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"}}
|
||||||
All Reservations
|
All Reservations
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{define "content"}}
|
{{define "content"}}
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
All Reservations content
|
{{$res := index .Data "reservations"}}
|
||||||
|
<table class="table table-striped table-hover" id="all-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/all/{{.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("#all-res", {
|
||||||
|
select: 3, sort: "desc",
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
@ -18,6 +18,11 @@
|
|||||||
<!-- endinject -->
|
<!-- endinject -->
|
||||||
<link rel="shortcut icon" href="/static/admin/images/favicon.png" />
|
<link rel="shortcut icon" href="/static/admin/images/favicon.png" />
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.content-wrapper {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
{{block "css" .}}
|
{{block "css" .}}
|
||||||
|
|
||||||
{{end}}
|
{{end}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user