feat: add invites to backend
This commit is contained in:
parent
47ed36d24c
commit
6237ea940f
7 changed files with 234 additions and 30 deletions
|
@ -182,17 +182,18 @@ func (s *Server) discordSignup(w http.ResponseWriter, r *http.Request) error {
|
|||
}
|
||||
|
||||
if s.RequireInvite {
|
||||
// TODO: check invites, invalidate invite when done
|
||||
inviteValid := true
|
||||
|
||||
if !inviteValid {
|
||||
err = tx.Rollback(ctx)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "rolling back transaction")
|
||||
}
|
||||
valid, used, err := s.DB.InvalidateInvite(ctx, tx, req.InviteCode)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "checking and invalidating invite")
|
||||
}
|
||||
|
||||
if !valid {
|
||||
return server.APIError{Code: server.ErrInviteRequired}
|
||||
}
|
||||
|
||||
if used {
|
||||
return server.APIError{Code: server.ErrInviteAlreadyUsed}
|
||||
}
|
||||
}
|
||||
|
||||
// delete sign up ticket
|
||||
|
|
68
backend/routes/auth/invite.go
Normal file
68
backend/routes/auth/invite.go
Normal file
|
@ -0,0 +1,68 @@
|
|||
package auth
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"codeberg.org/u1f320/pronouns.cc/backend/db"
|
||||
"codeberg.org/u1f320/pronouns.cc/backend/server"
|
||||
"emperror.dev/errors"
|
||||
"github.com/go-chi/render"
|
||||
)
|
||||
|
||||
type inviteResponse struct {
|
||||
Code string `json:"string"`
|
||||
Created time.Time `json:"created"`
|
||||
Used bool `json:"used"`
|
||||
}
|
||||
|
||||
func dbInviteToResponse(i db.Invite) inviteResponse {
|
||||
return inviteResponse{
|
||||
Code: i.Code,
|
||||
Created: i.Created,
|
||||
Used: i.Used,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) getInvites(w http.ResponseWriter, r *http.Request) error {
|
||||
if !s.RequireInvite {
|
||||
return server.APIError{Code: server.ErrInvitesDisabled}
|
||||
}
|
||||
|
||||
ctx := r.Context()
|
||||
claims, _ := server.ClaimsFromContext(ctx)
|
||||
|
||||
is, err := s.DB.UserInvites(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "getting user invites")
|
||||
}
|
||||
|
||||
resps := make([]inviteResponse, len(is))
|
||||
for i := range is {
|
||||
resps[i] = dbInviteToResponse(is[i])
|
||||
}
|
||||
|
||||
render.JSON(w, r, resps)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) createInvite(w http.ResponseWriter, r *http.Request) error {
|
||||
if !s.RequireInvite {
|
||||
return server.APIError{Code: server.ErrInvitesDisabled}
|
||||
}
|
||||
|
||||
ctx := r.Context()
|
||||
claims, _ := server.ClaimsFromContext(ctx)
|
||||
|
||||
inv, err := s.DB.CreateInvite(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
if err == db.ErrTooManyInvites {
|
||||
return server.APIError{Code: server.ErrInviteLimitReached}
|
||||
}
|
||||
|
||||
return errors.Wrap(err, "creating invite")
|
||||
}
|
||||
|
||||
render.JSON(w, r, dbInviteToResponse(inv))
|
||||
return nil
|
||||
}
|
|
@ -63,6 +63,10 @@ func Mount(srv *server.Server, r chi.Router) {
|
|||
// takes discord signup ticket to register account
|
||||
r.Post("/signup", server.WrapHandler(s.discordSignup))
|
||||
})
|
||||
|
||||
// invite routes
|
||||
r.With(server.MustAuth).Get("/invites", server.WrapHandler(s.getInvites))
|
||||
r.With(server.MustAuth).Post("/invites", server.WrapHandler(s.createInvite))
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue