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

Commit0e8dcfb

Browse files
committed
refactor
1 parent9aaad74 commit0e8dcfb

File tree

3 files changed

+87
-57
lines changed

3 files changed

+87
-57
lines changed

‎coderd/aitasks.go‎

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package coderd
22

33
import (
4-
"bytes"
54
"context"
65
"database/sql"
76
"errors"
@@ -19,6 +18,7 @@ import (
1918
"github.com/coder/coder/v2/coderd/audit"
2019
"github.com/coder/coder/v2/coderd/database"
2120
"github.com/coder/coder/v2/coderd/httpapi"
21+
"github.com/coder/coder/v2/coderd/httpapi/httperror"
2222
"github.com/coder/coder/v2/coderd/httpmw"
2323
"github.com/coder/coder/v2/coderd/rbac"
2424
"github.com/coder/coder/v2/coderd/rbac/policy"
@@ -443,7 +443,8 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
443443
}
444444

445445
// taskDelete is an experimental endpoint to delete a task by ID (workspace ID).
446-
// It creates a delete workspace build and returns 202 Accepted if the build was created.
446+
// It creates a delete workspace build and returns 202 Accepted if the build was
447+
// created.
447448
func (api*API)taskDelete(rw http.ResponseWriter,r*http.Request) {
448449
ctx:=r.Context()
449450
apiKey:=httpmw.APIKey(r)
@@ -497,43 +498,21 @@ func (api *API) taskDelete(rw http.ResponseWriter, r *http.Request) {
497498
Reason:"Deleted via tasks API",
498499
}
499500

500-
rc:=&responseWriterCapture{}
501-
api.postWorkspaceBuildsInternal(rc,r,apiKey,workspace,buildReq)
502-
503-
status:=rc.status
504-
ifstatus==0 {
505-
status=http.StatusOK
506-
}
507-
508-
ifstatus!=http.StatusCreated {
509-
// Propagate the error response from the workspace build handler.
510-
fork,vs:=rangerc.Header() {
511-
for_,v:=rangevs {
512-
rw.Header().Add(k,v)
513-
}
514-
}
515-
rw.WriteHeader(status)
516-
_,_=rw.Write(rc.body.Bytes())
501+
_,err=api.postWorkspaceBuildsInternal(
502+
ctx,
503+
apiKey,
504+
workspace,
505+
buildReq,
506+
func(action policy.Action,object rbac.Objecter)bool {
507+
returnapi.Authorize(r,action,object)
508+
},
509+
audit.WorkspaceBuildBaggageFromRequest(r),
510+
)
511+
iferr!=nil {
512+
httperror.WriteWorkspaceBuildError(ctx,rw,err)
517513
return
518514
}
519515

520516
// Delete build created successfully.
521517
rw.WriteHeader(http.StatusAccepted)
522518
}
523-
524-
typeresponseWriterCapturestruct {
525-
header http.Header
526-
statusint
527-
body bytes.Buffer
528-
}
529-
530-
func (w*responseWriterCapture)Header() http.Header {
531-
ifw.header==nil {
532-
w.header=make(http.Header)
533-
}
534-
returnw.header
535-
}
536-
537-
func (w*responseWriterCapture)Write(b []byte) (int,error) {returnw.body.Write(b) }
538-
539-
func (w*responseWriterCapture)WriteHeader(statusCodeint) {w.status=statusCode }

‎coderd/httpapi/httperror/responserror.go‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package httperror
22

33
import (
44
"errors"
5+
"fmt"
56

67
"github.com/coder/coder/v2/codersdk"
78
)
@@ -17,3 +18,32 @@ func IsResponder(err error) (Responder, bool) {
1718
}
1819
returnnil,false
1920
}
21+
22+
funcNewResponseError(statusint,resp codersdk.Response)error {
23+
return&responseError{
24+
status:status,
25+
response:resp,
26+
}
27+
}
28+
29+
typeresponseErrorstruct {
30+
statusint
31+
response codersdk.Response
32+
}
33+
34+
var (
35+
_error= (*responseError)(nil)
36+
_Responder= (*responseError)(nil)
37+
)
38+
39+
func (e*responseError)Error()string {
40+
returnfmt.Sprintf("%s: %s",e.response.Message,e.response.Detail)
41+
}
42+
43+
func (e*responseError)Status()int {
44+
returne.status
45+
}
46+
47+
func (e*responseError)Response() (int, codersdk.Response) {
48+
returne.status,e.response
49+
}

‎coderd/workspacebuilds.go‎

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -335,15 +335,38 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
335335
return
336336
}
337337

338-
api.postWorkspaceBuildsInternal(rw,r,apiKey,workspace,createBuild)
338+
apiBuild,err:=api.postWorkspaceBuildsInternal(
339+
ctx,
340+
apiKey,
341+
workspace,
342+
createBuild,
343+
func(action policy.Action,object rbac.Objecter)bool {
344+
returnapi.Authorize(r,action,object)
345+
},
346+
audit.WorkspaceBuildBaggageFromRequest(r),
347+
)
348+
iferr!=nil {
349+
httperror.WriteWorkspaceBuildError(ctx,rw,err)
350+
return
351+
}
352+
353+
httpapi.Write(ctx,rw,http.StatusCreated,apiBuild)
339354
}
340355

