Skip to content

Commit 94c129c

Browse files
fix!: omit name, avatar_url and last_seen_at from responses when empty (#18005)
User name, avatar URL, and last seen at, are not required fields so they can be empty. Instead of returning the 0 values from Go, we want to make it more agnostic, and omit them when they are empty. This make the docs and usage way clearer for consumers.
1 parent 96f69b8 commit 94c129c

File tree

11 files changed

+21
-25
lines changed

11 files changed

+21
-25
lines changed

cli/testdata/coder_list_--output_json.golden

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
"workspace_name": "test-workspace",
2525
"workspace_owner_id": "==========[first user ID]===========",
2626
"workspace_owner_name": "testuser",
27-
"workspace_owner_avatar_url": "",
2827
"template_version_id": "============[version ID]============",
2928
"template_version_name": "===========[version name]===========",
3029
"build_number": 1,

cli/testdata/coder_users_list_--output_json.golden

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
{
33
"id": "==========[first user ID]===========",
44
"username": "testuser",
5-
"avatar_url": "",
65
"name": "Test User",
76
"email": "testuser@coder.com",
87
"created_at": "====[timestamp]=====",
@@ -23,8 +22,6 @@
2322
{
2423
"id": "==========[second user ID]==========",
2524
"username": "testuser2",
26-
"avatar_url": "",
27-
"name": "",
2825
"email": "testuser2@coder.com",
2926
"created_at": "====[timestamp]=====",
3027
"updated_at": "====[timestamp]=====",

codersdk/organizations.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ type OrganizationMember struct {
7474

7575
type OrganizationMemberWithUserData struct {
7676
Username string `table:"username,default_sort" json:"username"`
77-
Name string `table:"name" json:"name"`
78-
AvatarURL string `json:"avatar_url"`
77+
Name string `table:"name" json:"name,omitempty"`
78+
AvatarURL string `json:"avatar_url,omitempty"`
7979
Email string `json:"email"`
8080
GlobalRoles []SlimRole `json:"global_roles"`
8181
OrganizationMember `table:"m,recursive_inline"`

codersdk/users.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type UsersRequest struct {
4040
type MinimalUser struct {
4141
ID uuid.UUID `json:"id" validate:"required" table:"id" format:"uuid"`
4242
Username string `json:"username" validate:"required" table:"username,default_sort"`
43-
AvatarURL string `json:"avatar_url" format:"uri"`
43+
AvatarURL string `json:"avatar_url,omitempty" format:"uri"`
4444
}
4545

4646
// ReducedUser omits role and organization information. Roles are deduced from
@@ -49,11 +49,11 @@ type MinimalUser struct {
4949
// required by the frontend.
5050
type ReducedUser struct {
5151
MinimalUser `table:"m,recursive_inline"`
52-
Name string `json:"name"`
52+
Name string `json:"name,omitempty"`
5353
Email string `json:"email" validate:"required" table:"email" format:"email"`
5454
CreatedAt time.Time `json:"created_at" validate:"required" table:"created at" format:"date-time"`
5555
UpdatedAt time.Time `json:"updated_at" table:"updated at" format:"date-time"`
56-
LastSeenAt time.Time `json:"last_seen_at" format:"date-time"`
56+
LastSeenAt time.Time `json:"last_seen_at,omitempty" format:"date-time"`
5757

5858
Status UserStatus `json:"status" table:"status" enums:"active,suspended"`
5959
LoginType LoginType `json:"login_type"`

codersdk/workspacebuilds.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ type WorkspaceBuild struct {
5858
WorkspaceName string `json:"workspace_name"`
5959
WorkspaceOwnerID uuid.UUID `json:"workspace_owner_id" format:"uuid"`
6060
WorkspaceOwnerName string `json:"workspace_owner_name"`
61-
WorkspaceOwnerAvatarURL string `json:"workspace_owner_avatar_url"`
61+
WorkspaceOwnerAvatarURL string `json:"workspace_owner_avatar_url,omitempty"`
6262
TemplateVersionID uuid.UUID `json:"template_version_id" format:"uuid"`
6363
TemplateVersionName string `json:"template_version_name"`
6464
BuildNumber int32 `json:"build_number"`

site/src/api/typesGenerated.ts

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

site/src/components/UserAutocomplete/UserAutocomplete.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { prepareQuery } from "utils/filters";
2020

2121
// The common properties between users and org members that we need.
2222
export type SelectedUser = {
23-
avatar_url: string;
23+
avatar_url?: string;
2424
email: string;
2525
username: string;
2626
};

site/src/pages/ChatPage/ChatLanding.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ const ChatLanding: FC = () => {
6262
textAlign: "center",
6363
}}
6464
>
65-
Good evening, {user?.name.split(" ")[0]}
65+
Good evening, {(user.name ?? user.username).split(" ")[0]}
6666
</h1>
6767
<p
6868
css={{

site/src/pages/UserSettingsPage/AccountPage/AccountForm.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe("AccountForm", () => {
1313
// Given
1414
const mockInitialValues: UpdateUserProfileRequest = {
1515
username: MockUserMember.username,
16-
name: MockUserMember.name,
16+
name: MockUserMember.name ?? MockUserMember.username,
1717
};
1818

1919
// When
@@ -44,7 +44,7 @@ describe("AccountForm", () => {
4444
// Given
4545
const mockInitialValues: UpdateUserProfileRequest = {
4646
username: MockUserMember.username,
47-
name: MockUserMember.name,
47+
name: MockUserMember.name ?? MockUserMember.username,
4848
};
4949

5050
// When

site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const AccountPage: FC = () => {
2929
email={me.email}
3030
updateProfileError={updateProfileError}
3131
isLoading={isUpdatingProfile}
32-
initialValues={{ username: me.username, name: me.name }}
32+
initialValues={{ username: me.username, name: me.name ?? "" }}
3333
onSubmit={updateProfile}
3434
/>
3535
</Section>

site/src/testHelpers/entities.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,8 @@ export const MockOrganizationMember: TypesGen.OrganizationMemberWithUserData = {
539539
user_id: MockUserOwner.id,
540540
username: MockUserOwner.username,
541541
email: MockUserOwner.email,
542-
created_at: "",
543-
updated_at: "",
542+
updated_at: "2025-05-22T17:51:49.49745Z",
543+
created_at: "2025-05-22T17:51:49.497449Z",
544544
name: MockUserOwner.name,
545545
avatar_url: MockUserOwner.avatar_url,
546546
global_roles: MockUserOwner.roles,
@@ -553,8 +553,8 @@ export const MockOrganizationMember2: TypesGen.OrganizationMemberWithUserData =
553553
user_id: MockUserMember.id,
554554
username: MockUserMember.username,
555555
email: MockUserMember.email,
556-
created_at: "",
557-
updated_at: "",
556+
updated_at: "2025-05-22T17:51:49.49745Z",
557+
created_at: "2025-05-22T17:51:49.497449Z",
558558
name: MockUserMember.name,
559559
avatar_url: MockUserMember.avatar_url,
560560
global_roles: MockUserMember.roles,

0 commit comments

Comments
 (0)