Skip to content

Commit 75277dc

Browse files
committed
feat: allow optional display_name in task creation request
1 parent ac0a1f9 commit 75277dc

8 files changed

Lines changed: 83 additions & 13 deletions

File tree

‎coderd/aitasks.go‎

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ import (
77
"net/http"
88
"net/url"
99
"slices"
10+
"strings"
1011
"time"
1112

1213
"github.com/google/uuid"
1314
"golang.org/x/xerrors"
1415

16+
"github.com/coder/coder/v2/coderd/taskname"
17+
1518
aiagentapi "github.com/coder/agentapi-sdk-go"
1619
"github.com/coder/coder/v2/coderd/audit"
1720
"github.com/coder/coder/v2/coderd/database"
@@ -22,7 +25,6 @@ import (
2225
"github.com/coder/coder/v2/coderd/rbac"
2326
"github.com/coder/coder/v2/coderd/rbac/policy"
2427
"github.com/coder/coder/v2/coderd/searchquery"
25-
"github.com/coder/coder/v2/coderd/taskname"
2628
"github.com/coder/coder/v2/coderd/util/ptr"
2729
"github.com/coder/coder/v2/coderd/util/slice"
2830
strutil "github.com/coder/coder/v2/coderd/util/strings"
@@ -108,11 +110,26 @@ func (api *API) tasksCreate(rw http.ResponseWriter, r *http.Request) {
108110
}
109111
}
110112

111-
displayName := ""
112-
if taskName == "" {
113+
taskDisplayName := strings.TrimSpace(req.DisplayName)
114+
if taskDisplayName != "" {
115+
if len(taskDisplayName) > 64 {
116+
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
117+
Message: "Display name must be 64 characters or less.",
118+
})
119+
return
120+
}
121+
}
122+
123+
// Generate task name and display name if either is not provided
124+
if taskName == "" || taskDisplayName == "" {
113125
generatedTaskName := taskname.Generate(ctx, req.Input)
114-
taskName = generatedTaskName.Name
115-
displayName = generatedTaskName.DisplayName
126+
127+
if taskName == "" {
128+
taskName = generatedTaskName.Name
129+
}
130+
if taskDisplayName == "" {
131+
taskDisplayName = generatedTaskName.DisplayName
132+
}
116133
}
117134

118135
// Check if the template defines the AI Prompt parameter.
@@ -204,7 +221,7 @@ func (api *API) tasksCreate(rw http.ResponseWriter, r *http.Request) {
204221
OrganizationID: templateVersion.OrganizationID,
205222
OwnerID: owner.ID,
206223
Name: taskName,
207-
DisplayName: displayName,
224+
DisplayName: taskDisplayName,
208225
WorkspaceID: uuid.NullUUID{}, // Will be set after workspace creation.
209226
TemplateVersionID: templateVersion.ID,
210227
TemplateParameters: []byte("{}"),

‎coderd/aitasks_test.go‎

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -844,14 +844,17 @@ func TestTasksCreate(t *testing.T) {
844844
t.Parallel()
845845

846846
tests := []struct {
847-
name string
848-
taskName string
849-
expectFallbackName bool
850-
expectError string
847+
name string
848+
taskName string
849+
taskDisplayName string
850+
expectFallbackName bool
851+
expectFallbackDisplayName bool
852+
expectError string
851853
}{
852854
{
853-
name: "ValidName",
854-
taskName: "a-valid-task-name",
855+
name: "ValidName",
856+
taskName: "a-valid-task-name",
857+
expectFallbackDisplayName: true,
855858
},
856859
{
857860
name: "NotValidName",
@@ -861,8 +864,37 @@ func TestTasksCreate(t *testing.T) {
861864
{
862865
name: "NoNameProvided",
863866
taskName: "",
867+
taskDisplayName: "A valid task display name",
864868
expectFallbackName: true,
865869
},
870+
{
871+
name: "ValidDisplayName",
872+
taskDisplayName: "A valid task display name",
873+
expectFallbackName: true,
874+
},
875+
{
876+
name: "NotValidDisplayName",
877+
taskDisplayName: "This is a task display name with a length greater than 64 characters.",
878+
expectError: "Display name must be 64 characters or less.",
879+
},
880+
{
881+
name: "NoDisplayNameProvided",
882+
taskName: "a-valid-task-name",
883+
taskDisplayName: "",
884+
expectFallbackDisplayName: true,
885+
},
886+
{
887+
name: "ValidNameAndDisplayName",
888+
taskName: "a-valid-task-name",
889+
taskDisplayName: "A valid task display name",
890+
},
891+
{
892+
name: "NoNameAndDisplayNameProvided",
893+
taskName: "",
894+
taskDisplayName: "",
895+
expectFallbackName: true,
896+
expectFallbackDisplayName: true,
897+
},
866898
}
867899

868900
for _, tt := range tests {
@@ -893,6 +925,7 @@ func TestTasksCreate(t *testing.T) {
893925
TemplateVersionID: template.ActiveVersionID,
894926
Input: "Some prompt",
895927
Name: tt.taskName,
928+
DisplayName: tt.taskDisplayName,
896929
})
897930
if tt.expectError == "" {
898931
require.NoError(t, err)
@@ -906,8 +939,17 @@ func TestTasksCreate(t *testing.T) {
906939
if !tt.expectFallbackName {
907940
require.Equal(t, tt.taskName, task.Name)
908941
}
942+
943+
// Then: We expect the correct display name to have been picked.
944+
require.NotEmpty(t, task.DisplayName)
945+
if !tt.expectFallbackDisplayName {
946+
require.Equal(t, tt.taskDisplayName, task.DisplayName)
947+
}
909948
} else {
910-
require.ErrorContains(t, err, tt.expectError)
949+
var apiErr *codersdk.Error
950+
require.ErrorAs(t, err, &apiErr)
951+
require.Equal(t, http.StatusBadRequest, apiErr.StatusCode())
952+
require.Equal(t, apiErr.Message, tt.expectError)
911953
}
912954
})
913955
}

‎coderd/apidoc/docs.go‎

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

‎coderd/apidoc/swagger.json‎

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

‎codersdk/aitasks.go‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type CreateTaskRequest struct {
3535
TemplateVersionPresetID uuid.UUID `json:"template_version_preset_id,omitempty" format:"uuid"`
3636
Input string `json:"input"`
3737
Name string `json:"name,omitempty"`
38+
DisplayName string `json:"display_name,omitempty"`
3839
}
3940

4041
// CreateTask creates a new task.

‎docs/reference/api/experimental.md‎

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎docs/reference/api/schemas.md‎

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

‎site/src/api/typesGenerated.ts‎

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)