Skip to content

Commit 73fd5f8

Browse files
committed
feat: add template version creator
1 parent c8d04af commit 73fd5f8

13 files changed

+104
-16
lines changed

coderd/audit/diff_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,14 @@ func TestDiff(t *testing.T) {
114114
UpdatedAt: time.Now(),
115115
OrganizationID: uuid.UUID{3},
116116
Name: "rust",
117+
CreatedBy: uuid.UUID{4},
117118
},
118119
exp: audit.Map{
119120
"id": uuid.UUID{1}.String(),
120121
"template_id": uuid.UUID{2}.String(),
121122
"organization_id": uuid.UUID{3}.String(),
122123
"name": "rust",
124+
"created_by": uuid.UUID{4}.String(),
123125
},
124126
},
125127
{
@@ -132,11 +134,13 @@ func TestDiff(t *testing.T) {
132134
UpdatedAt: time.Now(),
133135
OrganizationID: uuid.UUID{3},
134136
Name: "rust",
137+
CreatedBy: uuid.UUID{4},
135138
},
136139
exp: audit.Map{
137140
"id": uuid.UUID{1}.String(),
138141
"organization_id": uuid.UUID{3}.String(),
139142
"name": "rust",
143+
"created_by": uuid.UUID{4}.String(),
140144
},
141145
},
142146
})

coderd/audit/table.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ var AuditableResources = auditMap(map[any]map[string]Action{
8383
"name": ActionTrack,
8484
"readme": ActionTrack,
8585
"job_id": ActionIgnore, // Not helpful in a diff because jobs aren't tracked in audit logs.
86+
"created_by": ActionTrack,
8687
},
8788
&database.User{}: {
8889
"id": ActionTrack,

coderd/database/databasefake/databasefake.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,7 @@ func (q *fakeQuerier) InsertTemplateVersion(_ context.Context, arg database.Inse
15111511
Name: arg.Name,
15121512
Readme: arg.Readme,
15131513
JobID: arg.JobID,
1514+
CreatedBy: arg.CreatedBy,
15141515
}
15151516
q.templateVersions = append(q.templateVersions, version)
15161517
return version, nil

coderd/database/dump.sql

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE ONLY template_versions DROP COLUMN IF EXISTS created_by;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
ALTER TABLE ONLY template_versions ADD COLUMN IF NOT EXISTS created_by uuid REFERENCES users (id) ON DELETE RESTRICT;
2+
3+
UPDATE
4+
template_versions
5+
SET
6+
created_by = (
7+
SELECT created_by FROM templates
8+
WHERE template_versions.template_id = templates.id
9+
LIMIT 1
10+
)
11+
WHERE
12+
created_by IS NULL;
13+
14+
ALTER TABLE ONLY template_versions ALTER COLUMN created_by SET NOT NULL;

coderd/database/models.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: 16 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/templateversions.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ INSERT INTO
7070
updated_at,
7171
"name",
7272
readme,
73-
job_id
73+
job_id,
74+
created_by
7475
)
7576
VALUES
76-
($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *;
77+
($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *;
7778

7879
-- name: UpdateTemplateVersionByID :exec
7980
UPDATE

coderd/templateversions.go

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package coderd
22

33
import (
4+
"context"
45
"database/sql"
56
"encoding/json"
67
"errors"
@@ -36,7 +37,16 @@ func (api *API) templateVersion(rw http.ResponseWriter, r *http.Request) {
3637
return
3738
}
3839

39-
httpapi.Write(rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job)))
40+
createdByName, err := getCreatedByNameByTemplateVersionID(r.Context(), api.Database, templateVersion)
41+
if err != nil {
42+
httpapi.Write(rw, http.StatusInternalServerError, codersdk.Response{
43+
Message: "Internal error fetching creator name.",
44+
Detail: err.Error(),
45+
})
46+
return
47+
}
48+
49+
httpapi.Write(rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), createdByName))
4050
}
4151

4252
func (api *API) patchCancelTemplateVersion(rw http.ResponseWriter, r *http.Request) {
@@ -476,7 +486,14 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque
476486
})
477487
return err
478488
}
479-
apiVersions = append(apiVersions, convertTemplateVersion(version, convertProvisionerJob(job)))
489+
createdByName, err := getCreatedByNameByTemplateVersionID(r.Context(), api.Database, version)
490+
if err != nil {
491+
httpapi.Write(rw, http.StatusInternalServerError, codersdk.Response{
492+
Message: fmt.Sprintf("Internal error fetching creator name (user %q) for version %q.", version.CreatedBy, version.ID),
493+
})
494+
return err
495+
}
496+
apiVersions = append(apiVersions, convertTemplateVersion(version, convertProvisionerJob(job), createdByName))
480497
}
481498

