Files
toutaloue/cmd/server/main.go
Enkly 7a6f64e581
All checks were successful
Go CI Pipeline / build_and_test (push) Successful in 11m57s
Init Project
2025-12-09 17:47:21 +01:00

142 lines
3.8 KiB
Go

package main
import (
"html/template"
"log"
"net/http"
"time"
)
// PageData holds data to be rendered in templates
type PageData struct {
Title string
Page string // Used by index.html to decide which template to include on full load
Time string
}
// Global template variable
var tmpl *template.Template
func main() {
// 1. Parse Templates
// standard lib 'Must' panics if parsing fails (good for startup)
tmpl = template.Must(template.ParseGlob("public/templates/*.html"))
tmpl = template.Must(tmpl.ParseGlob("public/templates/*/*.html"))
// 2. Setup Router (Go 1.22+ Standard Library Mux)
mux := http.NewServeMux()
// 3. Static Files
// "GET /static/" matches any path starting with /static/
fileServer := http.FileServer(http.Dir("./public/assets"))
mux.Handle("GET /public/assets/", http.StripPrefix("/public/assets/", fileServer))
// 4. Routes
mux.HandleFunc("GET /", homeHandler)
mux.HandleFunc("GET /explore", exploreHandler)
mux.HandleFunc("GET /songon", songonHandler)
mux.HandleFunc("GET /deposer-annonce", deposerAnnonceHandler)
mux.HandleFunc("GET /inscription", inscriptionHandler)
mux.HandleFunc("GET /contact", contactHandler)
// Example POST to show HTMX form handling
mux.HandleFunc("POST /contact", contactPostHandler)
log.Println("Starting server on :8080")
if err := http.ListenAndServe(":8080", mux); err != nil {
log.Fatal(err)
}
}
// Helper function to render pages with "If Else" logic for HTMX
func render(w http.ResponseWriter, r *http.Request, pageName string, data PageData) {
// Check if request is from HTMX
isHtmx := r.Header.Get("HX-Request") == "true"
// Ensure the Page field is set for the layout to use
data.Page = pageName
if isHtmx {
// IF HTMX: Render only the partial (e.g., "home", "songon")
// We set the content type slightly differently usually, but HTML is fine.
err := tmpl.ExecuteTemplate(w, pageName, data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
} else {
// ELSE: Render the full layout ("index"), which includes the partial
err := tmpl.ExecuteTemplate(w, "index", data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
}
// --- Handlers ---
func homeHandler(w http.ResponseWriter, r *http.Request) {
// Prevent catch-all "/" from matching non-existent paths
if r.URL.Path != "/" {
http.NotFound(w, r)
return
}
data := PageData{
Title: "Home",
Time: time.Now().Format(time.Kitchen),
}
render(w, r, "home", data)
}
func exploreHandler(w http.ResponseWriter, r *http.Request) {
data := PageData{
Title: "Explore",
Time: time.Now().Format(time.Kitchen),
}
render(w, r, "explore", data)
}
func songonHandler(w http.ResponseWriter, r *http.Request) {
data := PageData{
Title: "Songon",
Time: time.Now().Format(time.Kitchen),
}
render(w, r, "songon", data)
}
func deposerAnnonceHandler(w http.ResponseWriter, r *http.Request) {
data := PageData{
Title: "Déposer",
Time: time.Now().Format(time.Kitchen),
}
render(w, r, "deposer-annonce", data)
}
func inscriptionHandler(w http.ResponseWriter, r *http.Request) {
data := PageData{
Title: "Inscription",
Time: time.Now().Format(time.Kitchen),
}
render(w, r, "inscription", data)
}
func contactHandler(w http.ResponseWriter, r *http.Request) {
data := PageData{
Title: "Contact",
}
render(w, r, "contact", data)
}
func contactPostHandler(w http.ResponseWriter, r *http.Request) {
// Emulate processing
time.Sleep(500 * time.Millisecond)
// Return a snippet to replace the form
w.Write([]byte(`<div class="card" style="background:#dcfce7; border:1px solid #86efac;">
<h2 style="color:#166534">Message Sent!</h2>
<p>Thank you for contacting us.</p>
<button class="btn" hx-get="/contact" hx-target="#view">Back</button>
</div>`))
}