This commit is contained in:
141
cmd/server/main.go
Normal file
141
cmd/server/main.go
Normal file
@@ -0,0 +1,141 @@
|
||||
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>`))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user