lishwist/server/routing/groups.go

141 lines
4.1 KiB
Go

package routing
import (
"net/http"
"slices"
"lishwist/api/db"
"lishwist/rsvp"
)
type GroupProps struct {
Group *db.Group
CurrentUsername string
}
func AdminGroup(currentUser *db.User, h http.Header, r *rsvp.Request) rsvp.Response {
reference := r.PathValue("groupReference")
group, err := db.GetGroupByReference(reference)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "Couldn't get group: %s", err)
}
if group == nil {
return rsvp.Error(http.StatusNotFound, "Group not found")
}
if !currentUser.IsAdmin {
index := group.MemberIndex(currentUser.Id)
group.Members = slices.Delete(group.Members, index, index+1)
}
p := GroupProps{
Group: group,
CurrentUsername: currentUser.Name,
}
return rsvp.Data("group_page.gotmpl", p)
}
func Group(currentUser *db.User, h http.Header, r *rsvp.Request) rsvp.Response {
if currentUser.IsAdmin {
return AdminGroup(currentUser, h, r)
}
groupReference := r.PathValue("groupReference")
group, err := currentUser.GetGroupByReference(groupReference)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "An error occurred while fetching this group :(").Log("Couldn't get group: %s", err)
}
if group == nil {
return rsvp.Error(http.StatusNotFound, "Group not found. (It might be because you're not a member)")
}
index := group.MemberIndex(currentUser.Id)
group.Members = slices.Delete(group.Members, index, index+1)
p := GroupProps{
Group: group,
CurrentUsername: currentUser.Name,
}
return rsvp.Data("group_page.gotmpl", p)
}
func PublicGroup(h http.Header, r *rsvp.Request) rsvp.Response {
groupReference := r.PathValue("groupReference")
group, err := db.GetGroupByReference(groupReference)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "An error occurred while fetching this group :(").Log("Couldn't get group: %s", err)
}
p := GroupProps{
Group: group,
}
return rsvp.Data("public_group_page.gotmpl", p)
}
func GroupPost(currentUser *db.User, h http.Header, r *rsvp.Request) rsvp.Response {
if !currentUser.IsAdmin {
return NotFound(h, r)
}
form := r.ParseForm()
var group *db.Group
reference := r.PathValue("groupReference")
name := form.Get("name")
addUsers := form["addUser"]
removeUsers := form["removeUser"]
if name != "" {
createdGroup, err := db.CreateGroup(name, reference)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "Failed to create group: %s", err)
}
group = createdGroup
} else {
existingGroup, err := db.GetGroupByReference(reference)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "Failed to get group: %s", err)
}
if existingGroup == nil {
return rsvp.Error(http.StatusNotFound, "Group not found", err)
}
group = existingGroup
for _, userId := range removeUsers {
index := group.MemberIndex(userId)
if index == -1 {
return rsvp.Error(http.StatusBadRequest, "Group %q does not contain a user with id %s", reference, userId)
}
err = group.RemoveUser(userId)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "On group %q failed to remove user with id %s: %s", reference, userId, err)
}
group.Members = slices.Delete(group.Members, index, index+1)
}
}
for _, userId := range addUsers {
user, err := db.GetUser(userId)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "Groups exists, but a user with id %s could not be fetched: %s", userId, err)
}
if user == nil {
return rsvp.Error(http.StatusInternalServerError, "Groups exists, but a user with id %s does not exist", userId)
}
err = group.AddUser(user.Id)
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "Groups exists, but failed to add user with id %s: %s", userId, err)
}
group.Members = append(group.Members, *user)
}
return rsvp.Data("", group)
}
func Groups(currentUser *db.User, h http.Header, r *rsvp.Request) rsvp.Response {
if !currentUser.IsAdmin {
return NotFound(h, r)
}
groups, err := db.GetAllGroups()
if err != nil {
return rsvp.Error(http.StatusInternalServerError, "Failed to get groups: %s", err)
}
return rsvp.Data("", groups)
}