482499
return nil
@@ -525,7 +542,16 @@ func (api *API) templateVersionByName(rw http.ResponseWriter, r *http.Request) {
525542
return
526543
}
527544

528-
httpapi.Write(rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job)))
545+
createdByName, err := getCreatedByNameByTemplateVersionID(r.Context(), api.Database, templateVersion)
546+
if err != nil {
547+
httpapi.Write(rw, http.StatusInternalServerError, codersdk.Response{
548+
Message: "Internal error fetching creator name.",
549+
Detail: err.Error(),
550+
})
551+
return
552+
}
553+
554+
httpapi.Write(rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), createdByName))
529555
}
530556

531557
func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Request) {
@@ -735,6 +761,7 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
735761
Name: namesgenerator.GetRandomName(1),
736762
Readme: "",
737763
JobID: provisionerJob.ID,
764+
CreatedBy: apiKey.UserID,
738765
})
739766
if err != nil {
740767
return xerrors.Errorf("insert template version: %w", err)
@@ -748,7 +775,16 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
748775
return
749776
}
750777

751-
httpapi.Write(rw, http.StatusCreated, convertTemplateVersion(templateVersion, convertProvisionerJob(provisionerJob)))
778+
createdByName, err := getCreatedByNameByTemplateVersionID(r.Context(), api.Database, templateVersion)
779+
if err != nil {
780+
httpapi.Write(rw, http.StatusInternalServerError, codersdk.Response{
781+
Message: "Internal error fetching creator name.",
782+
Detail: err.Error(),
783+
})
784+
return
785+
}
786+
787+
httpapi.Write(rw, http.StatusCreated, convertTemplateVersion(templateVersion, convertProvisionerJob(provisionerJob), createdByName))
752788
}
753789

754790
// templateVersionResources returns the workspace agent resources associated
@@ -796,7 +832,15 @@ func (api *API) templateVersionLogs(rw http.ResponseWriter, r *http.Request) {
796832
api.provisionerJobLogs(rw, r, job)
797833
}
798834

799-
func convertTemplateVersion(version database.TemplateVersion, job codersdk.ProvisionerJob) codersdk.TemplateVersion {
835+
func getCreatedByNameByTemplateVersionID(ctx context.Context, db database.Store, templateVersion database.TemplateVersion) (string, error) {
836+
creator, err := db.GetUserByID(ctx, templateVersion.CreatedBy)
837+
if err != nil {
838+
return "", err
839+
}
840+
return creator.Username, nil
841+
}
842+
843+
func convertTemplateVersion(version database.TemplateVersion, job codersdk.ProvisionerJob, createdByName string) codersdk.TemplateVersion {
800844
return codersdk.TemplateVersion{
801845
ID: version.ID,
802846
TemplateID: &version.TemplateID.UUID,
@@ -806,5 +850,7 @@ func convertTemplateVersion(version database.TemplateVersion, job codersdk.Provi
806850
Name: version.Name,
807851
Job: job,
808852
Readme: version.Readme,
853+
CreatedByID: version.CreatedBy,
854+
CreatedByName: createdByName,
809855
}
810856
}

codersdk/templateversions.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ type TemplateVersion struct {
2020
Name string `json:"name"`
2121
Job ProvisionerJob `json:"job"`
2222
Readme string `json:"readme"`
23+
CreatedByID uuid.UUID `json:"created_by_id"`
24+
CreatedByName string `json:"created_by_name"`
2325
}
2426

2527
// TemplateVersion returns a template version by ID.

site/src/api/typesGenerated.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export interface CreateTemplateRequest {
8787
readonly min_autostart_interval_ms?: number
8888
}
8989

90-
// From codersdk/templateversions.go:106:6
90+
// From codersdk/templateversions.go:108:6
9191
export interface CreateTemplateVersionDryRunRequest {
9292
readonly WorkspaceName: string
9393
readonly ParameterValues: CreateParameterRequest[]
@@ -290,6 +290,8 @@ export interface TemplateVersion {
290290
readonly name: string
291291
readonly job: ProvisionerJob
292292
readonly readme: string
293+
readonly created_by_id: string
294+
readonly created_by_name: string
293295
}
294296

295297
// From codersdk/templates.go:100:6

site/src/testHelpers/entities.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ name:Template test
112112
You can add instructions here
113113
114114
[Some link info](https://coder.com)`,
115+
created_by_id: "test-creator-id",
116+
created_by_name: "test_creator",
115117
}
116118

117119
export const MockTemplate: TypesGen.Template = {

0 commit comments

Comments
 (0)