package auth import ( "net/http" "codeberg.org/nextgo/dbots/internal/db" "codeberg.org/nextgo/dbots/internal/discord" "codeberg.org/nextgo/dbots/internal/errorutil" "github.com/go-chi/chi/v5" "github.com/go-chi/render" ) type Router struct { auth *Service router chi.Router } func NewRouter(q *db.Queries, client *discord.Client) *Router { return &Router{ auth: NewService(q, client), router: chi.NewRouter(), } } func (r *Router) Routes() http.Handler { r.router.Get("/login", r.login) r.router.Get("/callback", r.callback) r.router.Post("/logout", r.logout) r.router.Get("/me", r.me) return r.router } func (r *Router) me(w http.ResponseWriter, req *http.Request) { } func (r *Router) login(w http.ResponseWriter, req *http.Request) { state, err := GenerateState() if err != nil { render.Render(w, req, errorutil.ErrInternal(err)) return } // todo: store state in a short-lived cookie or session before redirecting http.Redirect(w, req, r.auth.client.AuthURL(state), http.StatusFound) } func (r *Router) callback(w http.ResponseWriter, req *http.Request) { // todo: validate state matches what was stored code := req.URL.Query().Get("code") if code == "" { render.Render(w, req, errorutil.ErrInvalidRequest(nil)) return } user, err := r.auth.Callback(req.Context(), code) if err != nil { render.Render(w, req, errorutil.ErrInternal(err)) return } // todo: create a session, set a cookie, then redirect to "/" render.JSON(w, req, user) } func (r *Router) logout(w http.ResponseWriter, req *http.Request) { // todo: delete session render.NoContent(w, req) }