From 0e7209734681d5597ecb2933a1f0660ca41cb434 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 12 Mar 2023 01:31:31 +0100 Subject: [PATCH] feat(backend): always return empty arrays instead of null --- backend/routes/auth/discord.go | 9 +++++++-- backend/routes/auth/routes.go | 24 +++++++++++++++--------- backend/routes/member/get_member.go | 12 ++++++------ backend/routes/member/get_members.go | 20 ++++++++++++-------- backend/routes/member/patch_member.go | 7 +++++++ backend/routes/user/get_user.go | 24 ++++++++++++++---------- 6 files changed, 61 insertions(+), 35 deletions(-) diff --git a/backend/routes/auth/discord.go b/backend/routes/auth/discord.go index deb6eba..d0a9b78 100644 --- a/backend/routes/auth/discord.go +++ b/backend/routes/auth/discord.go @@ -95,10 +95,15 @@ func (s *Server) discordCallback(w http.ResponseWriter, r *http.Request) error { return errors.Wrap(err, "saving token to database") } + fields, err := s.DB.UserFields(ctx, u.ID) + if err != nil { + return errors.Wrap(err, "querying fields") + } + render.JSON(w, r, discordCallbackResponse{ HasAccount: true, Token: token, - User: dbUserToUserResponse(u), + User: dbUserToUserResponse(u, fields), }) return nil @@ -230,7 +235,7 @@ func (s *Server) discordSignup(w http.ResponseWriter, r *http.Request) error { // return user render.JSON(w, r, signupResponse{ - User: *dbUserToUserResponse(u), + User: *dbUserToUserResponse(u, nil), Token: token, }) return nil diff --git a/backend/routes/auth/routes.go b/backend/routes/auth/routes.go index 67f148c..fcd0194 100644 --- a/backend/routes/auth/routes.go +++ b/backend/routes/auth/routes.go @@ -20,25 +20,31 @@ type Server struct { } type userResponse struct { - ID xid.ID `json:"id"` - Username string `json:"name"` - DisplayName *string `json:"display_name"` - Bio *string `json:"bio"` - AvatarURLs []string `json:"avatar_urls"` - Links []string `json:"links"` + ID xid.ID `json:"id"` + Username string `json:"name"` + DisplayName *string `json:"display_name"` + Bio *string `json:"bio"` + AvatarURLs []string `json:"avatar_urls"` + Links []string `json:"links"` + Names []db.FieldEntry `json:"names"` + Pronouns []db.PronounEntry `json:"pronouns"` + Fields []db.Field `json:"fields"` Discord *string `json:"discord"` DiscordUsername *string `json:"discord_username"` } -func dbUserToUserResponse(u db.User) *userResponse { +func dbUserToUserResponse(u db.User, fields []db.Field) *userResponse { return &userResponse{ ID: u.ID, Username: u.Username, DisplayName: u.DisplayName, Bio: u.Bio, - AvatarURLs: u.AvatarURLs, - Links: u.Links, + AvatarURLs: db.NotNull(u.AvatarURLs), + Links: db.NotNull(u.Links), + Names: db.NotNull(u.Names), + Pronouns: db.NotNull(u.Pronouns), + Fields: db.NotNull(fields), Discord: u.Discord, DiscordUsername: u.DiscordUsername, } diff --git a/backend/routes/member/get_member.go b/backend/routes/member/get_member.go index 1316780..6f675c7 100644 --- a/backend/routes/member/get_member.go +++ b/backend/routes/member/get_member.go @@ -32,18 +32,18 @@ func dbMemberToMember(u db.User, m db.Member, fields []db.Field) GetMemberRespon Name: m.Name, DisplayName: m.DisplayName, Bio: m.Bio, - AvatarURLs: m.AvatarURLs, - Links: m.Links, + AvatarURLs: db.NotNull(m.AvatarURLs), + Links: db.NotNull(m.Links), - Names: m.Names, - Pronouns: m.Pronouns, - Fields: fields, + Names: db.NotNull(m.Names), + Pronouns: db.NotNull(m.Pronouns), + Fields: db.NotNull(fields), User: PartialUser{ ID: u.ID, Username: u.Username, DisplayName: u.DisplayName, - AvatarURLs: u.AvatarURLs, + AvatarURLs: db.NotNull(u.AvatarURLs), }, } } diff --git a/backend/routes/member/get_members.go b/backend/routes/member/get_members.go index ff7f631..ab791eb 100644 --- a/backend/routes/member/get_members.go +++ b/backend/routes/member/get_members.go @@ -11,12 +11,14 @@ import ( ) type memberListResponse struct { - ID xid.ID `json:"id"` - Name string `json:"name"` - DisplayName *string `json:"display_name"` - Bio *string `json:"bio"` - AvatarURLs []string `json:"avatar_urls"` - Links []string `json:"links"` + ID xid.ID `json:"id"` + Name string `json:"name"` + DisplayName *string `json:"display_name"` + Bio *string `json:"bio"` + AvatarURLs []string `json:"avatar_urls"` + Links []string `json:"links"` + Names []db.FieldEntry `json:"names"` + Pronouns []db.PronounEntry `json:"pronouns"` } func membersToMemberList(ms []db.Member) []memberListResponse { @@ -26,8 +28,10 @@ func membersToMemberList(ms []db.Member) []memberListResponse { ID: ms[i].ID, Name: ms[i].Name, Bio: ms[i].Bio, - AvatarURLs: ms[i].AvatarURLs, - Links: ms[i].Links, + AvatarURLs: db.NotNull(ms[i].AvatarURLs), + Links: db.NotNull(ms[i].Links), + Names: db.NotNull(ms[i].Names), + Pronouns: db.NotNull(ms[i].Pronouns), } } diff --git a/backend/routes/member/patch_member.go b/backend/routes/member/patch_member.go index 61f39d6..10f706f 100644 --- a/backend/routes/member/patch_member.go +++ b/backend/routes/member/patch_member.go @@ -68,6 +68,13 @@ func (s *Server) patchMember(w http.ResponseWriter, r *http.Request) error { } } + if req.Name != nil && *req.Name == "" { + return server.APIError{ + Code: server.ErrBadRequest, + Details: "Name must not be empty", + } + } + // validate display name/bio if req.Name != nil && len(*req.Name) > db.MaxMemberNameLength { return server.APIError{ diff --git a/backend/routes/user/get_user.go b/backend/routes/user/get_user.go index 6a07104..a8db049 100644 --- a/backend/routes/user/get_user.go +++ b/backend/routes/user/get_user.go @@ -32,10 +32,12 @@ type GetMeResponse struct { } type PartialMember struct { - ID xid.ID `json:"id"` - Name string `json:"name"` - DisplayName *string `json:"display_name"` - AvatarURLs []string `json:"avatar_urls"` + ID xid.ID `json:"id"` + Name string `json:"name"` + DisplayName *string `json:"display_name"` + AvatarURLs []string `json:"avatar_urls"` + Names []db.FieldEntry `json:"names"` + Pronouns []db.PronounEntry `json:"pronouns"` } func dbUserToResponse(u db.User, fields []db.Field, members []db.Member) GetUserResponse { @@ -44,11 +46,11 @@ func dbUserToResponse(u db.User, fields []db.Field, members []db.Member) GetUser Username: u.Username, DisplayName: u.DisplayName, Bio: u.Bio, - AvatarURLs: u.AvatarURLs, - Links: u.Links, - Names: u.Names, - Pronouns: u.Pronouns, - Fields: fields, + AvatarURLs: db.NotNull(u.AvatarURLs), + Links: db.NotNull(u.Links), + Names: db.NotNull(u.Names), + Pronouns: db.NotNull(u.Pronouns), + Fields: db.NotNull(fields), } resp.Members = make([]PartialMember, len(members)) @@ -57,7 +59,9 @@ func dbUserToResponse(u db.User, fields []db.Field, members []db.Member) GetUser ID: members[i].ID, Name: members[i].Name, DisplayName: members[i].DisplayName, - AvatarURLs: members[i].AvatarURLs, + AvatarURLs: db.NotNull(members[i].AvatarURLs), + Names: db.NotNull(members[i].Names), + Pronouns: db.NotNull(members[i].Pronouns), } }