Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit96abc57

Browse files
committed
feat(coderd): use new data model for task delete
Updatescoder/internal#976
1 parentb7763a7 commit96abc57

File tree

12 files changed

+317
-62
lines changed

12 files changed

+317
-62
lines changed

‎coderd/aitasks.go‎

Lines changed: 44 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -715,78 +715,66 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
715715
// @Router /api/experimental/tasks/{user}/{id} [delete]
716716
//
717717
// EXPERIMENTAL: This endpoint is experimental and not guaranteed to be stable.
718-
// taskDelete is an experimental endpoint to delete a task by ID (workspace ID).
718+
// taskDelete is an experimental endpoint to delete a task by ID.
719719
// It creates a delete workspace build and returns 202 Accepted if the build was
720720
// created.
721721
func (api*API)taskDelete(rw http.ResponseWriter,r*http.Request) {
722722
ctx:=r.Context()
723723
apiKey:=httpmw.APIKey(r)
724+
task:=httpmw.TaskParam(r)
724725

725-
idStr:=chi.URLParam(r,"id")
726-
taskID,err:=uuid.Parse(idStr)
727-
iferr!=nil {
728-
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{
729-
Message:fmt.Sprintf("Invalid UUID %q for task ID.",idStr),
730-
})
731-
return
732-
}
726+
now:=api.Clock.Now()
733727

734-
// For now, taskID = workspaceID, once we have a task data model in
735-
// the DB, we can change this lookup.
736-
workspaceID:=taskID
737-
workspace,err:=api.Database.GetWorkspaceByID(ctx,workspaceID)
738-
ifhttpapi.Is404Error(err) {
739-
httpapi.ResourceNotFound(rw)
740-
return
741-
}
742-
iferr!=nil {
743-
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
744-
Message:"Internal error fetching workspace.",
745-
Detail:err.Error(),
746-
})
747-
return
728+
iftask.WorkspaceID.Valid {
729+
workspace,err:=api.Database.GetWorkspaceByID(ctx,task.WorkspaceID.UUID)
730+
iferr!=nil {
731+
ifhttpapi.Is404Error(err) {
732+
httpapi.ResourceNotFound(rw)
733+
return
734+
}
735+
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
736+
Message:"Internal error fetching workspace.",
737+
Detail:err.Error(),
738+
})
739+
return
740+
}
741+
742+
// Construct a request to the workspace build creation handler to
743+
// initiate deletion.
744+
buildReq:= codersdk.CreateWorkspaceBuildRequest{
745+
Transition:codersdk.WorkspaceTransitionDelete,
746+
Reason:"Deleted via tasks API",
747+
}
748+
749+
_,err=api.postWorkspaceBuildsInternal(
750+
ctx,
751+
apiKey,
752+
workspace,
753+
buildReq,
754+
func(action policy.Action,object rbac.Objecter)bool {
755+
returnapi.Authorize(r,action,object)
756+
},
757+
audit.WorkspaceBuildBaggageFromRequest(r),
758+
)
759+
iferr!=nil {
760+
httperror.WriteWorkspaceBuildError(ctx,rw,err)
761+
return
762+
}
748763
}
749764

750-
data,err:=api.workspaceData(ctx, []database.Workspace{workspace})
765+
_,err:=api.Database.DeleteTask(ctx, database.DeleteTaskParams{
766+
ID:task.ID,
767+
DeletedAt:dbtime.Time(now),
768+
})
751769
iferr!=nil {
752770
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
753-
Message:"Internal error fetching workspace resources.",
771+
Message:"Failed to delete task",
754772
Detail:err.Error(),
755773
})
756774
return
757775
}
758-
iflen(data.builds)==0||len(data.templates)==0 {
759-
httpapi.ResourceNotFound(rw)
760-
return
761-
}
762-
ifdata.builds[0].HasAITask==nil||!*data.builds[0].HasAITask {
763-
httpapi.ResourceNotFound(rw)
764-
return
765-
}
766-
767-
// Construct a request to the workspace build creation handler to
768-
// initiate deletion.
769-
buildReq:= codersdk.CreateWorkspaceBuildRequest{
770-
Transition:codersdk.WorkspaceTransitionDelete,
771-
Reason:"Deleted via tasks API",
772-
}
773-
774-
_,err=api.postWorkspaceBuildsInternal(
775-
ctx,
776-
apiKey,
777-
workspace,
778-
buildReq,
779-
func(action policy.Action,object rbac.Objecter)bool {
780-
returnapi.Authorize(r,action,object)
781-
},
782-
audit.WorkspaceBuildBaggageFromRequest(r),
783-
)
784-
iferr!=nil {
785-
httperror.WriteWorkspaceBuildError(ctx,rw,err)
786-
return
787-
}
788776

789-
//Delete build created successfully.
777+
//Task deleted and delete build created successfully.
790778
rw.WriteHeader(http.StatusAccepted)
791779
}
792780

