package web import ( "git.sleepycat.moe/sam/mercury/internal/database" "git.sleepycat.moe/sam/mercury/web/api" "git.sleepycat.moe/sam/mercury/web/api/accounts" "git.sleepycat.moe/sam/mercury/web/api/blogs" "git.sleepycat.moe/sam/mercury/web/api/posts" "git.sleepycat.moe/sam/mercury/web/api/streaming" "git.sleepycat.moe/sam/mercury/web/api/timelines" "git.sleepycat.moe/sam/mercury/web/app" "git.sleepycat.moe/sam/mercury/web/auth" "git.sleepycat.moe/sam/mercury/web/frontend" "git.sleepycat.moe/sam/mercury/web/wellknown" "github.com/go-chi/chi/v5" ) func Routes(app *app.App) { // auth app.Router.Route("/auth", func(r chi.Router) { auth := auth.New(app) r.Get("/login", auth.GetLogin) r.Post("/login", auth.PostLogin) r.Get("/sign_up", auth.GetSignup) r.Post("/sign_up", auth.PostSignup) }) // .well-known handlers app.Router.Route("/.well-known", func(r chi.Router) { wellknown := wellknown.New(app) r.Get("/webfinger", api.WrapHandlerT(wellknown.WebFinger)) }) // APIv1 handlers app.Router.Route("/api/v1", func(r chi.Router) { unauthedAccess := !app.AppConfig.Security.RestrictAPI unauthedTimelineAccess := app.AppConfig.Security.PublicTimelines && !app.AppConfig.Security.RestrictAPI _ = unauthedTimelineAccess // account handlers accounts := accounts.New(app) r.With(app.APIAuth(database.TokenScopeAccountsRead, unauthedAccess)). Get("/accounts/{accountID}", api.WrapHandlerT(accounts.GetID)) r.With(app.APIAuth(database.TokenScopeAccountsMe, false)). Get("/accounts/@me", api.WrapHandlerT(accounts.GetMe)) blogs := blogs.New(app) r.With(app.APIAuth(database.TokenScopeBlogsRead, unauthedAccess)). Get("/blogs/{blogID}", api.WrapHandlerT(blogs.GetID)) r.With(app.APIAuth(database.TokenScopeBlogsRead, unauthedAccess)). Get("/blogs/lookup/{blogName}", api.WrapHandlerT(blogs.LookupName)) posts := posts.New(app) r.With(app.APIAuth(database.TokenScopePostsRead, unauthedAccess)). Get("/posts/{postID}", api.WrapHandlerT(posts.GetID)) r.With(app.APIAuth(database.TokenScopePostsWrite, false)). Post("/blogs/{blogID}/posts", api.WrapHandlerT(posts.Create)) timelines := timelines.New(app) r.With(app.APIAuth(database.TokenScopeTimeline, false)). Get("/timelines/home", api.WrapHandlerT(timelines.Home)) streaming := streaming.New(app) r.With(app.APIAuth(database.TokenScopeStreaming, false)). Get("/streaming", api.WrapHandler(streaming.Streaming)) }) // web app handlers // also assets app.Router.Group(func(r chi.Router) { frontend := frontend.New(app) r.Use(app.FrontendAuth) r.HandleFunc(frontend.AssetsPath(), frontend.ServeAssets) r.HandleFunc("/static/*", frontend.ServeStaticAssets) r.HandleFunc("/web", frontend.ServeFrontend) r.HandleFunc("/web/*", frontend.ServeFrontend) r.HandleFunc("/web/@{username}", frontend.ServeUser) r.HandleFunc("/web/@{username}/posts/{postID}", frontend.ServeStatus) }) }