Skip to content

Commit efeb85e

Browse files
committed
feat: add user-level parameter auto-fill
1 parent 5a2cf7c commit efeb85e

File tree

16 files changed

+441
-0
lines changed

16 files changed

+441
-0
lines changed

coderd/apidoc/docs.go

Lines changed: 51 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: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,7 @@ func New(options *Options) *API {
823823
r.Post("/convert-login", api.postConvertLoginType)
824824
r.Delete("/", api.deleteUser)
825825
r.Get("/", api.userByName)
826+
r.Get("/parameters", api.userParameters)
826827
r.Get("/login-type", api.userLoginType)
827828
r.Put("/profile", api.putUserProfile)
828829
r.Route("/status", func(r chi.Router) {

coderd/database/dbauthz/dbauthz.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,6 +1754,17 @@ func (q *querier) GetUserLinksByUserID(ctx context.Context, userID uuid.UUID) ([
17541754
return q.db.GetUserLinksByUserID(ctx, userID)
17551755
}
17561756

1757+
func (q *querier) GetUserWorkspaceBuildParameters(ctx context.Context, ownerID uuid.UUID) ([]database.GetUserWorkspaceBuildParametersRow, error) {
1758+
u, err := q.db.GetUserByID(ctx, ownerID)
1759+
if err != nil {
1760+
return nil, err
1761+
}
1762+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, u.UserDataRBACObject()); err != nil {
1763+
return nil, err
1764+
}
1765+
return q.db.GetUserWorkspaceBuildParameters(ctx, ownerID)
1766+
}
1767+
17571768
func (q *querier) GetUsers(ctx context.Context, arg database.GetUsersParams) ([]database.GetUsersRow, error) {
17581769
// This does the filtering in SQL.
17591770
prep, err := prepareSQLFilter(ctx, q.auth, rbac.ActionRead, rbac.ResourceUser.Type)

coderd/database/dbmem/dbmem.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3758,6 +3758,42 @@ func (q *FakeQuerier) GetUserLinksByUserID(_ context.Context, userID uuid.UUID)
37583758
return uls, nil
37593759
}
37603760

3761+
func (q *FakeQuerier) GetUserWorkspaceBuildParameters(ctx context.Context, ownerID uuid.UUID) ([]database.GetUserWorkspaceBuildParametersRow, error) {
3762+
q.mutex.RLock()
3763+
defer q.mutex.RUnlock()
3764+
3765+
userWorkspaceIDs := make(map[uuid.UUID]struct{})
3766+
for _, ws := range q.workspaces {
3767+
if ws.OwnerID != ownerID {
3768+
continue
3769+
}
3770+
userWorkspaceIDs[ws.ID] = struct{}{}
3771+
}
3772+
3773+
userWorkspaceBuilds := make(map[uuid.UUID]database.WorkspaceBuildTable)
3774+
for _, wb := range q.workspaceBuilds {
3775+
if _, ok := userWorkspaceIDs[wb.WorkspaceID]; !ok {
3776+
continue
3777+
}
3778+
userWorkspaceBuilds[wb.ID] = wb
3779+
}
3780+
3781+
userWorkspaceBuildParameters := make([]database.GetUserWorkspaceBuildParametersRow, 0)
3782+
for _, wbp := range q.workspaceBuildParameters {
3783+
wb, ok := userWorkspaceBuilds[wbp.WorkspaceBuildID]
3784+
if !ok {
3785+
continue
3786+
}
3787+
userWorkspaceBuildParameters = append(userWorkspaceBuildParameters, database.GetUserWorkspaceBuildParametersRow{
3788+
Name: wbp.Name,
3789+
Value: wbp.Value,
3790+
CreatedAt: wb.CreatedAt,
3791+
})
3792+
}
3793+
3794+
return userWorkspaceBuildParameters, nil
3795+
}
3796+
37613797
func (q *FakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams) ([]database.GetUsersRow, error) {
37623798
if err := validateDatabaseType(params); err != nil {
37633799
return nil, err

coderd/database/dbmetrics/dbmetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/workspacebuildparameters.sql

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,28 @@ FROM
1414
workspace_build_parameters
1515
WHERE
1616
workspace_build_id = $1;
17+
18+
-- name: GetUserWorkspaceBuildParameters :many
19+
SELECT
20+
sub.name,
21+
sub.value,
22+
sub.created_at
23+
FROM (
24+
SELECT
25+
wbp.name,
26+
wbp.value,
27+
wb.created_at,
28+
ROW_NUMBER() OVER (PARTITION BY wbp.name ORDER BY wb.created_at DESC) as rn
29+
FROM
30+
workspace_build_parameters wbp
31+
JOIN
32+
workspace_builds wb ON wb.id = wbp.workspace_build_id
33+
JOIN
34+
workspaces w ON w.id = wb.workspace_id
35+
WHERE
36+
w.owner_id = $1
37+
AND wb.transition = 'start'
38+
) sub
39+
WHERE
40+
sub.rn = 1
41+
LIMIT 100;

coderd/users.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,53 @@ func (api *API) userByName(rw http.ResponseWriter, r *http.Request) {
569569
httpapi.Write(ctx, rw, http.StatusOK, db2sdk.User(user, organizationIDs))
570570
}
571571

572+
// Returns recent build parameters for the signed-in user.
573+
//
574+
// @Summary Get recent build parameters for user.
575+
// @ID get-user-params
576+
// @Security CoderSessionToken
577+
// @Produce json
578+
// @Tags Users
579+
// @Param user path string true "User ID, username, or me"
580+
// @Success 200 {array} codersdk.UserParameter
581+
// @Router /users/{user}/parameters [get]
582+
func (api *API) userParameters(rw http.ResponseWriter, r *http.Request) {
583+
var (
584+
apiKey = httpmw.APIKey(r)
585+
user = httpmw.UserParam(r)
586+
)
587+
588+
if apiKey.UserID != user.ID {
589+
httpapi.Write(r.Context(), rw, http.StatusForbidden, codersdk.Response{
590+
Message: "You are not authorized to view this user's parameters.",
591+
})
592+
return
593+
}
594+
595+
params, err := api.Database.GetUserWorkspaceBuildParameters(
596+
r.Context(),
597+
apiKey.UserID,
598+
)
599+
if err != nil {
600+
httpapi.Write(r.Context(), rw, http.StatusInternalServerError, codersdk.Response{
601+
Message: "Internal error fetching user's parameters.",
602+
Detail: err.Error(),
603+
})
604+
return
605+
}
606+
607+
var sdkParams []codersdk.UserParameter
608+
for _, param := range params {
609+
sdkParams = append(sdkParams, codersdk.UserParameter{
610+
Name: param.Name,
611+
Value: param.Value,
612+
LastUsedAt: param.CreatedAt,
613+
})
614+
}
615+
616+
httpapi.Write(r.Context(), rw, http.StatusOK, sdkParams)
617+
}
618+
572619
// Returns the user's login type. This only works if the api key for authorization
573620
// and the requested user match. Eg: 'me'
574621
//

0 commit comments

Comments
 (0)