‎coderd/aitasks_test.go‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,8 +344,6 @@ func TestTasks(t *testing.T) {
344344
t.Run("Delete",func(t*testing.T) {
345345
t.Parallel()
346346

347-
t.Skip("TODO(mafredri): Remove, fixed down-stack!")
348-
349347
t.Run("OK",func(t*testing.T) {
350348
t.Parallel()
351349

‎coderd/coderd.go‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,11 +1022,15 @@ func New(options *Options) *API {
10221022

10231023
r.Route("/{user}",func(r chi.Router) {
10241024
r.Use(httpmw.ExtractOrganizationMembersParam(options.Database,api.HTTPAuth.Authorize))
1025-
r.Get("/{id}",api.taskGet)
1026-
r.Delete("/{id}",api.taskDelete)
1027-
r.Post("/{id}/send",api.taskSend)
1028-
r.Get("/{id}/logs",api.taskLogs)
10291025
r.Post("/",api.tasksCreate)
1026+
1027+
r.Route("/{id}",func(r chi.Router) {
1028+
r.Use(httpmw.ExtractTaskParam(options.Database))
1029+
r.Get("/",api.taskGet)
1030+
r.Delete("/",api.taskDelete)
1031+
r.Post("/send",api.taskSend)
1032+
r.Get("/logs",api.taskLogs)
1033+
})
10301034
})
10311035
})
10321036
r.Route("/mcp",func(r chi.Router) {

‎coderd/database/dbauthz/dbauthz.go‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,6 +1756,19 @@ func (q *querier) DeleteTailnetTunnel(ctx context.Context, arg database.DeleteTa
17561756
returnq.db.DeleteTailnetTunnel(ctx,arg)
17571757
}
17581758

1759+
func (q*querier)DeleteTask(ctx context.Context,arg database.DeleteTaskParams) (database.TaskTable,error) {
1760+
task,err:=q.db.GetTaskByID(ctx,arg.ID)
1761+
iferr!=nil {
1762+
return database.TaskTable{},err
1763+
}
1764+
1765+
iferr:=q.authorizeContext(ctx,policy.ActionDelete,task.RBACObject());err!=nil {
1766+
return database.TaskTable{},err
1767+
}
1768+
1769+
returnq.db.DeleteTask(ctx,arg)
1770+
}
1771+
17591772
func (q*querier)DeleteUserSecret(ctx context.Context,id uuid.UUID)error {
17601773
// First get the secret to check ownership
17611774
secret,err:=q.GetUserSecret(ctx,id)

‎coderd/database/dbauthz/dbauthz_test.go‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,6 +2362,16 @@ func (s *MethodTestSuite) TestTasks() {
23622362
dbm.EXPECT().GetTaskByID(gomock.Any(),task.ID).Return(task,nil).AnyTimes()
23632363
check.Args(task.ID).Asserts(task,policy.ActionRead).Returns(task)
23642364
}))
2365+
s.Run("DeleteTask",s.Mocked(func(dbm*dbmock.MockStore,faker*gofakeit.Faker,check*expects) {
2366+
task:=testutil.Fake(s.T(),faker, database.Task{})
2367+
arg:= database.DeleteTaskParams{
2368+
ID:task.ID,
2369+
DeletedAt:dbtime.Now(),
2370+
}
2371+
dbm.EXPECT().GetTaskByID(gomock.Any(),task.ID).Return(task,nil).AnyTimes()
2372+
dbm.EXPECT().DeleteTask(gomock.Any(),arg).Return(database.TaskTable{},nil).AnyTimes()
2373+
check.Args(arg).Asserts(task,policy.ActionDelete).Returns(database.TaskTable{})
2374+
}))
23652375
s.Run("InsertTask",s.Mocked(func(dbm*dbmock.MockStore,faker*gofakeit.Faker,check*expects) {
23662376
tpl:=testutil.Fake(s.T(),faker, database.Template{})
23672377
tv:=testutil.Fake(s.T(),faker, database.TemplateVersion{

‎coderd/database/dbmetrics/querymetrics.go‎

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

‎coderd/database/queries.sql.go‎

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

‎coderd/database/queries/tasks.sql‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,12 @@ WHERE tws.deleted_at IS NULL
4747
AND CASE WHEN @owner_id::UUID!='00000000-0000-0000-0000-000000000000' THENtws.owner_id= @owner_id::UUID ELSE TRUE END
4848
AND CASE WHEN @organization_id::UUID!='00000000-0000-0000-0000-000000000000' THENtws.organization_id= @organization_id::UUID ELSE TRUE END
4949
ORDER BYtws.created_atDESC;
50+
51+
-- name: DeleteTask :one
52+
UPDATE tasks
53+
SET
54+
deleted_at= @deleted_at::timestamptz
55+
WHERE
56+
id= @id::uuid
57+
AND deleted_at ISNULL
58+
RETURNING*;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp