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

Commitd4202a5

Browse files
committed
feat(coderd): use task data model when fetching a task
1 parentc4c7558 commitd4202a5

File tree

2 files changed

+53
-74
lines changed

2 files changed

+53
-74
lines changed

‎coderd/aitasks.go‎

Lines changed: 28 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/coder/coder/v2/coderd/rbac/policy"
2626
"github.com/coder/coder/v2/coderd/searchquery"
2727
"github.com/coder/coder/v2/coderd/taskname"
28-
"github.com/coder/coder/v2/coderd/util/slice"
2928
"github.com/coder/coder/v2/codersdk"
3029

3130
aiagentapi"github.com/coder/agentapi-sdk-go"
@@ -602,25 +601,37 @@ func (api *API) tasksList(rw http.ResponseWriter, r *http.Request) {
602601
func (api*API)taskGet(rw http.ResponseWriter,r*http.Request) {
603602
ctx:=r.Context()
604603
apiKey:=httpmw.APIKey(r)
604+
task:=httpmw.TaskParam(r)
605605

606-
idStr:=chi.URLParam(r,"id")
607-
taskID,err:=uuid.Parse(idStr)
608-
iferr!=nil {
609-
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{
610-
Message:fmt.Sprintf("Invalid UUID %q for task ID.",idStr),
611-
})
606+
// If task doesn't have a workspace, return task data with template info.
607+
if!task.WorkspaceID.Valid {
608+
// TODO(mafredri): Update the view to include missing fields?
609+
taskResp:= codersdk.Task{
610+
ID:task.ID,
611+
OrganizationID:task.OrganizationID,
612+
OwnerID:task.OwnerID,
613+
// OwnerName: user.Username,
614+
Name:task.Name,
615+
// TemplateID: template.ID,
616+
TemplateVersionID:task.TemplateVersionID,
617+
// TemplateName: template.Name,
618+
// TemplateDisplayName: template.DisplayName,
619+
// TemplateIcon: template.Icon,
620+
InitialPrompt:task.Prompt,
621+
Status:codersdk.TaskStatus(task.Status),
622+
CreatedAt:task.CreatedAt,
623+
UpdatedAt:task.CreatedAt,
624+
}
625+
httpapi.Write(ctx,rw,http.StatusOK,taskResp)
612626
return
613627
}
614628

615-
// For now, taskID = workspaceID, once we have a task data model in
616-
// the DB, we can change this lookup.
617-
workspaceID:=taskID
618-
workspace,err:=api.Database.GetWorkspaceByID(ctx,workspaceID)
619-
ifhttpapi.Is404Error(err) {
620-
httpapi.ResourceNotFound(rw)
621-
return
622-
}
629+
workspace,err:=api.Database.GetWorkspaceByID(ctx,task.WorkspaceID.UUID)
623630
iferr!=nil {
631+
ifhttpapi.Is404Error(err) {
632+
httpapi.ResourceNotFound(rw)
633+
return
634+
}
624635
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
625636
Message:"Internal error fetching workspace.",
626637
Detail:err.Error(),
@@ -640,34 +651,6 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
640651
httpapi.ResourceNotFound(rw)
641652
return
642653
}
643-
ifdata.builds[0].HasAITask==nil||!*data.builds[0].HasAITask {
644-
// TODO(DanielleMaywood):
645-
// This is a temporary workaround. When a task has just been created, but
646-
// not yet provisioned, the workspace build will not have `HasAITask` set.
647-
//
648-
// When we reach this code flow, it is _either_ because the workspace is
649-
// not a task, or it is a task that has not yet been provisioned. This
650-
// endpoint should rarely be called with a non-task workspace so we
651-
// should be fine with this extra database call to check if it has the
652-
// special "AI Task" parameter.
653-
parameters,err:=api.Database.GetWorkspaceBuildParameters(ctx,data.builds[0].ID)
654-
iferr!=nil {
655-
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
656-
Message:"Internal error fetching workspace build parameters.",
657-
Detail:err.Error(),
658-
})
659-
return
660-
}
661-
662-
_,hasAITask:=slice.Find(parameters,func(t database.WorkspaceBuildParameter)bool {
663-
returnt.Name==codersdk.AITaskPromptParameterName
664-
})
665-
666-
if!hasAITask {
667-
httpapi.ResourceNotFound(rw)
668-
return
669-
}
670-
}
671654

672655
appStatus:= codersdk.WorkspaceAppStatus{}
673656
iflen(data.appStatuses)>0 {
@@ -690,16 +673,8 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
690673
return
691674
}
692675

693-
tasks,err:=api.tasksFromWorkspaces(ctx, []codersdk.Workspace{ws})
694-
iferr!=nil {
695-
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
696-
Message:"Internal error fetching task prompt and state.",
697-
Detail:err.Error(),
698-
})
699-
return
700-
}
701-
702-
httpapi.Write(ctx,rw,http.StatusOK,tasks[0])
676+
taskResp:=taskFromDBTaskAndWorkspace(task,ws)
677+
httpapi.Write(ctx,rw,http.StatusOK,taskResp)
703678
}
704679

705680
// @Summary Delete AI task by ID

