162 lines
4.5 KiB
Go
162 lines
4.5 KiB
Go
package web
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"gardomatic.kleiax.de/lib/client"
|
|
)
|
|
|
|
type inviteForm struct {
|
|
CSRFToken string `form:"csrf_token"`
|
|
Email string `form:"email"`
|
|
Role string `form:"role"`
|
|
Errors map[string]string
|
|
}
|
|
|
|
func (app *application) gardenMembers(w http.ResponseWriter, r *http.Request) {
|
|
gardenID, err := app.readPathID(r, "gardenID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
http.Redirect(w, r, webPath("garden.edit", gardenID), http.StatusSeeOther)
|
|
}
|
|
|
|
func (app *application) gardenInvitePost(w http.ResponseWriter, r *http.Request) {
|
|
gardenID, err := app.readPathID(r, "gardenID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
var form inviteForm
|
|
if err = app.decodePostForm(r, &form); err != nil {
|
|
app.clientError(w, http.StatusBadRequest)
|
|
return
|
|
}
|
|
form.Email, form.Role, form.Errors = strings.TrimSpace(form.Email), strings.TrimSpace(form.Role), map[string]string{}
|
|
_, _, err = client.FromContext(r.Context()).CreateGardenInvite(r.Context(), gardenID, client.GardenInviteInput{Email: form.Email, Role: form.Role})
|
|
if err != nil {
|
|
var apiError *client.APIError
|
|
if errors.As(err, &apiError) && apiError.StatusCode == http.StatusUnprocessableEntity {
|
|
form.Errors = apiError.Validation
|
|
} else {
|
|
app.handleAPIError(w, r, err)
|
|
return
|
|
}
|
|
}
|
|
if len(form.Errors) == 0 {
|
|
http.Redirect(w, r, webPath("garden.edit", gardenID), http.StatusSeeOther)
|
|
return
|
|
}
|
|
app.renderGardenEdit(w, r, gardenID, http.StatusUnprocessableEntity, gardenEditForms{Invite: form})
|
|
}
|
|
|
|
type roleForm struct {
|
|
CSRFToken string `form:"csrf_token"`
|
|
Role string `form:"role"`
|
|
}
|
|
|
|
func (app *application) gardenMemberRolePost(w http.ResponseWriter, r *http.Request) {
|
|
gardenID, err := app.readPathID(r, "gardenID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
userID, err := app.readPathID(r, "userID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
var form roleForm
|
|
if err = app.decodePostForm(r, &form); err != nil {
|
|
app.clientError(w, http.StatusBadRequest)
|
|
return
|
|
}
|
|
if _, _, err = client.FromContext(r.Context()).UpdateGardenMember(r.Context(), gardenID, userID, form.Role); err != nil {
|
|
app.handleAPIError(w, r, err)
|
|
return
|
|
}
|
|
http.Redirect(w, r, webPath("garden.edit", gardenID), http.StatusSeeOther)
|
|
}
|
|
|
|
func (app *application) gardenMemberDeletePost(w http.ResponseWriter, r *http.Request) {
|
|
gardenID, err := app.readPathID(r, "gardenID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
userID, err := app.readPathID(r, "userID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
if _, err = client.FromContext(r.Context()).DeleteGardenMember(r.Context(), gardenID, userID); err != nil {
|
|
app.handleAPIError(w, r, err)
|
|
return
|
|
}
|
|
http.Redirect(w, r, webPath("garden.edit", gardenID), http.StatusSeeOther)
|
|
}
|
|
|
|
func (app *application) gardenOwnershipPost(w http.ResponseWriter, r *http.Request) {
|
|
gardenID, err := app.readPathID(r, "gardenID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
userID, err := app.readPathID(r, "userID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
if _, err = client.FromContext(r.Context()).TransferGardenOwnership(r.Context(), gardenID, userID); err != nil {
|
|
app.handleAPIError(w, r, err)
|
|
return
|
|
}
|
|
http.Redirect(w, r, webPath("garden.edit", gardenID), http.StatusSeeOther)
|
|
}
|
|
|
|
func (app *application) gardenInviteDeletePost(w http.ResponseWriter, r *http.Request) {
|
|
gardenID, err := app.readPathID(r, "gardenID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
inviteID, err := app.readPathID(r, "inviteID")
|
|
if err != nil {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
if _, err = client.FromContext(r.Context()).DeleteGardenInvite(r.Context(), gardenID, inviteID); err != nil {
|
|
app.handleAPIError(w, r, err)
|
|
return
|
|
}
|
|
http.Redirect(w, r, webPath("garden.edit", gardenID), http.StatusSeeOther)
|
|
}
|
|
|
|
type acceptInviteForm struct {
|
|
CSRFToken string `form:"csrf_token"`
|
|
Token string `form:"token"`
|
|
}
|
|
|
|
func (app *application) acceptInvite(w http.ResponseWriter, r *http.Request) {
|
|
data := app.newTemplateData(r)
|
|
data.Form = acceptInviteForm{Token: r.URL.Query().Get("token")}
|
|
app.render(w, http.StatusOK, "invite.tmpl", data)
|
|
}
|
|
|
|
func (app *application) acceptInvitePost(w http.ResponseWriter, r *http.Request) {
|
|
var form acceptInviteForm
|
|
if err := app.decodePostForm(r, &form); err != nil {
|
|
app.clientError(w, http.StatusBadRequest)
|
|
return
|
|
}
|
|
member, _, err := client.FromContext(r.Context()).AcceptGardenInvite(r.Context(), form.Token)
|
|
if err != nil {
|
|
app.handleAPIError(w, r, err)
|
|
return
|
|
}
|
|
http.Redirect(w, r, webPath("plants", member.GardenID), http.StatusSeeOther)
|
|
}
|