apps/posts/routes.go 3.2 K raw
1
package main
2
3
import (
4
	"net/http"
5
	"strings"
6
7
	"github.com/stevedylandev/andromeda/pkg/darkmatter"
8
	"github.com/stevedylandev/andromeda/pkg/web"
9
)
10
11
func (a *App) routes() *http.ServeMux {
12
	mux := http.NewServeMux()
13
14
	requireSession := func(next http.HandlerFunc) http.HandlerFunc {
15
		return a.Sessions.RequireSession("/admin/login", next)
16
	}
17
	cors := func(next http.HandlerFunc) http.HandlerFunc {
18
		return func(w http.ResponseWriter, r *http.Request) {
19
			w.Header().Set("Access-Control-Allow-Origin", "*")
20
			w.Header().Set("Access-Control-Allow-Methods", "GET")
21
			w.Header().Set("Access-Control-Allow-Headers", "*")
22
			next(w, r)
23
		}
24
	}
25
26
	// Public
27
	mux.HandleFunc("GET /{$}", a.publicIndex)
28
	mux.HandleFunc("GET /posts", a.publicPostsList)
29
	mux.HandleFunc("GET /posts/{slug}", a.publicPost)
30
	mux.HandleFunc("GET /custom-styles.css", a.customCSS)
31
	mux.HandleFunc("GET /feed.xml", a.rssFeed)
32
	mux.HandleFunc("GET /files/{filename}", a.serveUploadedFile)
33
	mux.HandleFunc("GET /static/", web.EmbeddedHandler(appFS, "static"))
34
	darkmatter.Mount(mux, "/assets")
35
36
	// API
37
	mux.HandleFunc("GET /api/posts", cors(a.apiListPosts))
38
	mux.HandleFunc("GET /api/posts/{slug}", cors(a.apiGetPost))
39
40
	// Admin auth
41
	mux.HandleFunc("GET /admin/login", a.loginGet)
42
	mux.HandleFunc("POST /admin/login", a.loginPost)
43
	mux.HandleFunc("GET /admin/logout", a.logout)
44
45
	// Admin posts
46
	mux.HandleFunc("GET /admin", requireSession(a.adminIndex))
47
	mux.HandleFunc("GET /admin/posts/new", requireSession(a.adminNewPost))
48
	mux.HandleFunc("POST /admin/posts", requireSession(a.adminCreatePost))
49
	mux.HandleFunc("GET /admin/posts/{id}/edit", requireSession(a.adminEditPost))
50
	mux.HandleFunc("POST /admin/posts/{id}", requireSession(a.adminUpdatePost))
51
	mux.HandleFunc("POST /admin/posts/{id}/delete", requireSession(a.adminDeletePost))
52
	mux.HandleFunc("POST /admin/posts/{id}/publish", requireSession(a.adminTogglePublish))
53
54
	// Admin pages
55
	mux.HandleFunc("GET /admin/pages", requireSession(a.adminPages))
56
	mux.HandleFunc("GET /admin/pages/new", requireSession(a.adminNewPage))
57
	mux.HandleFunc("POST /admin/pages/create", requireSession(a.adminCreatePage))
58
	mux.HandleFunc("GET /admin/pages/{id}/edit", requireSession(a.adminEditPage))
59
	mux.HandleFunc("POST /admin/pages/{id}", requireSession(a.adminUpdatePage))
60
	mux.HandleFunc("POST /admin/pages/{id}/delete", requireSession(a.adminDeletePage))
61
62
	// Settings
63
	mux.HandleFunc("GET /admin/settings", requireSession(a.adminGetSettings))
64
	mux.HandleFunc("POST /admin/settings", requireSession(a.adminPostSettings))
65
66
	// Downloads
67
	mux.HandleFunc("GET /admin/downloads/posts", requireSession(a.adminDownloadPosts))
68
	mux.HandleFunc("GET /admin/downloads/uploads", requireSession(a.adminDownloadUploads))
69
70
	// Import
71
	mux.HandleFunc("GET /admin/import", requireSession(a.adminImportForm))
72
	mux.HandleFunc("POST /admin/import", requireSession(a.adminImportPosts))
73
74
	// Files
75
	mux.HandleFunc("GET /admin/files", requireSession(a.adminFiles))
76
	mux.HandleFunc("POST /admin/files/upload", requireSession(a.adminUploadFile))
77
	mux.HandleFunc("POST /admin/files/{id}/delete", requireSession(a.adminDeleteFile))
78
79
	// Fallback: /{slug} → page or alias redirect
80
	mux.HandleFunc("GET /{slug}", a.publicPage)
81
82
	_ = strings.Trim
83
	return mux
84
}