341356
// postWorkspaceBuildsInternal handles the internal logic for creating
342357
// workspace builds, can be called by other handlers and must not
343358
// reference httpmw.
344-
func (api*API)postWorkspaceBuildsInternal(rw http.ResponseWriter,r*http.Request,apiKey database.APIKey,workspace database.Workspace,createBuild codersdk.CreateWorkspaceBuildRequest) {
345-
ctx:=r.Context()
346-
359+
func (api*API)postWorkspaceBuildsInternal(
360+
ctx context.Context,
361+
apiKey database.APIKey,
362+
workspace database.Workspace,
363+
createBuild codersdk.CreateWorkspaceBuildRequest,
364+
authorizefunc(action policy.Action,object rbac.Objecter)bool,
365+
workspaceBuildBaggage audit.WorkspaceBuildBaggage,
366+
) (
367+
codersdk.WorkspaceBuild,
368+
error,
369+
) {
347370
transition:=database.WorkspaceTransition(createBuild.Transition)
348371
builder:=wsbuilder.New(workspace,transition,*api.BuildUsageChecker.Load()).
349372
Initiator(apiKey.UserID).
@@ -370,11 +393,10 @@ func (api *API) postWorkspaceBuildsInternal(rw http.ResponseWriter, r *http.Requ
370393
previousWorkspaceBuild,err=tx.GetLatestWorkspaceBuildByWorkspaceID(ctx,workspace.ID)
371394
iferr!=nil&&!xerrors.Is(err,sql.ErrNoRows) {
372395
api.Logger.Error(ctx,"failed fetching previous workspace build",slog.F("workspace_id",workspace.ID),slog.Error(err))
373-
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
396+
returnhttperror.NewResponseError(http.StatusInternalServerError, codersdk.Response{
374397
Message:"Internal error fetching previous workspace build",
375398
Detail:err.Error(),
376399
})
377-
returnnil
378400
}
379401

380402
ifcreateBuild.TemplateVersionID!=uuid.Nil {
@@ -383,16 +405,14 @@ func (api *API) postWorkspaceBuildsInternal(rw http.ResponseWriter, r *http.Requ
383405

384406
ifcreateBuild.Orphan {
385407
ifcreateBuild.Transition!=codersdk.WorkspaceTransitionDelete {
386-
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{
408+
returnhttperror.NewResponseError(http.StatusBadRequest, codersdk.Response{
387409
Message:"Orphan is only permitted when deleting a workspace.",
388410
})
389-
returnnil
390411
}
391412
iflen(createBuild.ProvisionerState)>0 {
392-
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{
413+
returnhttperror.NewResponseError(http.StatusBadRequest, codersdk.Response{
393414
Message:"ProvisionerState cannot be set alongside Orphan since state intent is unclear.",
394415
})
395-
returnnil
396416
}
397417
builder=builder.Orphan()
398418
}
@@ -405,24 +425,23 @@ func (api *API) postWorkspaceBuildsInternal(rw http.ResponseWriter, r *http.Requ
405425
tx,
406426
api.FileCache,
407427
func(action policy.Action,object rbac.Objecter)bool {
408-
ifauth:=api.Authorize(r,action,object);auth {
428+
ifauth:=authorize(action,object);auth {
409429
returntrue
410430
}
411431
// Special handling for prebuilt workspace deletion
412432
ifaction==policy.ActionDelete {
413433
ifworkspaceObj,ok:=object.(database.PrebuiltWorkspaceResource);ok&&workspaceObj.IsPrebuild() {
414-
returnapi.Authorize(r,action,workspaceObj.AsPrebuild())
434+
returnauthorize(action,workspaceObj.AsPrebuild())
415435
}
416436
}
417437
returnfalse
418438
},
419-
audit.WorkspaceBuildBaggageFromRequest(r),
439+
workspaceBuildBaggage,
420440
)
421441
returnerr
422442
},nil)
423443
iferr!=nil {
424-
httperror.WriteWorkspaceBuildError(ctx,rw,err)
425-
return
444+
return codersdk.WorkspaceBuild{},err
426445
}
427446

428447
varqueuePos database.GetProvisionerJobsByIDsWithQueuePositionRow
@@ -486,11 +505,13 @@ func (api *API) postWorkspaceBuildsInternal(rw http.ResponseWriter, r *http.Requ
486505
provisionerDaemons,
487506
)
488507
iferr!=nil {
489-
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
490-
Message:"Internal error converting workspace build.",
491-
Detail:err.Error(),
492-
})
493-
return
508+
return codersdk.WorkspaceBuild{},httperror.NewResponseError(
509+
http.StatusInternalServerError,
510+
codersdk.Response{
511+
Message:"Internal error converting workspace build.",
512+
Detail:err.Error(),
513+
},
514+
)
494515
}
495516

496517
// If this workspace build has a different template version ID to the previous build
@@ -517,7 +538,7 @@ func (api *API) postWorkspaceBuildsInternal(rw http.ResponseWriter, r *http.Requ
517538
WorkspaceID:workspace.ID,
518539
})
519540

520-
httpapi.Write(ctx,rw,http.StatusCreated,apiBuild)
541+
returnapiBuild,nil
521542
}
522543

523544
func (api*API)notifyWorkspaceUpdated(

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp