154 lines
4.5 KiB
Go
154 lines
4.5 KiB
Go
package routing
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"slices"
|
|
|
|
lishwist "lishwist/core"
|
|
"lishwist/http/response"
|
|
|
|
"github.com/Teajey/rsvp"
|
|
)
|
|
|
|
type GroupProps struct {
|
|
Group *lishwist.Group
|
|
CurrentUsername string
|
|
}
|
|
|
|
func AdminGroup(app *lishwist.Session, h http.Header, r *http.Request) rsvp.Response {
|
|
reference := r.PathValue("groupReference")
|
|
group, err := lishwist.GetGroupByReference(reference)
|
|
if err != nil {
|
|
return response.Error(http.StatusInternalServerError, "Couldn't get group: %s", err)
|
|
}
|
|
if group == nil {
|
|
return response.Error(http.StatusNotFound, "Group not found")
|
|
}
|
|
user := app.User()
|
|
if !user.IsAdmin {
|
|
index := group.MemberIndex(user.Id)
|
|
group.Members = slices.Delete(group.Members, index, index+1)
|
|
}
|
|
p := GroupProps{
|
|
Group: group,
|
|
CurrentUsername: user.Name,
|
|
}
|
|
return response.Data("group_page.gotmpl", p)
|
|
}
|
|
|
|
func Group(app *lishwist.Session, h http.Header, r *http.Request) rsvp.Response {
|
|
user := app.User()
|
|
if user.IsAdmin {
|
|
return AdminGroup(app, h, r)
|
|
}
|
|
groupReference := r.PathValue("groupReference")
|
|
group, err := app.GetGroupByReference(groupReference)
|
|
if err != nil {
|
|
log.Printf("Couldn't get group: %s\n", err)
|
|
return response.Error(http.StatusInternalServerError, "An error occurred while fetching this group :(")
|
|
}
|
|
if group == nil {
|
|
return response.Error(http.StatusNotFound, "Group not found. (It might be because you're not a member)")
|
|
}
|
|
index := group.MemberIndex(user.Id)
|
|
group.Members = slices.Delete(group.Members, index, index+1)
|
|
p := GroupProps{
|
|
Group: group,
|
|
CurrentUsername: user.Name,
|
|
}
|
|
return response.Data("group_page.gotmpl", p)
|
|
}
|
|
|
|
func PublicGroup(s *response.Session, h http.Header, r *http.Request) rsvp.Response {
|
|
groupReference := r.PathValue("groupReference")
|
|
group, err := lishwist.GetGroupByReference(groupReference)
|
|
if err != nil {
|
|
log.Printf("Couldn't get group: %s\n", err)
|
|
return response.Error(http.StatusInternalServerError, "An error occurred while fetching this group :(")
|
|
}
|
|
p := GroupProps{
|
|
Group: group,
|
|
}
|
|
return response.Data("public_group_page.gotmpl", p)
|
|
}
|
|
|
|
func GroupPost(app *lishwist.Session, h http.Header, r *http.Request) rsvp.Response {
|
|
admin := app.Admin()
|
|
if admin == nil {
|
|
return response.NotFound()
|
|
}
|
|
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
return response.Error(http.StatusBadRequest, "Failed to parse form")
|
|
}
|
|
|
|
var group *lishwist.Group
|
|
|
|
reference := r.PathValue("groupReference")
|
|
name := r.Form.Get("name")
|
|
addUsers := r.Form["addUser"]
|
|
removeUsers := r.Form["removeUser"]
|
|
|
|
if name != "" {
|
|
createdGroup, err := admin.CreateGroup(name, reference)
|
|
if err != nil {
|
|
return response.Error(http.StatusInternalServerError, "Failed to create group: %s", err)
|
|
}
|
|
group = createdGroup
|
|
} else {
|
|
existingGroup, err := lishwist.GetGroupByReference(reference)
|
|
if err != nil {
|
|
return response.Error(http.StatusInternalServerError, "Failed to get group: %s", err)
|
|
}
|
|
if existingGroup == nil {
|
|
return response.Error(http.StatusNotFound, "Group not found: %s", err)
|
|
}
|
|
group = existingGroup
|
|
|
|
for _, userId := range removeUsers {
|
|
index := group.MemberIndex(userId)
|
|
if index == -1 {
|
|
return response.Error(http.StatusBadRequest, "Group %q does not contain a user with id %s", reference, userId)
|
|
}
|
|
err = admin.RemoveUserFromGroup(userId, group.Id)
|
|
if err != nil {
|
|
return response.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 := admin.GetUser(userId)
|
|
if err != nil {
|
|
return response.Error(http.StatusInternalServerError, "Groups exists, but a user with id %s could not be fetched: %s", userId, err)
|
|
}
|
|
if user == nil {
|
|
return response.Error(http.StatusInternalServerError, "Groups exists, but a user with id %s does not exist", userId)
|
|
}
|
|
err = admin.AddUserToGroup(user.Id, group.Id)
|
|
if err != nil {
|
|
return response.Error(http.StatusInternalServerError, "Groups exists, but failed to add user with id %s: %s", userId, err)
|
|
}
|
|
group.Members = append(group.Members, *user)
|
|
}
|
|
|
|
return response.Data("", group)
|
|
}
|
|
|
|
func Groups(app *lishwist.Session, h http.Header, r *http.Request) rsvp.Response {
|
|
admin := app.Admin()
|
|
if admin == nil {
|
|
return response.NotFound()
|
|
}
|
|
|
|
groups, err := admin.ListGroups()
|
|
if err != nil {
|
|
return response.Error(http.StatusInternalServerError, "Failed to get groups: %s", err)
|
|
}
|
|
|
|
return response.Data("", groups)
|
|
}
|