From 367561e35655dd75beec105c68a867d7689808de Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 11 Jun 2024 20:41:22 +0000 Subject: [PATCH 1/3] feat: allow editing org icon --- coderd/apidoc/docs.go | 9 ++++++ coderd/apidoc/swagger.json | 9 ++++++ coderd/database/dbmem/dbmem.go | 3 ++ coderd/database/dump.sql | 3 +- .../000219_organization_icon.down.sql | 2 ++ .../000219_organization_icon.up.sql | 2 ++ coderd/database/models.go | 1 + coderd/database/queries.sql.go | 32 +++++++++++++------ coderd/database/queries/organizations.sql | 7 ++-- coderd/organizations.go | 6 ++++ coderd/organizations_test.go | 24 ++++++++++++++ codersdk/organizations.go | 3 ++ docs/api/organizations.md | 5 +++ docs/api/schemas.md | 6 ++++ docs/api/users.md | 3 ++ site/src/api/typesGenerated.ts | 3 ++ 16 files changed, 104 insertions(+), 14 deletions(-) create mode 100644 coderd/database/migrations/000219_organization_icon.down.sql create mode 100644 coderd/database/migrations/000219_organization_icon.up.sql diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 81c16ba784798..70988aa071afb 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -8376,6 +8376,9 @@ const docTemplate = `{ "description": "DisplayName will default to the same value as ` + "`" + `Name` + "`" + ` if not provided.", "type": "string" }, + "icon": { + "type": "string" + }, "name": { "type": "string" } @@ -10007,6 +10010,9 @@ const docTemplate = `{ "display_name": { "type": "string" }, + "icon": { + "type": "string" + }, "id": { "type": "string", "format": "uuid" @@ -11724,6 +11730,9 @@ const docTemplate = `{ "display_name": { "type": "string" }, + "icon": { + "type": "string" + }, "name": { "type": "string" } diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 7859bcb5ded02..32dd1565a5a28 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -7456,6 +7456,9 @@ "description": "DisplayName will default to the same value as `Name` if not provided.", "type": "string" }, + "icon": { + "type": "string" + }, "name": { "type": "string" } @@ -8996,6 +8999,9 @@ "display_name": { "type": "string" }, + "icon": { + "type": "string" + }, "id": { "type": "string", "format": "uuid" @@ -10628,6 +10634,9 @@ "display_name": { "type": "string" }, + "icon": { + "type": "string" + }, "name": { "type": "string" } diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 55251f71227ca..d1e80305db109 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -88,6 +88,7 @@ func New() database.Store { Name: "first-organization", DisplayName: "first-organization", Description: "Builtin default organization.", + Icon: "", CreatedAt: dbtime.Now(), UpdatedAt: dbtime.Now(), }) @@ -6189,6 +6190,7 @@ func (q *FakeQuerier) InsertOrganization(_ context.Context, arg database.InsertO Name: arg.Name, DisplayName: arg.DisplayName, Description: arg.Description, + Icon: arg.Icon, CreatedAt: arg.CreatedAt, UpdatedAt: arg.UpdatedAt, IsDefault: len(q.organizations) == 0, @@ -7334,6 +7336,7 @@ func (q *FakeQuerier) UpdateOrganization(_ context.Context, arg database.UpdateO org.Name = arg.Name org.DisplayName = arg.DisplayName org.Description = arg.Description + org.Icon = arg.Icon q.organizations[i] = org return org, nil } diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 83eea6e3583a6..ca063f4b08eb1 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -595,7 +595,8 @@ CREATE TABLE organizations ( created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, is_default boolean DEFAULT false NOT NULL, - display_name text NOT NULL + display_name text NOT NULL, + icon text DEFAULT ''::text NOT NULL ); CREATE TABLE parameter_schemas ( diff --git a/coderd/database/migrations/000219_organization_icon.down.sql b/coderd/database/migrations/000219_organization_icon.down.sql new file mode 100644 index 0000000000000..99b32ec8dab41 --- /dev/null +++ b/coderd/database/migrations/000219_organization_icon.down.sql @@ -0,0 +1,2 @@ +alter table organizations + drop column icon; diff --git a/coderd/database/migrations/000219_organization_icon.up.sql b/coderd/database/migrations/000219_organization_icon.up.sql new file mode 100644 index 0000000000000..6690301a3b549 --- /dev/null +++ b/coderd/database/migrations/000219_organization_icon.up.sql @@ -0,0 +1,2 @@ +alter table organizations + add column icon text not null default ''; diff --git a/coderd/database/models.go b/coderd/database/models.go index 8a558f5beeb0b..963587875b372 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -1933,6 +1933,7 @@ type Organization struct { UpdatedAt time.Time `db:"updated_at" json:"updated_at"` IsDefault bool `db:"is_default" json:"is_default"` DisplayName string `db:"display_name" json:"display_name"` + Icon string `db:"icon" json:"icon"` } type OrganizationMember struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 823cf2cc45796..4866bedfb8ebb 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -3949,7 +3949,7 @@ func (q *sqlQuerier) DeleteOrganization(ctx context.Context, id uuid.UUID) error const getDefaultOrganization = `-- name: GetDefaultOrganization :one SELECT - id, name, description, created_at, updated_at, is_default, display_name + id, name, description, created_at, updated_at, is_default, display_name, icon FROM organizations WHERE @@ -3969,13 +3969,14 @@ func (q *sqlQuerier) GetDefaultOrganization(ctx context.Context) (Organization, &i.UpdatedAt, &i.IsDefault, &i.DisplayName, + &i.Icon, ) return i, err } const getOrganizationByID = `-- name: GetOrganizationByID :one SELECT - id, name, description, created_at, updated_at, is_default, display_name + id, name, description, created_at, updated_at, is_default, display_name, icon FROM organizations WHERE @@ -3993,13 +3994,14 @@ func (q *sqlQuerier) GetOrganizationByID(ctx context.Context, id uuid.UUID) (Org &i.UpdatedAt, &i.IsDefault, &i.DisplayName, + &i.Icon, ) return i, err } const getOrganizationByName = `-- name: GetOrganizationByName :one SELECT - id, name, description, created_at, updated_at, is_default, display_name + id, name, description, created_at, updated_at, is_default, display_name, icon FROM organizations WHERE @@ -4019,13 +4021,14 @@ func (q *sqlQuerier) GetOrganizationByName(ctx context.Context, name string) (Or &i.UpdatedAt, &i.IsDefault, &i.DisplayName, + &i.Icon, ) return i, err } const getOrganizations = `-- name: GetOrganizations :many SELECT - id, name, description, created_at, updated_at, is_default, display_name + id, name, description, created_at, updated_at, is_default, display_name, icon FROM organizations ` @@ -4047,6 +4050,7 @@ func (q *sqlQuerier) GetOrganizations(ctx context.Context) ([]Organization, erro &i.UpdatedAt, &i.IsDefault, &i.DisplayName, + &i.Icon, ); err != nil { return nil, err } @@ -4063,7 +4067,7 @@ func (q *sqlQuerier) GetOrganizations(ctx context.Context) ([]Organization, erro const getOrganizationsByUserID = `-- name: GetOrganizationsByUserID :many SELECT - id, name, description, created_at, updated_at, is_default, display_name + id, name, description, created_at, updated_at, is_default, display_name, icon FROM organizations WHERE @@ -4094,6 +4098,7 @@ func (q *sqlQuerier) GetOrganizationsByUserID(ctx context.Context, userID uuid.U &i.UpdatedAt, &i.IsDefault, &i.DisplayName, + &i.Icon, ); err != nil { return nil, err } @@ -4110,10 +4115,10 @@ func (q *sqlQuerier) GetOrganizationsByUserID(ctx context.Context, userID uuid.U const insertOrganization = `-- name: InsertOrganization :one INSERT INTO - organizations (id, "name", display_name, description, created_at, updated_at, is_default) + organizations (id, "name", display_name, description, icon, created_at, updated_at, is_default) VALUES -- If no organizations exist, and this is the first, make it the default. - ($1, $2, $3, $4, $5, $6, (SELECT TRUE FROM organizations LIMIT 1) IS NULL) RETURNING id, name, description, created_at, updated_at, is_default, display_name + ($1, $2, $3, $4, $5, $6, $7, (SELECT TRUE FROM organizations LIMIT 1) IS NULL) RETURNING id, name, description, created_at, updated_at, is_default, display_name, icon ` type InsertOrganizationParams struct { @@ -4121,6 +4126,7 @@ type InsertOrganizationParams struct { Name string `db:"name" json:"name"` DisplayName string `db:"display_name" json:"display_name"` Description string `db:"description" json:"description"` + Icon string `db:"icon" json:"icon"` CreatedAt time.Time `db:"created_at" json:"created_at"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` } @@ -4131,6 +4137,7 @@ func (q *sqlQuerier) InsertOrganization(ctx context.Context, arg InsertOrganizat arg.Name, arg.DisplayName, arg.Description, + arg.Icon, arg.CreatedAt, arg.UpdatedAt, ) @@ -4143,6 +4150,7 @@ func (q *sqlQuerier) InsertOrganization(ctx context.Context, arg InsertOrganizat &i.UpdatedAt, &i.IsDefault, &i.DisplayName, + &i.Icon, ) return i, err } @@ -4154,10 +4162,11 @@ SET updated_at = $1, name = $2, display_name = $3, - description = $4 + description = $4, + icon = $5 WHERE - id = $5 -RETURNING id, name, description, created_at, updated_at, is_default, display_name + id = $6 +RETURNING id, name, description, created_at, updated_at, is_default, display_name, icon ` type UpdateOrganizationParams struct { @@ -4165,6 +4174,7 @@ type UpdateOrganizationParams struct { Name string `db:"name" json:"name"` DisplayName string `db:"display_name" json:"display_name"` Description string `db:"description" json:"description"` + Icon string `db:"icon" json:"icon"` ID uuid.UUID `db:"id" json:"id"` } @@ -4174,6 +4184,7 @@ func (q *sqlQuerier) UpdateOrganization(ctx context.Context, arg UpdateOrganizat arg.Name, arg.DisplayName, arg.Description, + arg.Icon, arg.ID, ) var i Organization @@ -4185,6 +4196,7 @@ func (q *sqlQuerier) UpdateOrganization(ctx context.Context, arg UpdateOrganizat &i.UpdatedAt, &i.IsDefault, &i.DisplayName, + &i.Icon, ) return i, err } diff --git a/coderd/database/queries/organizations.sql b/coderd/database/queries/organizations.sql index dbefb9f8ad711..787985c3bdbbc 100644 --- a/coderd/database/queries/organizations.sql +++ b/coderd/database/queries/organizations.sql @@ -49,10 +49,10 @@ WHERE -- name: InsertOrganization :one INSERT INTO - organizations (id, "name", display_name, description, created_at, updated_at, is_default) + organizations (id, "name", display_name, description, icon, created_at, updated_at, is_default) VALUES -- If no organizations exist, and this is the first, make it the default. - (@id, @name, @display_name, @description, @created_at, @updated_at, (SELECT TRUE FROM organizations LIMIT 1) IS NULL) RETURNING *; + (@id, @name, @display_name, @description, @icon, @created_at, @updated_at, (SELECT TRUE FROM organizations LIMIT 1) IS NULL) RETURNING *; -- name: UpdateOrganization :one UPDATE @@ -61,7 +61,8 @@ SET updated_at = @updated_at, name = @name, display_name = @display_name, - description = @description + description = @description, + icon = @icon WHERE id = @id RETURNING *; diff --git a/coderd/organizations.go b/coderd/organizations.go index 259fb6486dfd8..093b52d6559cd 100644 --- a/coderd/organizations.go +++ b/coderd/organizations.go @@ -83,6 +83,7 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { Name: req.Name, DisplayName: req.DisplayName, Description: req.Description, + Icon: req.Icon, CreatedAt: dbtime.Now(), UpdatedAt: dbtime.Now(), }) @@ -164,6 +165,7 @@ func (api *API) patchOrganization(rw http.ResponseWriter, r *http.Request) { Name: organization.Name, DisplayName: organization.DisplayName, Description: organization.Description, + Icon: organization.Icon, } if req.Name != "" { @@ -175,6 +177,9 @@ func (api *API) patchOrganization(rw http.ResponseWriter, r *http.Request) { if req.Description != "" { updateOrgParams.Description = req.Description } + if req.Icon != "" { + updateOrgParams.Icon = req.Icon + } organization, err = tx.UpdateOrganization(ctx, updateOrgParams) if err != nil { @@ -248,6 +253,7 @@ func convertOrganization(organization database.Organization) codersdk.Organizati Name: organization.Name, DisplayName: organization.DisplayName, Description: organization.Description, + Icon: organization.Icon, CreatedAt: organization.CreatedAt, UpdatedAt: organization.UpdatedAt, IsDefault: organization.IsDefault, diff --git a/coderd/organizations_test.go b/coderd/organizations_test.go index 20fb7243faa5b..4899c9f73b48d 100644 --- a/coderd/organizations_test.go +++ b/coderd/organizations_test.go @@ -142,11 +142,13 @@ func TestPostOrganizationsByUser(t *testing.T) { Name: "new", DisplayName: "New", Description: "A new organization to love and cherish forever.", + Icon: "/emojis/1f48f-1f3ff.png", }) require.NoError(t, err) require.Equal(t, "new", o.Name) require.Equal(t, "New", o.DisplayName) require.Equal(t, "A new organization to love and cherish forever.", o.Description) + require.Equal(t, "/emojis/1f48f-1f3ff.png", o.Icon) }) t.Run("CreateWithoutExplicitDisplayName", func(t *testing.T) { @@ -308,6 +310,28 @@ func TestPatchOrganizationsByUser(t *testing.T) { require.Equal(t, "New", o.DisplayName) // didn't change require.Equal(t, "wow, this organization description is so updated!", o.Description) }) + + t.Run("UpdateIcon", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + _ = coderdtest.CreateFirstUser(t, client) + ctx := testutil.Context(t, testutil.WaitMedium) + + o, err := client.CreateOrganization(ctx, codersdk.CreateOrganizationRequest{ + Name: "new", + DisplayName: "New", + }) + require.NoError(t, err) + + o, err = client.UpdateOrganization(ctx, o.Name, codersdk.UpdateOrganizationRequest{ + Icon: "/emojis/1f48f-1f3ff.png", + }) + + require.NoError(t, err) + require.Equal(t, "new", o.Name) // didn't change + require.Equal(t, "New", o.DisplayName) // didn't change + require.Equal(t, "/emojis/1f48f-1f3ff.png", o.Icon) + }) } func TestDeleteOrganizationsByUser(t *testing.T) { diff --git a/codersdk/organizations.go b/codersdk/organizations.go index b9ff98d1a3917..1e0893bd857ea 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -47,6 +47,7 @@ type Organization struct { CreatedAt time.Time `table:"created_at" json:"created_at" validate:"required" format:"date-time"` UpdatedAt time.Time `table:"updated_at" json:"updated_at" validate:"required" format:"date-time"` IsDefault bool `table:"default" json:"is_default" validate:"required"` + Icon string `table:"icon" json:"icon"` } type OrganizationMember struct { @@ -62,12 +63,14 @@ type CreateOrganizationRequest struct { // DisplayName will default to the same value as `Name` if not provided. DisplayName string `json:"display_name" validate:"omitempty,organization_display_name"` Description string `json:"description,omitempty"` + Icon string `json:"icon,omitempty"` } type UpdateOrganizationRequest struct { Name string `json:"name,omitempty" validate:"omitempty,organization_name"` DisplayName string `json:"display_name,omitempty" validate:"omitempty,organization_display_name"` Description string `json:"description,omitempty"` + Icon string `json:"icon,omitempty"` } // CreateTemplateVersionRequest enables callers to create a new Template Version. diff --git a/docs/api/organizations.md b/docs/api/organizations.md index 820d4be64d281..a1f8273549f80 100644 --- a/docs/api/organizations.md +++ b/docs/api/organizations.md @@ -107,6 +107,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations \ { "description": "string", "display_name": "string", + "icon": "string", "name": "string" } ``` @@ -126,6 +127,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations \ "created_at": "2019-08-24T14:15:22Z", "description": "string", "display_name": "string", + "icon": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "is_default": true, "name": "string", @@ -169,6 +171,7 @@ curl -X GET http://coder-server:8080/api/v2/organizations/{organization} \ "created_at": "2019-08-24T14:15:22Z", "description": "string", "display_name": "string", + "icon": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "is_default": true, "name": "string", @@ -248,6 +251,7 @@ curl -X PATCH http://coder-server:8080/api/v2/organizations/{organization} \ { "description": "string", "display_name": "string", + "icon": "string", "name": "string" } ``` @@ -268,6 +272,7 @@ curl -X PATCH http://coder-server:8080/api/v2/organizations/{organization} \ "created_at": "2019-08-24T14:15:22Z", "description": "string", "display_name": "string", + "icon": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "is_default": true, "name": "string", diff --git a/docs/api/schemas.md b/docs/api/schemas.md index 348ce54e11ba3..a825e21778c74 100644 --- a/docs/api/schemas.md +++ b/docs/api/schemas.md @@ -1029,6 +1029,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in { "description": "string", "display_name": "string", + "icon": "string", "name": "string" } ``` @@ -1039,6 +1040,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in | -------------- | ------ | -------- | ------------ | ---------------------------------------------------------------------- | | `description` | string | false | | | | `display_name` | string | false | | Display name will default to the same value as `Name` if not provided. | +| `icon` | string | false | | | | `name` | string | true | | | ## codersdk.CreateTemplateRequest @@ -3214,6 +3216,7 @@ CreateWorkspaceRequest provides options for creating a new workspace. Only one o "created_at": "2019-08-24T14:15:22Z", "description": "string", "display_name": "string", + "icon": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "is_default": true, "name": "string", @@ -3228,6 +3231,7 @@ CreateWorkspaceRequest provides options for creating a new workspace. Only one o | `created_at` | string | true | | | | `description` | string | false | | | | `display_name` | string | true | | | +| `icon` | string | false | | | | `id` | string | true | | | | `is_default` | boolean | true | | | | `name` | string | true | | | @@ -5000,6 +5004,7 @@ CreateWorkspaceRequest provides options for creating a new workspace. Only one o { "description": "string", "display_name": "string", + "icon": "string", "name": "string" } ``` @@ -5010,6 +5015,7 @@ CreateWorkspaceRequest provides options for creating a new workspace. Only one o | -------------- | ------ | -------- | ------------ | ----------- | | `description` | string | false | | | | `display_name` | string | false | | | +| `icon` | string | false | | | | `name` | string | false | | | ## codersdk.UpdateRoles diff --git a/docs/api/users.md b/docs/api/users.md index 2a40ba1e8577b..1f6a37346e1f1 100644 --- a/docs/api/users.md +++ b/docs/api/users.md @@ -1000,6 +1000,7 @@ curl -X GET http://coder-server:8080/api/v2/users/{user}/organizations \ "created_at": "2019-08-24T14:15:22Z", "description": "string", "display_name": "string", + "icon": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "is_default": true, "name": "string", @@ -1024,6 +1025,7 @@ Status Code **200** | `» created_at` | string(date-time) | true | | | | `» description` | string | false | | | | `» display_name` | string | true | | | +| `» icon` | string | false | | | | `» id` | string(uuid) | true | | | | `» is_default` | boolean | true | | | | `» name` | string | true | | | @@ -1060,6 +1062,7 @@ curl -X GET http://coder-server:8080/api/v2/users/{user}/organizations/{organiza "created_at": "2019-08-24T14:15:22Z", "description": "string", "display_name": "string", + "icon": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "is_default": true, "name": "string", diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index a53717e3e0229..971fae1149075 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -228,6 +228,7 @@ export interface CreateOrganizationRequest { readonly name: string; readonly display_name: string; readonly description?: string; + readonly icon?: string; } // From codersdk/organizations.go @@ -784,6 +785,7 @@ export interface Organization { readonly created_at: string; readonly updated_at: string; readonly is_default: boolean; + readonly icon: string; } // From codersdk/organizations.go @@ -1330,6 +1332,7 @@ export interface UpdateOrganizationRequest { readonly name?: string; readonly display_name?: string; readonly description?: string; + readonly icon?: string; } // From codersdk/users.go From c9928ca0163cba7c29e037ba523e445d7b910638 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 11 Jun 2024 20:56:10 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=A7=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clock/mock.go | 5 +++-- coderd/database/dbgen/dbgen.go | 1 + site/src/testHelpers/entities.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/clock/mock.go b/clock/mock.go index 6e66206c1614d..97e7a16874851 100644 --- a/clock/mock.go +++ b/clock/mock.go @@ -2,12 +2,13 @@ package clock import ( "context" - "errors" "fmt" "slices" "sync" "testing" "time" + + "golang.org/x/xerrors" ) // Mock is the testing implementation of Clock. It tracks a time that monotonically increases @@ -571,7 +572,7 @@ func (t *Trap) Close() { close(t.done) } -var ErrTrapClosed = errors.New("trap closed") +var ErrTrapClosed = xerrors.New("trap closed") func (t *Trap) Wait(ctx context.Context) (*Call, error) { select { diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index bc18da548d683..23c6e8a351da0 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -338,6 +338,7 @@ func Organization(t testing.TB, db database.Store, orig database.Organization) d Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)), DisplayName: takeFirst(orig.Name, namesgenerator.GetRandomName(1)), Description: takeFirst(orig.Description, namesgenerator.GetRandomName(1)), + Icon: takeFirst(orig.Icon, ""), CreatedAt: takeFirst(orig.CreatedAt, dbtime.Now()), UpdatedAt: takeFirst(orig.UpdatedAt, dbtime.Now()), }) diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 424c1b7ef331d..bd7627f070fdf 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -16,6 +16,7 @@ export const MockOrganization: TypesGen.Organization = { name: "test-organization", display_name: "Test Organization", description: "", + icon: "", created_at: "", updated_at: "", is_default: true, From 418d3caf63b1d1179cd4272e9c53200d5a80c68f Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Wed, 12 Jun 2024 17:39:46 +0000 Subject: [PATCH 3/3] allow setting `Description` and `Icon` to `""` --- coderd/organizations.go | 8 ++++---- coderd/organizations_test.go | 5 +++-- codersdk/organizations.go | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/coderd/organizations.go b/coderd/organizations.go index 093b52d6559cd..6c0b14697a642 100644 --- a/coderd/organizations.go +++ b/coderd/organizations.go @@ -174,11 +174,11 @@ func (api *API) patchOrganization(rw http.ResponseWriter, r *http.Request) { if req.DisplayName != "" { updateOrgParams.DisplayName = req.DisplayName } - if req.Description != "" { - updateOrgParams.Description = req.Description + if req.Description != nil { + updateOrgParams.Description = *req.Description } - if req.Icon != "" { - updateOrgParams.Icon = req.Icon + if req.Icon != nil { + updateOrgParams.Icon = *req.Icon } organization, err = tx.UpdateOrganization(ctx, updateOrgParams) diff --git a/coderd/organizations_test.go b/coderd/organizations_test.go index 4899c9f73b48d..0dafb53590814 100644 --- a/coderd/organizations_test.go +++ b/coderd/organizations_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" "github.com/coder/coder/v2/coderd/coderdtest" + "github.com/coder/coder/v2/coderd/util/ptr" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/testutil" ) @@ -302,7 +303,7 @@ func TestPatchOrganizationsByUser(t *testing.T) { require.NoError(t, err) o, err = client.UpdateOrganization(ctx, o.Name, codersdk.UpdateOrganizationRequest{ - Description: "wow, this organization description is so updated!", + Description: ptr.Ref("wow, this organization description is so updated!"), }) require.NoError(t, err) @@ -324,7 +325,7 @@ func TestPatchOrganizationsByUser(t *testing.T) { require.NoError(t, err) o, err = client.UpdateOrganization(ctx, o.Name, codersdk.UpdateOrganizationRequest{ - Icon: "/emojis/1f48f-1f3ff.png", + Icon: ptr.Ref("/emojis/1f48f-1f3ff.png"), }) require.NoError(t, err) diff --git a/codersdk/organizations.go b/codersdk/organizations.go index 1e0893bd857ea..f125dbca3dc58 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -67,10 +67,10 @@ type CreateOrganizationRequest struct { } type UpdateOrganizationRequest struct { - Name string `json:"name,omitempty" validate:"omitempty,organization_name"` - DisplayName string `json:"display_name,omitempty" validate:"omitempty,organization_display_name"` - Description string `json:"description,omitempty"` - Icon string `json:"icon,omitempty"` + Name string `json:"name,omitempty" validate:"omitempty,organization_name"` + DisplayName string `json:"display_name,omitempty" validate:"omitempty,organization_display_name"` + Description *string `json:"description,omitempty"` + Icon *string `json:"icon,omitempty"` } // CreateTemplateVersionRequest enables callers to create a new Template Version.