dbots/services/auth/router.go
2026-04-19 01:40:26 +02:00

68 lines
1.6 KiB
Go

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)
}