package initialize import ( "net/http" "git.schreifuchs.ch/schreifuchs/ng-blog/internal/auth" "git.schreifuchs.ch/schreifuchs/ng-blog/internal/config" "git.schreifuchs.ch/schreifuchs/ng-blog/internal/model" "git.schreifuchs.ch/schreifuchs/ng-blog/internal/posts" "git.schreifuchs.ch/schreifuchs/ng-blog/pkg/cors" "git.schreifuchs.ch/schreifuchs/ng-blog/pkg/middlewares" "git.schreifuchs.ch/schreifuchs/ng-blog/web" "github.com/gorilla/mux" ) // CreateMux creates and configures a mux router with authentication and post-related routes. func CreateMux(cfg *config.Config) (r *mux.Router) { r = mux.NewRouter() r.Use(cors.HandlerForOrigin("*")) app(r.PathPrefix("/api").Subrouter(), cfg) frontend(r.PathPrefix("/")) r.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // The CORS middleware should set up the headers for you w.WriteHeader(http.StatusNoContent) }) return r } func frontend(r *mux.Route) { frontend := web.Frontend r.Handler( middlewares.AddPrefix("/dist/frontend/browser", middlewares.FallbackFile( frontend, "/dist/frontend/browser/index.html", http.FileServerFS(frontend), ), )) } func app(r *mux.Router, cfg *config.Config) { db := model.Init() blg := posts.New(db) auth := auth.New(&cfg.Auth, db) // config r.HandleFunc("/conf", cfg.Handle) // auth r.HandleFunc("/auth/login", auth.Login).Methods("POST") r.HandleFunc("/auth/signup", auth.Signup).Methods("POST") r.Handle("/auth/password", auth.Authenticated(auth.ChangePassword, true)).Methods("PUT") r.Handle("/auth/logout", auth.Authenticated(auth.Logout, true)).Methods("DELETE") // Posts r.Handle("/posts", auth.Authenticated(blg.SavePost, true, model.RoleUser, model.RoleAdmin)).Methods("POST") r.Handle("/posts", auth.Authenticated(blg.SavePost, true, model.RoleUser, model.RoleAdmin)).Methods("PUT") r.Handle("/posts/{postID}", auth.Authenticated(blg.DeletePost, true, model.RoleUser, model.RoleAdmin)).Methods("DELETE") r.Handle("/posts", auth.Authenticated(blg.GetAllPosts, false)).Methods("GET") r.Handle("/posts/secret/{secret}", http.HandlerFunc(blg.GetPostBySecret)).Methods("GET") }