83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
package handlers
|
|
|
|
import (
|
|
"html/template"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"strconv"
|
|
|
|
"decor-by-hannahs/internal/auth"
|
|
"decor-by-hannahs/internal/db"
|
|
)
|
|
|
|
type BookingWithService struct {
|
|
ID int64
|
|
ServiceName string
|
|
ServiceDescription string
|
|
ServicePriceCents int32
|
|
EventDate string
|
|
Address string
|
|
Notes string
|
|
Status string
|
|
CreatedAt string
|
|
}
|
|
|
|
type ProfileData struct {
|
|
Authenticated bool
|
|
Email string
|
|
DisplayName string
|
|
ID string
|
|
ActivePage string
|
|
Bookings []BookingWithService
|
|
OrySettingsURL string
|
|
}
|
|
|
|
func ProfileHandler(q *db.Queries, tmpl *template.Template) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
pd := ProfileData{ActivePage: "profile"}
|
|
|
|
user, err := auth.GetUser(r.Context())
|
|
if err == nil {
|
|
pd.Authenticated = true
|
|
pd.Email = user.Email
|
|
pd.ID = strconv.FormatInt(user.ID, 10)
|
|
pd.DisplayName = user.Email
|
|
|
|
bookings, err := q.ListBookingsWithServiceByUser(r.Context(), user.ID)
|
|
if err != nil {
|
|
log.Printf("Error fetching bookings: %v", err)
|
|
} else {
|
|
for _, b := range bookings {
|
|
pd.Bookings = append(pd.Bookings, BookingWithService{
|
|
ID: b.ID,
|
|
ServiceName: b.ServiceName,
|
|
ServiceDescription: nullStringToString(b.ServiceDescription),
|
|
ServicePriceCents: b.ServicePriceCents,
|
|
EventDate: b.EventDate.Format("January 2, 2006"),
|
|
Address: nullStringToString(b.Address),
|
|
Notes: nullStringToString(b.Notes),
|
|
Status: b.Status,
|
|
CreatedAt: b.CreatedAt.Time.Format("Jan 2, 2006"),
|
|
})
|
|
}
|
|
}
|
|
|
|
oryAPIURL := os.Getenv("ORY_API_URL")
|
|
if oryAPIURL == "" {
|
|
tunnelPort := os.Getenv("TUNNEL_PORT")
|
|
if tunnelPort == "" {
|
|
tunnelPort = "4000"
|
|
}
|
|
oryAPIURL = "http://localhost:" + tunnelPort
|
|
}
|
|
pd.OrySettingsURL = oryAPIURL + "/ui/settings"
|
|
}
|
|
|
|
if err := tmpl.ExecuteTemplate(w, "profile.tmpl", pd); err != nil {
|
|
http.Error(w, "failed to render profile", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
}
|
|
}
|