Skip to content

Commit 0d411a0

Browse files
committed
Add route and test
1 parent e64b8c9 commit 0d411a0

File tree

8 files changed

+114
-9
lines changed

8 files changed

+114
-9
lines changed

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ func New(options *Options) *API {
343343
r.Route("/templateversions", func(r chi.Router) {
344344
r.Post("/", api.postTemplateVersionsByOrganization)
345345
r.Get("/{templateversionname}", api.templateVersionByOrganizationAndName)
346+
r.Get("/{templateversionname}/previous", api.previousTemplateVersionByOrganizationAndName)
346347
})
347348
r.Route("/templates", func(r chi.Router) {
348349
r.Post("/", api.postTemplateByOrganization)

coderd/database/databasefake/databasefake.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,7 +1717,7 @@ func (q *fakeQuerier) GetTemplateVersionByJobID(_ context.Context, jobID uuid.UU
17171717
return database.TemplateVersion{}, sql.ErrNoRows
17181718
}
17191719

1720-
func (q *fakeQuerier) GetPreviousTemplateVersionByID(_ context.Context, id uuid.UUID) (database.TemplateVersion, error) {
1720+
func (q *fakeQuerier) GetPreviousTemplateVersionByOrganizationAndName(_ context.Context, arg database.GetPreviousTemplateVersionByOrganizationAndNameParams) (database.TemplateVersion, error) {
17211721
q.mutex.RLock()
17221722
defer q.mutex.RUnlock()
17231723

@@ -1728,7 +1728,10 @@ func (q *fakeQuerier) GetPreviousTemplateVersionByID(_ context.Context, id uuid.
17281728

17291729
var previousIndex = -1
17301730
for index, templateVersion := range templateVersions {
1731-
if templateVersion.ID != id {
1731+
if templateVersion.OrganizationID != arg.OrganizationID {
1732+
continue
1733+
}
1734+
if !strings.EqualFold(templateVersion.Name, arg.Name) {
17321735
continue
17331736
}
17341737
previousIndex = index - 1

coderd/database/querier.go

Lines changed: 1 addition & 1 deletion
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: 13 additions & 4 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: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,16 @@ SET
111111
WHERE
112112
job_id = $1;
113113

114-
-- name: GetPreviousTemplateVersionByID :one
114+
-- name: GetPreviousTemplateVersionByOrganizationAndName :one
115115
SELECT
116116
*
117117
FROM
118118
template_versions
119119
WHERE
120-
created_at < (SELECT created_at FROM template_versions WHERE template_versions.id = @id)
120+
created_at < (
121+
SELECT created_at
122+
FROM template_versions as tv
123+
WHERE tv.organization_id = $1 AND tv.name = $2
124+
)
121125
ORDER BY created_at DESC
122126
LIMIT 1;

coderd/templateversions.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,48 @@ func (api *API) templateVersionByOrganizationAndName(rw http.ResponseWriter, r *
640640
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user))
641641
}
642642

643+
func (api *API) previousTemplateVersionByOrganizationAndName(rw http.ResponseWriter, r *http.Request) {
644+
ctx := r.Context()
645+
organization := httpmw.OrganizationParam(r)
646+
templateVersionName := chi.URLParam(r, "templateversionname")
647+
templateVersion, err := api.Database.GetPreviousTemplateVersionByOrganizationAndName(ctx, database.GetPreviousTemplateVersionByOrganizationAndNameParams{
648+
OrganizationID: organization.ID,
649+
Name: templateVersionName,
650+
})
651+
if errors.Is(err, sql.ErrNoRows) {
652+
httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{
653+
Message: fmt.Sprintf("No previous template version found for name %q.", templateVersionName),
654+
})
655+
return
656+
}
657+
if err != nil {
658+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
659+
Message: "Internal error fetching the previous template version.",
660+
Detail: err.Error(),
661+
})
662+
return
663+
}
664+
job, err := api.Database.GetProvisionerJobByID(ctx, templateVersion.JobID)
665+
if err != nil {
666+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
667+
Message: "Internal error fetching provisioner job.",
668+
Detail: err.Error(),
669+
})
670+
return
671+
}
672+
673+
user, err := api.Database.GetUserByID(ctx, templateVersion.CreatedBy)
674+
if err != nil {
675+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
676+
Message: "Internal error on fetching user.",
677+
Detail: err.Error(),
678+
})
679+
return
680+
}
681+
682+
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user))
683+
}
684+
643685
func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Request) {
644686
var (
645687
ctx = r.Context()

coderd/templateversions_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -963,3 +963,36 @@ func TestTemplateVersionByOrganizationAndName(t *testing.T) {
963963
require.NoError(t, err)
964964
})
965965
}
966+
967+
func TestPreviousTemplateVersion(t *testing.T) {
968+
t.Parallel()
969+
t.Run("Not found", func(t *testing.T) {
970+
t.Parallel()
971+
client := coderdtest.New(t, nil)
972+
user := coderdtest.CreateFirstUser(t, client)
973+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
974+
975+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
976+
defer cancel()
977+
978+
_, err := client.PreviousTemplateVersion(ctx, user.OrganizationID, version.Name)
979+
var apiErr *codersdk.Error
980+
require.ErrorAs(t, err, &apiErr)
981+
require.Equal(t, http.StatusNotFound, apiErr.StatusCode())
982+
})
983+
984+
t.Run("Found", func(t *testing.T) {
985+
t.Parallel()
986+
client := coderdtest.New(t, nil)
987+
user := coderdtest.CreateFirstUser(t, client)
988+
previousVersion := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
989+
latestVersion := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
990+
991+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
992+
defer cancel()
993+
994+
_, err := client.PreviousTemplateVersion(ctx, user.OrganizationID, latestVersion.Name)
995+
require.NoError(t, err)
996+
require.Equal(t, previousVersion.ID, latestVersion.ID)
997+
})
998+
}

codersdk/templateversions.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,16 @@ func (c *Client) CancelTemplateVersionDryRun(ctx context.Context, version, job u
182182
}
183183
return nil
184184
}
185+
186+
func (c *Client) PreviousTemplateVersion(ctx context.Context, organization uuid.UUID, versionName string) (TemplateVersion, error) {
187+
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/organizations/%s/templateversions/%s/previous", organization, versionName), nil)
188+
if err != nil {
189+
return TemplateVersion{}, err
190+
}
191+
defer res.Body.Close()
192+
if res.StatusCode != http.StatusOK {
193+
return TemplateVersion{}, readBodyAsError(res)
194+
}
195+
var version TemplateVersion
196+
return version, json.NewDecoder(res.Body).Decode(&version)
197+
}

0 commit comments

Comments
 (0)