Skip to content

Commit dbd5be7

Browse files
committed
feat(site): display user avatar
1 parent acd22b2 commit dbd5be7

File tree

13 files changed

+144
-92
lines changed

13 files changed

+144
-92
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/users.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,13 +1271,13 @@ func userOrganizationIDs(ctx context.Context, api *API, user database.User) ([]u
12711271
return member.OrganizationIDs, nil
12721272
}
12731273

1274-
func usernameWithID(id uuid.UUID, users []database.User) (string, bool) {
1274+
func userByID(id uuid.UUID, users []database.User) (database.User, bool) {
12751275
for _, user := range users {
12761276
if id == user.ID {
1277-
return user.Username, true
1277+
return user, true
12781278
}
12791279
}
1280-
return "", false
1280+
return database.User{}, false
12811281
}
12821282

12831283
func convertAPIKey(k database.APIKey) codersdk.APIKey {

coderd/workspacebuilds.go

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (api *API) workspaceBuild(rw http.ResponseWriter, r *http.Request) {
6969
})
7070
return
7171
}
72-
ownerName, ok := usernameWithID(workspace.OwnerID, data.users)
72+
owner, ok := userByID(workspace.OwnerID, data.users)
7373
if !ok {
7474
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
7575
Message: "Internal error converting workspace build.",
@@ -82,7 +82,7 @@ func (api *API) workspaceBuild(rw http.ResponseWriter, r *http.Request) {
8282
workspaceBuild,
8383
workspace,
8484
data.jobs[0],
85-
ownerName,
85+
owner,
8686
data.resources,
8787
data.metadata,
8888
data.agents,
@@ -283,7 +283,7 @@ func (api *API) workspaceBuildByBuildNumber(rw http.ResponseWriter, r *http.Requ
283283
})
284284
return
285285
}
286-
ownerName, ok := usernameWithID(workspace.OwnerID, data.users)
286+
owner, ok := userByID(workspace.OwnerID, data.users)
287287
if !ok {
288288
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
289289
Message: "Internal error converting workspace build.",
@@ -296,7 +296,7 @@ func (api *API) workspaceBuildByBuildNumber(rw http.ResponseWriter, r *http.Requ
296296
workspaceBuild,
297297
workspace,
298298
data.jobs[0],
299-
ownerName,
299+
owner,
300300
data.resources,
301301
data.metadata,
302302
data.agents,
@@ -416,7 +416,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
416416
})
417417
return
418418
}
419-
ownerName, exists := usernameWithID(workspace.OwnerID, users)
419+
owner, exists := userByID(workspace.OwnerID, users)
420420
if !exists {
421421
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
422422
Message: "Internal error converting workspace build.",
@@ -432,7 +432,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
432432
ProvisionerJob: *provisionerJob,
433433
QueuePosition: 0,
434434
},
435-
ownerName,
435+
owner,
436436
[]database.WorkspaceResource{},
437437
[]database.WorkspaceResourceMetadatum{},
438438
[]database.WorkspaceAgent{},
@@ -833,7 +833,7 @@ func (api *API) convertWorkspaceBuilds(
833833
if !exists {
834834
return nil, xerrors.New("template version not found")
835835
}
836-
ownerName, exists := usernameWithID(workspace.OwnerID, users)
836+
owner, exists := userByID(workspace.OwnerID, users)
837837
if !exists {
838838
return nil, xerrors.Errorf("owner not found for workspace: %q", workspace.Name)
839839
}
@@ -842,7 +842,7 @@ func (api *API) convertWorkspaceBuilds(
842842
build,
843843
workspace,
844844
job,
845-
ownerName,
845+
owner,
846846
workspaceResources,
847847
resourceMetadata,
848848
resourceAgents,
@@ -865,7 +865,7 @@ func (api *API) convertWorkspaceBuild(
865865
build database.WorkspaceBuild,
866866
workspace database.Workspace,
867867
job database.GetProvisionerJobsByIDsWithQueuePositionRow,
868-
ownerName string,
868+
owner database.User,
869869
workspaceResources []database.WorkspaceResource,
870870
resourceMetadata []database.WorkspaceResourceMetadatum,
871871
resourceAgents []database.WorkspaceAgent,
@@ -909,7 +909,7 @@ func (api *API) convertWorkspaceBuild(
909909
scripts := scriptsByAgentID[agent.ID]
910910
logSources := logSourcesByAgentID[agent.ID]
911911
apiAgent, err := db2sdk.WorkspaceAgent(
912-
api.DERPMap(), *api.TailnetCoordinator.Load(), agent, db2sdk.Apps(apps, agent, ownerName, workspace), convertScripts(scripts), convertLogSources(logSources), api.AgentInactiveDisconnectTimeout,
912+
api.DERPMap(), *api.TailnetCoordinator.Load(), agent, db2sdk.Apps(apps, agent, owner.Name, workspace), convertScripts(scripts), convertLogSources(logSources), api.AgentInactiveDisconnectTimeout,
913913
api.DeploymentValues.AgentFallbackTroubleshootingURL.String(),
914914
)
915915
if err != nil {
@@ -923,26 +923,27 @@ func (api *API) convertWorkspaceBuild(
923923
apiJob := convertProvisionerJob(job)
924924
transition := codersdk.WorkspaceTransition(build.Transition)
925925
return codersdk.WorkspaceBuild{
926-
ID: build.ID,
927-
CreatedAt: build.CreatedAt,
928-
UpdatedAt: build.UpdatedAt,
929-
WorkspaceOwnerID: workspace.OwnerID,
930-
WorkspaceOwnerName: ownerName,
931-
WorkspaceID: build.WorkspaceID,
932-
WorkspaceName: workspace.Name,
933-
TemplateVersionID: build.TemplateVersionID,
934-
TemplateVersionName: templateVersion.Name,
935-
BuildNumber: build.BuildNumber,
936-
Transition: transition,
937-
InitiatorID: build.InitiatorID,
938-
InitiatorUsername: build.InitiatorByUsername,
939-
Job: apiJob,
940-
Deadline: codersdk.NewNullTime(build.Deadline, !build.Deadline.IsZero()),
941-
MaxDeadline: codersdk.NewNullTime(build.MaxDeadline, !build.MaxDeadline.IsZero()),
942-
Reason: codersdk.BuildReason(build.Reason),
943-
Resources: apiResources,
944-
Status: convertWorkspaceStatus(apiJob.Status, transition),
945-
DailyCost: build.DailyCost,
926+
ID: build.ID,
927+
CreatedAt: build.CreatedAt,
928+
UpdatedAt: build.UpdatedAt,
929+
WorkspaceOwnerID: workspace.OwnerID,
930+
WorkspaceOwnerName: owner.Name,
931+
WorkspaceOwnerAvatarURL: owner.AvatarURL,
932+
WorkspaceID: build.WorkspaceID,
933+
WorkspaceName: workspace.Name,
934+
TemplateVersionID: build.TemplateVersionID,
935+
TemplateVersionName: templateVersion.Name,
936+
BuildNumber: build.BuildNumber,
937+
Transition: transition,
938+
InitiatorID: build.InitiatorID,
939+
InitiatorUsername: build.InitiatorByUsername,
940+
Job: apiJob,
941+
Deadline: codersdk.NewNullTime(build.Deadline, !build.Deadline.IsZero()),
942+
MaxDeadline: codersdk.NewNullTime(build.MaxDeadline, !build.MaxDeadline.IsZero()),
943+
Reason: codersdk.BuildReason(build.Reason),
944+
Resources: apiResources,
945+
Status: convertWorkspaceStatus(apiJob.Status, transition),
946+
DailyCost: build.DailyCost,
946947
}, nil
947948
}
948949

coderd/workspaces.go

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) {
9494
httpapi.Forbidden(rw)
9595
return
9696
}
97-
ownerName, ok := usernameWithID(workspace.OwnerID, data.users)
97+
owner, ok := userByID(workspace.OwnerID, data.users)
9898
if !ok {
9999
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
100100
Message: "Internal error fetching workspace resources.",
@@ -108,7 +108,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) {
108108
workspace,
109109
data.builds[0],
110110
data.templates[0],
111-
ownerName,
111+
owner,
112112
api.Options.AllowWorkspaceRenames,
113113
)
114114
if err != nil {
@@ -281,7 +281,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
281281
httpapi.ResourceNotFound(rw)
282282
return
283283
}
284-
ownerName, ok := usernameWithID(workspace.OwnerID, data.users)
284+
owner, ok := userByID(workspace.OwnerID, data.users)
285285
if !ok {
286286
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
287287
Message: "Internal error fetching workspace resources.",
@@ -294,7 +294,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
294294
workspace,
295295
data.builds[0],
296296
data.templates[0],
297-
ownerName,
297+
owner,
298298
api.Options.AllowWorkspaceRenames,
299299
)
300300
if err != nil {
@@ -590,7 +590,9 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
590590
ProvisionerJob: *provisionerJob,
591591
QueuePosition: 0,
592592
},
593-
member.Username,
593+
database.User{
594+
Name: member.Username,
595+
},
594596
[]database.WorkspaceResource{},
595597
[]database.WorkspaceResourceMetadatum{},
596598
[]database.WorkspaceAgent{},
@@ -612,7 +614,9 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
612614
workspace,
613615
apiBuild,
614616
template,
615-
member.Username,
617+
database.User{
618+
Name: member.Username,
619+
},
616620
api.Options.AllowWorkspaceRenames,
617621
)
618622
if err != nil {
@@ -941,7 +945,7 @@ func (api *API) putWorkspaceDormant(rw http.ResponseWriter, r *http.Request) {
941945
})
942946
return
943947
}
944-
ownerName, ok := usernameWithID(workspace.OwnerID, data.users)
948+
owner, ok := userByID(workspace.OwnerID, data.users)
945949
if !ok {
946950
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
947951
Message: "Internal error fetching workspace resources.",
@@ -962,7 +966,7 @@ func (api *API) putWorkspaceDormant(rw http.ResponseWriter, r *http.Request) {
962966
workspace,
963967
data.builds[0],
964968
data.templates[0],
965-
ownerName,
969+
owner,
966970
api.Options.AllowWorkspaceRenames,
967971
)
968972
if err != nil {
@@ -1372,7 +1376,7 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) {
13721376
return
13731377
}
13741378

1375-
ownerName, ok := usernameWithID(workspace.OwnerID, data.users)
1379+
owner, ok := userByID(workspace.OwnerID, data.users)
13761380
if !ok {
13771381
_ = sendEvent(ctx, codersdk.ServerSentEvent{
13781382
Type: codersdk.ServerSentEventTypeError,
@@ -1389,7 +1393,7 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) {
13891393
workspace,
13901394
data.builds[0],
13911395
data.templates[0],
1392-
ownerName,
1396+
owner,
13931397
api.Options.AllowWorkspaceRenames,
13941398
)
13951399
if err != nil {
@@ -1555,7 +1559,7 @@ func convertWorkspaces(requesterID uuid.UUID, workspaces []database.Workspace, d
15551559
workspace,
15561560
build,
15571561
template,
1558-
owner.Username,
1562+
owner,
15591563
data.allowRenames,
15601564
)
15611565
if err != nil {
@@ -1572,7 +1576,7 @@ func convertWorkspace(
15721576
workspace database.Workspace,
15731577
workspaceBuild codersdk.WorkspaceBuild,
15741578
template database.Template,
1575-
ownerName string,
1579+
owner database.User,
15761580
allowRenames bool,
15771581
) (codersdk.Workspace, error) {
15781582
if requesterID == uuid.Nil {
@@ -1612,7 +1616,8 @@ func convertWorkspace(
16121616
CreatedAt: workspace.CreatedAt,
16131617
UpdatedAt: workspace.UpdatedAt,
16141618
OwnerID: workspace.OwnerID,
1615-
OwnerName: ownerName,
1619+
OwnerName: owner.Name,
1620+
OwnerAvatarURL: owner.AvatarURL,
16161621
OrganizationID: workspace.OrganizationID,
16171622
TemplateID: workspace.TemplateID,
16181623
LatestBuild: workspaceBuild,

codersdk/workspacebuilds.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,27 @@ const (
5151
// WorkspaceBuild is an at-point representation of a workspace state.
5252
// BuildNumbers start at 1 and increase by 1 for each subsequent build
5353
type WorkspaceBuild struct {
54-
ID uuid.UUID `json:"id" format:"uuid"`
55-
CreatedAt time.Time `json:"created_at" format:"date-time"`
56-
UpdatedAt time.Time `json:"updated_at" format:"date-time"`
57-
WorkspaceID uuid.UUID `json:"workspace_id" format:"uuid"`
58-
WorkspaceName string `json:"workspace_name"`
59-
WorkspaceOwnerID uuid.UUID `json:"workspace_owner_id" format:"uuid"`
60-
WorkspaceOwnerName string `json:"workspace_owner_name"`
61-
TemplateVersionID uuid.UUID `json:"template_version_id" format:"uuid"`
62-
TemplateVersionName string `json:"template_version_name"`
63-
BuildNumber int32 `json:"build_number"`
64-
Transition WorkspaceTransition `json:"transition" enums:"start,stop,delete"`
65-
InitiatorID uuid.UUID `json:"initiator_id" format:"uuid"`
66-
InitiatorUsername string `json:"initiator_name"`
67-
Job ProvisionerJob `json:"job"`
68-
Reason BuildReason `db:"reason" json:"reason" enums:"initiator,autostart,autostop"`
69-
Resources []WorkspaceResource `json:"resources"`
70-
Deadline NullTime `json:"deadline,omitempty" format:"date-time"`
71-
MaxDeadline NullTime `json:"max_deadline,omitempty" format:"date-time"`
72-
Status WorkspaceStatus `json:"status" enums:"pending,starting,running,stopping,stopped,failed,canceling,canceled,deleting,deleted"`
73-
DailyCost int32 `json:"daily_cost"`
54+
ID uuid.UUID `json:"id" format:"uuid"`
55+
CreatedAt time.Time `json:"created_at" format:"date-time"`
56+
UpdatedAt time.Time `json:"updated_at" format:"date-time"`
57+
WorkspaceID uuid.UUID `json:"workspace_id" format:"uuid"`
58+
WorkspaceName string `json:"workspace_name"`
59+
WorkspaceOwnerID uuid.UUID `json:"workspace_owner_id" format:"uuid"`
60+
WorkspaceOwnerName string `json:"workspace_owner_name"`
61+
WorkspaceOwnerAvatarURL string `json:"workspace_owner_avatar_url"`
62+
TemplateVersionID uuid.UUID `json:"template_version_id" format:"uuid"`
63+
TemplateVersionName string `json:"template_version_name"`
64+
BuildNumber int32 `json:"build_number"`
65+
Transition WorkspaceTransition `json:"transition" enums:"start,stop,delete"`
66+
InitiatorID uuid.UUID `json:"initiator_id" format:"uuid"`
67+
InitiatorUsername string `json:"initiator_name"`
68+
Job ProvisionerJob `json:"job"`
69+
Reason BuildReason `db:"reason" json:"reason" enums:"initiator,autostart,autostop"`
70+
Resources []WorkspaceResource `json:"resources"`
71+
Deadline NullTime `json:"deadline,omitempty" format:"date-time"`
72+
MaxDeadline NullTime `json:"max_deadline,omitempty" format:"date-time"`
73+
Status WorkspaceStatus `json:"status" enums:"pending,starting,running,stopping,stopped,failed,canceling,canceled,deleting,deleted"`
74+
DailyCost int32 `json:"daily_cost"`
7475
}
7576

7677
// WorkspaceResource describes resources used to create a workspace, for instance:

codersdk/workspaces.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type Workspace struct {
2929
UpdatedAt time.Time `json:"updated_at" format:"date-time"`
3030
OwnerID uuid.UUID `json:"owner_id" format:"uuid"`
3131
OwnerName string `json:"owner_name"`
32+
OwnerAvatarURL string `json:"owner_avatar_url"`
3233
OrganizationID uuid.UUID `json:"organization_id" format:"uuid"`
3334
TemplateID uuid.UUID `json:"template_id" format:"uuid"`
3435
TemplateName string `json:"template_name"`

0 commit comments

Comments
 (0)