package routing import ( "net/http" "slices" "lishwist/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) }