Something went wrong. Try again.
Lightweight and easily self-hostable Git forge.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172package app
import ( 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)}