diff --git a/server/db/group.go b/server/db/group.go index de4d2c3..a9c72a0 100644 --- a/server/db/group.go +++ b/server/db/group.go @@ -10,11 +10,11 @@ type Group struct { Id string Name string Reference string - Users []User + Members []User } func (g *Group) MemberIndex(userId string) int { - for i, u := range g.Users { + for i, u := range g.Members { if u.Id == userId { return i } @@ -30,53 +30,15 @@ func queryForGroup(query string, args ...any) (*Group, error) { } else if err != nil { return nil, err } + members, err := queryForGroupMembers(group.Id) + if err != nil { + return nil, err + } + group.Members = members return &group, nil } -func GetGroupByReference(reference string) (*Group, error) { - query := "SELECT [group].id, [group].name, [group].reference FROM [group] WHERE [group].reference = ?" - return queryForGroup(query, reference) -} - -func GetGroupByReferenceWithMembers(reference string) (*Group, error) { - group, err := GetGroupByReference(reference) - if err != nil { - return group, err - } - members, err := group.GetMembers() - if err != nil { - return group, fmt.Errorf("Failed to get members: %w\n", err) - } - group.Users = members - return group, err -} - -func (g *Group) GetMembers() ([]User, error) { - stmt := "SELECT user.id, user.name, user.reference, user.is_admin FROM user JOIN group_member ON group_member.user_id = user.id JOIN [group] ON [group].id = group_member.group_id WHERE [group].id = ?" - rows, err := database.Query(stmt, g.Id) - users := []User{} - if err != nil { - return users, err - } - defer rows.Close() - for rows.Next() { - var user User - err := rows.Scan(&user.Id, &user.Name, &user.Reference, &user.IsAdmin) - if err != nil { - return users, err - } - users = append(users, user) - } - err = rows.Err() - if err != nil { - return users, err - } - g.Users = users - return users, nil -} - -func GetAllGroups() ([]Group, error) { - query := "SELECT id, name, reference FROM [group];" +func queryForGroups(query string, args ...any) ([]Group, error) { groups := []Group{} rows, err := database.Query(query) if err != nil { @@ -89,11 +51,11 @@ func GetAllGroups() ([]Group, error) { if err != nil { return groups, err } - users, err := group.GetMembers() + members, err := queryForGroupMembers(group.Id) if err != nil { - return groups, fmt.Errorf("Failed to get a member: %w", err) + return groups, err } - group.Users = users + group.Members = members groups = append(groups, group) } err = rows.Err() @@ -103,6 +65,25 @@ func GetAllGroups() ([]Group, error) { return groups, nil } +func queryForGroupMembers(groupId string) ([]User, error) { + query := "SELECT user.id, user.name, user.reference, user.is_admin FROM user JOIN group_member ON group_member.user_id = user.id JOIN [group] ON [group].id = group_member.group_id WHERE [group].id = ? ORDER BY group_member.user_id" + members, err := queryForUsers(query, groupId) + if err != nil { + return members, fmt.Errorf("Failed to get members: %w", err) + } + return members, nil +} + +func GetGroupByReference(reference string) (*Group, error) { + query := "SELECT [group].id, [group].name, [group].reference FROM [group] WHERE [group].reference = ?" + return queryForGroup(query, reference) +} + +func GetAllGroups() ([]Group, error) { + query := "SELECT id, name, reference FROM [group];" + return queryForGroups(query) +} + func CreateGroup(name string, reference string) (*Group, error) { stmt := "INSERT INTO [group] (name, reference) VALUES (?, ?)" result, err := database.Exec(stmt, name, reference) diff --git a/server/db/user.go b/server/db/user.go index 18525ee..f6e2141 100644 --- a/server/db/user.go +++ b/server/db/user.go @@ -421,11 +421,6 @@ func (u *User) GetGroups() ([]Group, error) { return groups, nil } -func (u *User) GetPeers(groupId string) ([]User, error) { - stmt := "SELECT user.id, user.name, user.reference FROM user JOIN group_member ON group_member.user_id = user.id JOIN [group] ON [group].id = group_member.group_id WHERE [group].id = ? AND user.id != ?" - return queryForUsers(stmt, groupId, u.Id) -} - func (u *User) GetGroupByReference(reference string) (*Group, error) { stmt := "SELECT [group].id, [group].name, [group].reference FROM [group] JOIN group_member ON [group].id == group_member.group_id WHERE [group].reference = ? AND group_member.user_id = ?" return queryForGroup(stmt, reference, u.Id) diff --git a/server/routing/groups.go b/server/routing/groups.go index 8c9b04f..52f0c80 100644 --- a/server/routing/groups.go +++ b/server/routing/groups.go @@ -11,8 +11,7 @@ import ( ) type GroupProps struct { - Name string - Members []db.User + Group *db.Group CurrentUsername string } @@ -27,14 +26,10 @@ func (ctx *Context) GroupPage(user *db.User, w http.ResponseWriter, r *http.Requ error.Page(w, "Group not found. (It might be because you're not a member)", http.StatusNotFound, nil) return } - peers, err := user.GetPeers(group.Id) - if err != nil { - error.Page(w, "An error occurred while fetching this group :(", http.StatusInternalServerError, err) - return - } + index := group.MemberIndex(user.Id) + group.Members = slices.Delete(group.Members, index, index+1) p := GroupProps{ - Name: group.Name, - Members: peers, + Group: group, CurrentUsername: user.Name, } templates.Execute(w, "group_page.gotmpl", p) @@ -47,14 +42,8 @@ func (ctx *Context) PublicGroupPage(w http.ResponseWriter, r *http.Request) { error.Page(w, "An error occurred while fetching this group :(", http.StatusInternalServerError, err) return } - members, err := group.GetMembers() - if err != nil { - error.Page(w, "An error occurred while fetching this group :(", http.StatusInternalServerError, err) - return - } p := GroupProps{ - Name: group.Name, - Members: members, + Group: group, } templates.Execute(w, "public_group_page.gotmpl", p) } @@ -84,7 +73,7 @@ func (ctx *Context) GroupPost(currentUser *db.User, w http.ResponseWriter, r *ht } group = createdGroup } else { - existingGroup, err := db.GetGroupByReferenceWithMembers(reference) + existingGroup, err := db.GetGroupByReference(reference) if err != nil { writeGeneralErrorJson(w, http.StatusBadRequest, "Failed to get group: "+err.Error()) return @@ -106,7 +95,7 @@ func (ctx *Context) GroupPost(currentUser *db.User, w http.ResponseWriter, r *ht writeGeneralErrorJson(w, http.StatusBadRequest, "On group %q failed to remove user with id %s: %s", reference, userId, err) return } - group.Users = slices.Delete(group.Users, index, index) + group.Members = slices.Delete(group.Members, index, index+1) } } @@ -125,7 +114,7 @@ func (ctx *Context) GroupPost(currentUser *db.User, w http.ResponseWriter, r *ht writeGeneralErrorJson(w, http.StatusBadRequest, "Groups exists, but failed to add user with id %s: %s", userId, err) return } - group.Users = append(group.Users, *currentUser) + group.Members = append(group.Members, *currentUser) } _ = json.NewEncoder(w).Encode(group) @@ -152,7 +141,7 @@ func (ctx *Context) Group(user *db.User, w http.ResponseWriter, r *http.Request) return } groupReference := r.PathValue("groupReference") - group, err := db.GetGroupByReferenceWithMembers(groupReference) + group, err := db.GetGroupByReference(groupReference) if err != nil { writeGeneralErrorJson(w, http.StatusBadRequest, "Couldn't get group: %s", err) return diff --git a/server/routing/users.go b/server/routing/users.go index 83f42c6..b4c3220 100644 --- a/server/routing/users.go +++ b/server/routing/users.go @@ -14,7 +14,7 @@ func (ctx *Context) UsersJson(user *db.User, w http.ResponseWriter, r *http.Requ users, err := db.GetAllUsers() if err != nil { - writeGeneralErrorJson(w, http.StatusBadRequest, "Failed to get users: "+err.Error()) + writeGeneralErrorJson(w, http.StatusInternalServerError, "Failed to get users: "+err.Error()) return } diff --git a/server/templates/group_page.gotmpl b/server/templates/group_page.gotmpl index 5649ea9..035f4b8 100644 --- a/server/templates/group_page.gotmpl +++ b/server/templates/group_page.gotmpl @@ -30,8 +30,8 @@
-

{{.Name}} group members

- {{with .Members}} +

{{.Group.Name}} group members

+ {{with .Group.Members}}
    {{range .}}
  • diff --git a/server/templates/public_group_page.gotmpl b/server/templates/public_group_page.gotmpl index 9d63da1..0b05d6e 100644 --- a/server/templates/public_group_page.gotmpl +++ b/server/templates/public_group_page.gotmpl @@ -17,9 +17,9 @@
    -

    {{.Name}} group members

    +

    {{.Group.Name}} group members

    {{template "login_prompt"}} to see your groups

    - {{with .Members}} + {{with .Group.Members}}
      {{range .}}
    • @@ -34,4 +34,4 @@
-{{end}} \ No newline at end of file +{{end}}