Personal Git forge.

Code git clone ssh://git.poy.ooo:6969/~poyo/farga ZIP
app/invites.go / 1KiB #4d78b572
Raw
package appimport (	md "farga/app/middleware"	"farga/db"	"farga/db/types"	"farga/lib"	"farga/templating"	"fmt"	"net/http"	"github.com/google/uuid")func (a *App) InviteHandler(w http.ResponseWriter, r *http.Request) {	user, userOk := r.Context().Value(lib.UserKey).(*types.User)	switch r.Method {	case http.MethodGet:		if !userOk || user.ID == uuid.Nil {			// render "input invite code" page			templating.Render(w, r, "base", "invite/redeem")			return		}		if user.Role == types.RoleAdmin {			http.Redirect(w, r, "/?err=AlreadyAuthenticated", http.StatusSeeOther)			return		} else {			// not allowed to invite			http.Redirect(w, r, "/?err=Forbidden", http.StatusSeeOther)			return		}	case http.MethodPost:		if !userOk || user.ID == uuid.Nil || user.Role != types.RoleAdmin {			a.RedeemInviteHandler(w, r)			return		}		invite, err := a.Store.NewInvite(db.NewInviteOptions{			UserID:   user.ID,			Length:   a.Config.InviteTokenLength,			Duration: a.Config.InviteTokenDuration,		})		if err != nil {			http.Error(w, "We could not generate an invite.", http.StatusInternalServerError)			return		}		inviteLink := fmt.Sprintf("https://%s/auth/register/%s", a.Config.Domain, invite.Token)		templating.Render(w, r, "base", "invite/generated", map[string]any{			"InviteLink":  inviteLink,			"InviteToken": invite.Token,		})	}}type RedeemTokenForm struct {	Token string `form:"token"`}func (a *App) RedeemInviteHandler(w http.ResponseWriter, r *http.Request) {	form, ok := md.Form[RedeemTokenForm](r)	if !ok || form.Token == "" {		http.Error(w, "Invalid form.", http.StatusBadRequest)		return	}	http.Redirect(w, r, "/auth/register/"+form.Token, http.StatusSeeOther)}