‎coderd/aitasks_test.go‎

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -282,27 +282,32 @@ func TestTasks(t *testing.T) {
282282
ctx=testutil.Context(t,testutil.WaitLong)
283283
user=coderdtest.CreateFirstUser(t,client)
284284
template=createAITemplate(t,client,user)
285-
// Create a workspace (task) with a specific prompt.
286285
wantPrompt="review my code"
287-
workspace=coderdtest.CreateWorkspace(t,client,template.ID,func(req*codersdk.CreateWorkspaceRequest) {
288-
req.RichParameterValues= []codersdk.WorkspaceBuildParameter{
289-
{Name:codersdk.AITaskPromptParameterName,Value:wantPrompt},
290-
}
291-
})
286+
exp=codersdk.NewExperimentalClient(client)
292287
)
293288

294-
coderdtest.AwaitWorkspaceBuildJobCompleted(t,client,workspace.LatestBuild.ID)
295-
ws:=coderdtest.MustWorkspace(t,client,workspace.ID)
289+
task,err:=exp.CreateTask(ctx,"me", codersdk.CreateTaskRequest{
290+
TemplateVersionID:template.ActiveVersionID,
291+
Input:wantPrompt,
292+
})
293+
require.NoError(t,err)
294+
require.True(t,task.WorkspaceID.Valid)
295+
296+
// Get the workspace and wait for it to be ready.
297+
ws,err:=client.Workspace(ctx,task.WorkspaceID.UUID)
298+
require.NoError(t,err)
299+
coderdtest.AwaitWorkspaceBuildJobCompleted(t,client,ws.LatestBuild.ID)
300+
ws=coderdtest.MustWorkspace(t,client,task.WorkspaceID.UUID)
296301
// Assert invariant: the workspace has exactly one resource with one agent with one app.
297302
require.Len(t,ws.LatestBuild.Resources,1)
298303
require.Len(t,ws.LatestBuild.Resources[0].Agents,1)
299304
agentID:=ws.LatestBuild.Resources[0].Agents[0].ID
300305
taskAppID:=ws.LatestBuild.Resources[0].Agents[0].Apps[0].ID
301306

302307
// Insert an app status for the workspace
303-
_,err:=db.InsertWorkspaceAppStatus(dbauthz.AsSystemRestricted(ctx), database.InsertWorkspaceAppStatusParams{
308+
_,err=db.InsertWorkspaceAppStatus(dbauthz.AsSystemRestricted(ctx), database.InsertWorkspaceAppStatusParams{
304309
ID:uuid.New(),
305-
WorkspaceID:workspace.ID,
310+
WorkspaceID:task.WorkspaceID.UUID,
306311
CreatedAt:dbtime.Now(),
307312
AgentID:agentID,
308313
AppID:taskAppID,
@@ -312,31 +317,30 @@ func TestTasks(t *testing.T) {
312317
require.NoError(t,err)
313318

314319
// Fetch the task by ID via experimental API and verify fields.
315-
exp:=codersdk.NewExperimentalClient(client)
316-
task,err:=exp.TaskByID(ctx,workspace.ID)
320+
updated,err:=exp.TaskByID(ctx,task.ID)
317321
require.NoError(t,err)
318322

319-
assert.Equal(t,workspace.ID,task.ID,"task ID should match workspace ID")
320-
assert.Equal(t,workspace.Name,task.Name,"task name shouldmap from workspace name")
321-
assert.Equal(t,wantPrompt,task.InitialPrompt,"task prompt should match the AI Prompt parameter")
322-
assert.Equal(t,workspace.ID,task.WorkspaceID.UUID,"workspace id should match")
323-
assert.NotEmpty(t,task.WorkspaceStatus,"task status should not be empty")
323+
assert.Equal(t,task.ID,updated.ID,"task ID should match")
324+
assert.Equal(t,task.Name,updated.Name,"task name shouldmatch")
325+
assert.Equal(t,wantPrompt,updated.InitialPrompt,"task prompt should match the AI Prompt parameter")
326+
assert.Equal(t,task.WorkspaceID.UUID,updated.WorkspaceID.UUID,"workspace id should match")
327+
assert.NotEmpty(t,updated.WorkspaceStatus,"task status should not be empty")
324328

325329
// Stop the workspace
326-
coderdtest.MustTransitionWorkspace(t,client,workspace.ID,codersdk.WorkspaceTransitionStart,codersdk.WorkspaceTransitionStop)
330+
coderdtest.MustTransitionWorkspace(t,client,task.WorkspaceID.UUID,codersdk.WorkspaceTransitionStart,codersdk.WorkspaceTransitionStop)
327331

328332
// Verify that the previous status still remains
329-
updated,err:=exp.TaskByID(ctx,workspace.ID)
333+
updated,err=exp.TaskByID(ctx,task.ID)
330334
require.NoError(t,err)
331335
assert.NotNil(t,updated.CurrentState,"current state should not be nil")
332336
assert.Equal(t,"all done",updated.CurrentState.Message)
333337
assert.Equal(t,codersdk.TaskStateComplete,updated.CurrentState.State)
334338

335339
// Start the workspace again
336-
coderdtest.MustTransitionWorkspace(t,client,workspace.ID,codersdk.WorkspaceTransitionStop,codersdk.WorkspaceTransitionStart)
340+
coderdtest.MustTransitionWorkspace(t,client,task.WorkspaceID.UUID,codersdk.WorkspaceTransitionStop,codersdk.WorkspaceTransitionStart)
337341

338342
// Verify that the status from the previous build is no longer present
339-
updated,err=exp.TaskByID(ctx,workspace.ID)
343+
updated,err=exp.TaskByID(ctx,task.ID)
340344
require.NoError(t,err)
341345
assert.Nil(t,updated.CurrentState,"current state should be nil")
342346
})

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp