68 lines
1.6 KiB
Go
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)
|
|
}
|