Skip to content

Commit 265a895

Browse files
committed
🪓
1 parent 10224ad commit 265a895

File tree

4 files changed

+49
-13
lines changed

4 files changed

+49
-13
lines changed

coderd/coderd.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,8 @@ func New(options *Options) *API {
810810
httpmw.ExtractOrganizationParam(options.Database),
811811
)
812812
r.Get("/", api.organization)
813+
r.Patch("/", api.patchOrganization)
814+
r.Delete("/", api.deleteOrganization)
813815
r.Post("/templateversions", api.postTemplateVersionsByOrganization)
814816
r.Route("/templates", func(r chi.Router) {
815817
r.Post("/", api.postTemplateByOrganization)

coderd/database/dbmem/dbmem.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,7 @@ func (q *FakeQuerier) DeleteOldWorkspaceAgentStats(_ context.Context) error {
15731573
return nil
15741574
}
15751575

1576-
func (q *FakeQuerier) DeleteOrganization(ctx context.Context, id uuid.UUID) error {
1576+
func (q *FakeQuerier) DeleteOrganization(_ context.Context, id uuid.UUID) error {
15771577
for i, org := range q.organizations {
15781578
if org.ID == id {
15791579
q.organizations = append(q.organizations[:i], q.organizations[i+1:]...)
@@ -7153,7 +7153,7 @@ func (q *FakeQuerier) UpdateOAuth2ProviderAppSecretByID(_ context.Context, arg d
71537153
return database.OAuth2ProviderAppSecret{}, sql.ErrNoRows
71547154
}
71557155

7156-
func (q *FakeQuerier) UpdateOrganization(ctx context.Context, arg database.UpdateOrganizationParams) (database.Organization, error) {
7156+
func (q *FakeQuerier) UpdateOrganization(_ context.Context, arg database.UpdateOrganizationParams) (database.Organization, error) {
71577157
err := validateDatabaseType(arg)
71587158
if err != nil {
71597159
return database.Organization{}, err

coderd/organizations.go

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,18 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) {
125125
// @Produce json
126126
// @Tags Organizations
127127
// @Param request body codersdk.PatchOrganizationRequest true "Patch organization request"
128-
// @Success 201 {object} codersdk.Organization
128+
// @Success 200 {object} codersdk.Organization
129129
// @Router /organizations/{organization} [patch]
130130
func (api *API) patchOrganization(rw http.ResponseWriter, r *http.Request) {
131131
ctx := r.Context()
132+
organization := httpmw.OrganizationParam(r)
132133

133134
var req codersdk.PatchOrganizationRequest
134135
if !httpapi.Read(ctx, rw, r, &req) {
135136
return
136137
}
137138

138-
if req.Name == codersdk.DefaultOrganization {
139+
if req.Name == codersdk.DefaultOrganization && !organization.IsDefault {
139140
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
140141
Message: fmt.Sprintf("Organization name %q is reserved.", codersdk.DefaultOrganization),
141142
})
@@ -157,22 +158,55 @@ func (api *API) patchOrganization(rw http.ResponseWriter, r *http.Request) {
157158
return
158159
}
159160

160-
organization, err := api.Database.UpdateOrganization(ctx, database.UpdateOrganizationParams{
161-
ID: uuid.New(),
162-
Name: req.Name,
161+
organization, err = api.Database.UpdateOrganization(ctx, database.UpdateOrganizationParams{
162+
ID: organization.ID,
163163
UpdatedAt: dbtime.Now(),
164+
Name: req.Name,
164165
})
165166
if err != nil {
166167
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
167-
Message: "Internal error inserting organization member.",
168-
Detail: fmt.Sprintf("update organization: %w", err),
168+
Message: "Internal error updating organization.",
169+
Detail: fmt.Sprintf("update organization: %s", err.Error()),
169170
})
170171
return
171172
}
172173

173174
httpapi.Write(ctx, rw, http.StatusOK, convertOrganization(organization))
174175
}
175176

177+
// @Summary Delete organization
178+
// @ID delete-organization
179+
// @Security CoderSessionToken
180+
// @Accept json
181+
// @Produce json
182+
// @Tags Organizations
183+
// @Success 200
184+
// @Router /organizations/{organization} [delete]
185+
func (api *API) deleteOrganization(rw http.ResponseWriter, r *http.Request) {
186+
ctx := r.Context()
187+
organization := httpmw.OrganizationParam(r)
188+
189+
if organization.IsDefault {
190+
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
191+
Message: fmt.Sprintf("Organization name %q is reserved.", codersdk.DefaultOrganization),
192+
})
193+
return
194+
}
195+
196+
err := api.Database.DeleteOrganization(ctx, organization.ID)
197+
if err != nil {
198+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
199+
Message: "Internal error deleting organization.",
200+
Detail: fmt.Sprintf("delete organization: %s", err.Error()),
201+
})
202+
return
203+
}
204+
205+
httpapi.Write(ctx, rw, http.StatusOK, codersdk.Response{
206+
Message: "Organization has been deleted.",
207+
})
208+
}
209+
176210
// convertOrganization consumes the database representation and outputs an API friendly representation.
177211
func convertOrganization(organization database.Organization) codersdk.Organization {
178212
return codersdk.Organization{

scripts/rbacgen/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func generateRbacObjects(templateSource string) ([]byte, error) {
148148
// Parse the policy.go file for the action enums
149149
f, err := parser.ParseFile(token.NewFileSet(), "./coderd/rbac/policy/policy.go", nil, parser.ParseComments)
150150
if err != nil {
151-
return nil, fmt.Errorf("parsing policy.go: %w", err)
151+
return nil, xerrors.Errorf("parsing policy.go: %w", err)
152152
}
153153
actionMap := fileActions(f)
154154
actionList := make([]ActionDetails, 0)
@@ -176,14 +176,14 @@ func generateRbacObjects(templateSource string) ([]byte, error) {
176176
x++
177177
v, ok := actionMap[string(action)]
178178
if !ok {
179-
errorList = append(errorList, fmt.Errorf("action value %q does not have a constant a matching enum constant", action))
179+
errorList = append(errorList, xerrors.Errorf("action value %q does not have a constant a matching enum constant", action))
180180
}
181181
return v
182182
},
183183
"concat": func(strs ...string) string { return strings.Join(strs, "") },
184184
}).Parse(templateSource)
185185
if err != nil {
186-
return nil, fmt.Errorf("parse template: %w", err)
186+
return nil, xerrors.Errorf("parse template: %w", err)
187187
}
188188

189189
// Convert to sorted list for autogen consistency.
@@ -203,7 +203,7 @@ func generateRbacObjects(templateSource string) ([]byte, error) {
203203

204204
err = tpl.Execute(&out, list)
205205
if err != nil {
206-
return nil, fmt.Errorf("execute template: %w", err)
206+
return nil, xerrors.Errorf("execute template: %w", err)
207207
}
208208

209209
if len(errorList) > 0 {

0 commit comments

Comments
 (0)