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

Commit9855460

Browse files
authored
feat(coderd): use new data model for task delete (#20334)
Updatescoder/internal#976
1 parent79728c3 commit9855460

File tree

16 files changed

+354
-101
lines changed

16 files changed

+354
-101
lines changed

‎cli/exp_task_delete_test.go‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import (
2222
funcTestExpTaskDelete(t*testing.T) {
2323
t.Parallel()
2424

25-
t.Skip("TODO(mafredri): Remove, fixed down-stack!")
26-
2725
typetestCountersstruct {
2826
deleteCalls atomic.Int64
2927
nameResolves atomic.Int64

‎coderd/aitasks.go‎

Lines changed: 55 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -593,9 +593,9 @@ func (api *API) tasksList(rw http.ResponseWriter, r *http.Request) {
593593
// @Security CoderSessionToken
594594
// @Tags Experimental
595595
// @Param user path string true "Username, user ID, or 'me' for the authenticated user"
596-
// @Paramid path string true "Task ID" format(uuid)
596+
// @Paramtask path string true "Task ID" format(uuid)
597597
// @Success 200 {object} codersdk.Task
598-
// @Router /api/experimental/tasks/{user}/{id} [get]
598+
// @Router /api/experimental/tasks/{user}/{task} [get]
599599
//
600600
// EXPERIMENTAL: This endpoint is experimental and not guaranteed to be stable.
601601
// taskGet is an experimental endpoint to fetch a single AI task by ID
@@ -605,7 +605,7 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
605605
ctx:=r.Context()
606606
apiKey:=httpmw.APIKey(r)
607607

608-
idStr:=chi.URLParam(r,"id")
608+
idStr:=chi.URLParam(r,"task")
609609
taskID,err:=uuid.Parse(idStr)
610610
iferr!=nil {
611611
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{
@@ -710,83 +710,71 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
710710
// @Security CoderSessionToken
711711
// @Tags Experimental
712712
// @Param user path string true "Username, user ID, or 'me' for the authenticated user"
713-
// @Paramid path string true "Task ID" format(uuid)
713+
// @Paramtask path string true "Task ID" format(uuid)
714714
// @Success 202 "Task deletion initiated"
715-
// @Router /api/experimental/tasks/{user}/{id} [delete]
715+
// @Router /api/experimental/tasks/{user}/{task} [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 task workspace before deleting task.",
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

@@ -796,10 +784,10 @@ func (api *API) taskDelete(rw http.ResponseWriter, r *http.Request) {
796784
// @Security CoderSessionToken
797785
// @Tags Experimental
798786
// @Param user path string true "Username, user ID, or 'me' for the authenticated user"
799-
// @Paramid path string true "Task ID" format(uuid)
787+
// @Paramtask path string true "Task ID" format(uuid)
800788
// @Param request body codersdk.TaskSendRequest true "Task input request"
801789
// @Success 204 "Input sent successfully"
802-
// @Router /api/experimental/tasks/{user}/{id}/send [post]
790+
// @Router /api/experimental/tasks/{user}/{task}/send [post]
803791
//
804792
// EXPERIMENTAL: This endpoint is experimental and not guaranteed to be stable.
805793
// taskSend submits task input to the tasks sidebar app by dialing the agent
@@ -808,7 +796,7 @@ func (api *API) taskDelete(rw http.ResponseWriter, r *http.Request) {
808796
func (api*API)taskSend(rw http.ResponseWriter,r*http.Request) {
809797
ctx:=r.Context()
810798

811-
idStr:=chi.URLParam(r,"id")
799+
idStr:=chi.URLParam(r,"task")
812800
taskID,err:=uuid.Parse(idStr)
813801
iferr!=nil {
814802
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{
@@ -878,17 +866,17 @@ func (api *API) taskSend(rw http.ResponseWriter, r *http.Request) {
878866
// @Security CoderSessionToken
879867
// @Tags Experimental
880868
// @Param user path string true "Username, user ID, or 'me' for the authenticated user"
881-
// @Paramid path string true "Task ID" format(uuid)
869+
// @Paramtask path string true "Task ID" format(uuid)
882870
// @Success 200 {object} codersdk.TaskLogsResponse
883-
// @Router /api/experimental/tasks/{user}/{id}/logs [get]
871+
// @Router /api/experimental/tasks/{user}/{task}/logs [get]
884872
//
885873
// EXPERIMENTAL: This endpoint is experimental and not guaranteed to be stable.
886874
// taskLogs reads task output by dialing the agent directly over the tailnet.
887875
// We enforce ApplicationConnect RBAC on the workspace and validate the sidebar app health.
888876
func (api*API)taskLogs(rw http.ResponseWriter,r*http.Request) {
889877
ctx:=r.Context()
890878

891-
idStr:=chi.URLParam(r,"id")
879+
idStr:=chi.URLParam(r,"task")
892880
taskID,err:=uuid.Parse(idStr)
893881
iferr!=nil {
894882
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{

‎coderd/aitasks_test.go‎

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

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

‎coderd/apidoc/docs.go‎

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

‎coderd/apidoc/swagger.json‎

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

‎coderd/coderd.go‎

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

10331033
r.Route("/{user}",func(r chi.Router) {
10341034
r.Use(httpmw.ExtractOrganizationMembersParam(options.Database,api.HTTPAuth.Authorize))
1035-
r.Get("/{id}",api.taskGet)
1036-
r.Delete("/{id}",api.taskDelete)
1037-
r.Post("/{id}/send",api.taskSend)
1038-
r.Get("/{id}/logs",api.taskLogs)
10391035
r.Post("/",api.tasksCreate)
1036+
1037+
r.Route("/{task}",func(r chi.Router) {
1038+
r.Use(httpmw.ExtractTaskParam(options.Database))
1039+
r.Get("/",api.taskGet)
1040+
r.Delete("/",api.taskDelete)
1041+
r.Post("/send",api.taskSend)
1042+
r.Get("/logs",api.taskLogs)
1043+
})
10401044
})
10411045
})
10421046
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
@@ -1798,6 +1798,19 @@ func (q *querier) DeleteTailnetTunnel(ctx context.Context, arg database.DeleteTa
17981798
returnq.db.DeleteTailnetTunnel(ctx,arg)
17991799
}
18001800

1801+
func (q*querier)DeleteTask(ctx context.Context,arg database.DeleteTaskParams) (database.TaskTable,error) {
1802+
task,err:=q.db.GetTaskByID(ctx,arg.ID)
1803+
iferr!=nil {
1804+
return database.TaskTable{},err
1805+
}
1806+
1807+
iferr:=q.authorizeContext(ctx,policy.ActionDelete,task.RBACObject());err!=nil {
1808+
return database.TaskTable{},err
1809+
}
1810+
1811+
returnq.db.DeleteTask(ctx,arg)
1812+
}
1813+
18011814
func (q*querier)DeleteUserSecret(ctx context.Context,id uuid.UUID)error {
18021815
// First get the secret to check ownership
18031816
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{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp