From afc7e23d7192863babd46e90649e3cb1c3dd32dd Mon Sep 17 00:00:00 2001 From: rot1024 Date: Tue, 14 Mar 2023 18:31:01 +0900 Subject: [PATCH] fix(server): upload assets outside transaction --- server/internal/usecase/interactor/asset.go | 86 +++++++++---------- .../internal/usecase/interactor/asset_test.go | 9 +- 2 files changed, 44 insertions(+), 51 deletions(-) diff --git a/server/internal/usecase/interactor/asset.go b/server/internal/usecase/interactor/asset.go index 8f91935eb..e7c1c4d33 100644 --- a/server/internal/usecase/interactor/asset.go +++ b/server/internal/usecase/interactor/asset.go @@ -48,55 +48,53 @@ func (i *Asset) Create(ctx context.Context, inp interfaces.CreateAssetParam, ope if inp.File == nil { return nil, interfaces.ErrFileNotIncluded } - return Run1( - ctx, operator, i.repos, - Usecase(). - WithWritableWorkspaces(inp.WorkspaceID). - Transaction(), - func(ctx context.Context) (*asset.Asset, error) { - ws, err := i.repos.Workspace.FindByID(ctx, inp.WorkspaceID) - if err != nil { - return nil, err - } - url, size, err := i.gateways.File.UploadAsset(ctx, inp.File) - if err != nil { - return nil, err - } + ws, err := i.repos.Workspace.FindByID(ctx, inp.WorkspaceID) + if err != nil { + return nil, err + } - // enforce policy - if policyID := operator.Policy(ws.Policy()); policyID != nil { - p, err := i.repos.Policy.FindByID(ctx, *policyID) - if err != nil { - return nil, err - } - s, err := i.repos.Asset.TotalSizeByWorkspace(ctx, ws.ID()) - if err != nil { - return nil, err - } - if err := p.EnforceAssetStorageSize(s + size); err != nil { - _ = i.gateways.File.RemoveAsset(ctx, url) - return nil, err - } - } + if !operator.IsWritableWorkspace(ws.ID()) { + return nil, interfaces.ErrOperationDenied + } - a, err := asset.New(). - NewID(). - Workspace(inp.WorkspaceID). - Name(path.Base(inp.File.Path)). - Size(size). - URL(url.String()). - Build() - if err != nil { - return nil, err - } + url, size, err := i.gateways.File.UploadAsset(ctx, inp.File) + if err != nil { + return nil, err + } - if err := i.repos.Asset.Save(ctx, a); err != nil { - return nil, err - } + // enforce policy + if policyID := operator.Policy(ws.Policy()); policyID != nil { + p, err := i.repos.Policy.FindByID(ctx, *policyID) + if err != nil { + return nil, err + } + s, err := i.repos.Asset.TotalSizeByWorkspace(ctx, ws.ID()) + if err != nil { + return nil, err + } + if err := p.EnforceAssetStorageSize(s + size); err != nil { + _ = i.gateways.File.RemoveAsset(ctx, url) + return nil, err + } + } + + a, err := asset.New(). + NewID(). + Workspace(inp.WorkspaceID). + Name(path.Base(inp.File.Path)). + Size(size). + URL(url.String()). + Build() + if err != nil { + return nil, err + } + + if err := i.repos.Asset.Save(ctx, a); err != nil { + return nil, err + } - return a, nil - }) + return a, nil } func (i *Asset) Remove(ctx context.Context, aid id.AssetID, operator *usecase.Operator) (result id.AssetID, err error) { diff --git a/server/internal/usecase/interactor/asset_test.go b/server/internal/usecase/interactor/asset_test.go index 703e6e7c9..6e73f191b 100644 --- a/server/internal/usecase/interactor/asset_test.go +++ b/server/internal/usecase/interactor/asset_test.go @@ -16,7 +16,6 @@ import ( "github.com/reearth/reearth/server/pkg/file" "github.com/reearth/reearth/server/pkg/id" "github.com/reearth/reearth/server/pkg/workspace" - "github.com/reearth/reearthx/usecasex" "github.com/spf13/afero" "github.com/stretchr/testify/assert" ) @@ -30,13 +29,10 @@ func TestAsset_Create(t *testing.T) { mfs := afero.NewMemMapFs() f, _ := fs.NewFile(mfs, "") - - transaction := &usecasex.NopTransaction{} uc := &Asset{ repos: &repo.Container{ - Asset: memory.NewAsset(), - Workspace: memory.NewWorkspaceWith(ws), - Transaction: transaction, + Asset: memory.NewAsset(), + Workspace: memory.NewWorkspaceWith(ws), }, gateways: &gateway.Container{ File: f, @@ -70,7 +66,6 @@ func TestAsset_Create(t *testing.T) { assert.NoError(t, err) assert.Equal(t, want, res) - assert.True(t, transaction.IsCommitted()) a, _ := uc.repos.Asset.FindByID(ctx, aid) assert.Equal(t, want, a) }