Skip to content

Commit 7498c73

Browse files
committed
Add unarchive api
1 parent 938f256 commit 7498c73

File tree

8 files changed

+150
-16
lines changed

8 files changed

+150
-16
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2271,6 +2271,22 @@ func (q *querier) TryAcquireLock(ctx context.Context, id int64) (bool, error) {
22712271
return q.db.TryAcquireLock(ctx, id)
22722272
}
22732273

2274+
func (q *querier) UnarchiveTemplateVersion(ctx context.Context, arg database.UnarchiveTemplateVersionParams) error {
2275+
v, err := q.db.GetTemplateVersionByID(ctx, arg.TemplateVersionID)
2276+
if err != nil {
2277+
return err
2278+
}
2279+
2280+
tpl, err := q.db.GetTemplateByID(ctx, v.TemplateID.UUID)
2281+
if err != nil {
2282+
return err
2283+
}
2284+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, tpl); err != nil {
2285+
return err
2286+
}
2287+
return q.db.UnarchiveTemplateVersion(ctx, arg)
2288+
}
2289+
22742290
func (q *querier) UpdateAPIKeyByID(ctx context.Context, arg database.UpdateAPIKeyByIDParams) error {
22752291
fetch := func(ctx context.Context, arg database.UpdateAPIKeyByIDParams) (database.APIKey, error) {
22762292
return q.db.GetAPIKeyByID(ctx, arg.ID)

coderd/database/dbfake/dbfake.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5330,6 +5330,15 @@ func (*FakeQuerier) TryAcquireLock(_ context.Context, _ int64) (bool, error) {
53305330
return false, xerrors.New("TryAcquireLock must only be called within a transaction")
53315331
}
53325332

5333+
func (q *FakeQuerier) UnarchiveTemplateVersion(ctx context.Context, arg database.UnarchiveTemplateVersionParams) error {
5334+
err := validateDatabaseType(arg)
5335+
if err != nil {
5336+
return err
5337+
}
5338+
5339+
panic("not implemented")
5340+
}
5341+
53335342
func (q *FakeQuerier) UpdateAPIKeyByID(_ context.Context, arg database.UpdateAPIKeyByIDParams) error {
53345343
if err := validateDatabaseType(arg); err != nil {
53355344
return 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: 14 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: 2 additions & 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: 51 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: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,16 @@ ORDER BY created_at DESC
138138
LIMIT 1;
139139

140140

141+
-- name: UnarchiveTemplateVersion :exec
142+
-- This will always work regardless of the current state of the template version.
143+
UPDATE
144+
template_versions
145+
SET
146+
archived = false,
147+
updated_at = sqlc.arg('updated_at')
148+
WHERE
149+
id = sqlc.arg('template_version_id');
150+
141151
-- name: ArchiveUnusedTemplateVersions :many
142152
-- Archiving templates is a soft delete action, so is reversible.
143153
-- Archiving prevents the version from being used and discovered
@@ -156,7 +166,24 @@ FROM
156166
scoped_template_versions.id
157167
FROM
158168
-- Scope an archive to a single template and ignore already archived template versions
159-
(SELECT * FROM template_versions WHERE template_versions.template_id = sqlc.arg('template_id') :: uuid AND archived = false) AS scoped_template_versions
169+
(
170+
SELECT
171+
*
172+
FROM
173+
template_versions
174+
WHERE
175+
template_versions.template_id = sqlc.arg('template_id') :: uuid
176+
AND
177+
archived = false
178+
AND
179+
-- This allows archiving a specfic template version.
180+
CASE
181+
WHEN sqlc.arg('template_version_id')::uuid != '00000000-0000-0000-0000-000000000000'::uuid THEN
182+
template_versions.id = sqlc.arg('template_version_id') :: uuid
183+
ELSE
184+
true
185+
END
186+
) AS scoped_template_versions
160187
LEFT JOIN
161188
provisioner_jobs ON scoped_template_versions.job_id = provisioner_jobs.id
162189
LEFT JOIN

coderd/templateversions.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,15 +1135,30 @@ func (api *API) setArchiveTemplateVersion(archive bool) func(rw http.ResponseWri
11351135
return
11361136
}
11371137

1138-
archived, err := api.Database.ArchiveUnusedTemplateVersions(ctx, database.ArchiveUnusedTemplateVersionsParams{
1139-
UpdatedAt: dbtime.Now(),
1140-
TemplateID: templateVersion.TemplateID.UUID,
1141-
TemplateVersionID: templateVersion.ID,
1142-
JobStatus: database.NullProvisionerJobStatus{},
1143-
Unarchive: !archive,
1144-
})
1138+
var err error
1139+
if archive {
1140+
archived, archiveError := api.Database.ArchiveUnusedTemplateVersions(ctx, database.ArchiveUnusedTemplateVersionsParams{
1141+
UpdatedAt: dbtime.Now(),
1142+
TemplateID: templateVersion.TemplateID.UUID,
1143+
TemplateVersionID: templateVersion.ID,
1144+
JobStatus: database.NullProvisionerJobStatus{},
1145+
})
1146+
1147+
if archiveError != nil {
1148+
err = archiveError
1149+
} else {
1150+
if len(archived) == 0 {
1151+
err = sql.ErrNoRows
1152+
}
1153+
}
1154+
} else {
1155+
err = api.Database.UnarchiveTemplateVersion(ctx, database.UnarchiveTemplateVersionParams{
1156+
UpdatedAt: dbtime.Now(),
1157+
TemplateVersionID: templateVersion.ID,
1158+
})
1159+
}
11451160

1146-
if httpapi.Is404Error(err) || (len(archived) == 0 && err == nil) {
1161+
if httpapi.Is404Error(err) {
11471162
httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{
11481163
Message: "Template or template versions not found.",
11491164
})

0 commit comments

Comments
 (0)