Skip to content
This repository has been archived by the owner on Aug 16, 2022. It is now read-only.

Commit

Permalink
Merge remote-tracking branch 'origin/main' into feature/fix-dataset-c…
Browse files Browse the repository at this point in the history
…ount
  • Loading branch information
keiya01 committed Jun 2, 2022
2 parents 7fcc08f + 602ec07 commit d2d8008
Show file tree
Hide file tree
Showing 22 changed files with 638 additions and 131 deletions.
1 change: 1 addition & 0 deletions internal/adapter/gql/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion internal/adapter/gql/gqlmodel/models_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions internal/app/usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@ func UsecaseMiddleware(r *repo.Container, g *gateway.Container, config interacto
var r2 *repo.Container
if op := adapter.Operator(ctx); op != nil && r != nil {
// apply filters to repos
r3 := r.Filtered(
r2 = r.Filtered(
repo.TeamFilterFromOperator(op),
repo.SceneFilterFromOperator(op),
)
r2 = &r3
} else {
r2 = r
}
Expand Down
40 changes: 35 additions & 5 deletions internal/infrastructure/memory/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,52 @@ import (
"github.com/reearth/reearth-backend/internal/usecase/repo"
)

type Transaction struct{}
type Transaction struct {
committed int
beginerror error
enderror error
}

type Tx struct{}
type Tx struct {
t *Transaction
committed bool
enderror error
}

func NewTransaction() *Transaction {
return &Transaction{}
}

func (t *Transaction) SetBeginError(err error) {
t.beginerror = err
}

func (t *Transaction) SetEndError(err error) {
t.enderror = err
}

func (t *Transaction) Committed() int {
return t.committed
}

func (t *Transaction) Begin() (repo.Tx, error) {
return &Tx{}, nil
if t.beginerror != nil {
return nil, t.beginerror
}
return &Tx{t: t, enderror: t.enderror}, nil
}

func (t *Tx) Commit() {
// do nothing
t.committed = true
if t.t != nil {
t.t.committed++
}
}

func (t *Tx) End(_ context.Context) error {
return nil
return t.enderror
}

func (t *Tx) IsCommitted() bool {
return t.committed
}
38 changes: 38 additions & 0 deletions internal/infrastructure/memory/transaction_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package memory

import (
"context"
"errors"
"testing"

"github.com/stretchr/testify/assert"
)

func TestTransaction_Committed(t *testing.T) {
tr := NewTransaction()
tx, err := tr.Begin()
assert.NoError(t, err)
assert.Equal(t, 0, tr.Committed())
tx.Commit()
assert.Equal(t, 1, tr.Committed())
assert.NoError(t, tx.End(context.Background()))
assert.NoError(t, err)
}

func TestTransaction_SetBeginError(t *testing.T) {
err := errors.New("a")
tr := NewTransaction()
tr.SetBeginError(err)
tx, err2 := tr.Begin()
assert.Nil(t, tx)
assert.Same(t, err, err2)
}

func TestTransaction_SetEndError(t *testing.T) {
err := errors.New("a")
tr := NewTransaction()
tr.SetEndError(err)
tx, err2 := tr.Begin()
assert.NoError(t, err2)
assert.Same(t, err, tx.End(context.Background()))
}
4 changes: 4 additions & 0 deletions internal/infrastructure/mongo/mongodoc/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -433,3 +433,7 @@ func (t *Tx) End(ctx context.Context) error {
t.session.EndSession(ctx)
return nil
}

func (t *Tx) IsCommitted() bool {
return t.commit
}
134 changes: 52 additions & 82 deletions internal/usecase/interactor/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
)

type Asset struct {
common
repos *repo.Container
gateways *gateway.Container
}
Expand All @@ -31,95 +30,66 @@ func (i *Asset) Fetch(ctx context.Context, assets []id.AssetID, operator *usecas
}

func (i *Asset) FindByTeam(ctx context.Context, tid id.TeamID, keyword *string, sort *asset.SortType, p *usecase.Pagination, operator *usecase.Operator) ([]*asset.Asset, *usecase.PageInfo, error) {
if err := i.CanReadTeam(tid, operator); err != nil {
return nil, nil, err
}

return i.repos.Asset.FindByTeam(ctx, tid, repo.AssetFilter{
Sort: sort,
Keyword: keyword,
Pagination: p,
})
return Run2(
ctx, operator, i.repos,
Usecase().WithReadableTeams(tid),
func() ([]*asset.Asset, *usecase.PageInfo, error) {
return i.repos.Asset.FindByTeam(ctx, tid, repo.AssetFilter{
Sort: sort,
Keyword: keyword,
Pagination: p,
})
},
)
}

func (i *Asset) Create(ctx context.Context, inp interfaces.CreateAssetParam, operator *usecase.Operator) (result *asset.Asset, err error) {
if err := i.CanWriteTeam(inp.TeamID, operator); err != nil {
return nil, err
}

if inp.File == nil {
return nil, interfaces.ErrFileNotIncluded
}

tx, err := i.repos.Transaction.Begin()
if err != nil {
return
}
defer func() {
if err2 := tx.End(ctx); err == nil && err2 != nil {
err = err2
}
}()

url, err := i.gateways.File.UploadAsset(ctx, inp.File)
if err != nil {
return nil, err
}

result, err = asset.New().
NewID().
Team(inp.TeamID).
Name(path.Base(inp.File.Path)).
Size(inp.File.Size).
URL(url.String()).
Build()
if err != nil {
return nil, err
}

if err = i.repos.Asset.Save(ctx, result); err != nil {
return
}

tx.Commit()
return
return Run1(
ctx, operator, i.repos,
Usecase().
WithReadableTeams(inp.TeamID).
Transaction(),
func() (*asset.Asset, error) {
url, err := i.gateways.File.UploadAsset(ctx, inp.File)
if err != nil {
return nil, err
}

return asset.New().
NewID().
Team(inp.TeamID).
Name(path.Base(inp.File.Path)).
Size(inp.File.Size).
URL(url.String()).
Build()
})
}

func (i *Asset) Remove(ctx context.Context, aid id.AssetID, operator *usecase.Operator) (result id.AssetID, err error) {
asset, err := i.repos.Asset.FindByID(ctx, aid)
if err != nil {
return aid, err
}

tx, err := i.repos.Transaction.Begin()
if err != nil {
return
}
defer func() {
if err2 := tx.End(ctx); err == nil && err2 != nil {
err = err2
}
}()

team, err := i.repos.Team.FindByID(ctx, asset.Team())
if err != nil {
return aid, err
}

if !team.Members().ContainsUser(operator.User) {
return aid, interfaces.ErrOperationDenied
}

if url, _ := url.Parse(asset.URL()); url != nil {
if err = i.gateways.File.RemoveAsset(ctx, url); err != nil {
return aid, err
}
}

if err = i.repos.Asset.Remove(ctx, aid); err != nil {
return
}

tx.Commit()
return aid, nil
return Run1(
ctx, operator, i.repos,
Usecase().Transaction(),
func() (id.AssetID, error) {
asset, err := i.repos.Asset.FindByID(ctx, aid)
if err != nil {
return aid, err
}

if ok := operator.IsWritableTeam(asset.Team()); !ok {
return aid, interfaces.ErrOperationDenied
}

if url, _ := url.Parse(asset.URL()); url != nil {
if err := i.gateways.File.RemoveAsset(ctx, url); err != nil {
return aid, err
}
}

return aid, i.repos.Asset.Remove(ctx, aid)
},
)
}
4 changes: 2 additions & 2 deletions internal/usecase/interactor/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@ import (
"errors"
"net/url"

"github.com/reearth/reearth-backend/internal/usecase"
"github.com/reearth/reearth-backend/internal/usecase/gateway"
"github.com/reearth/reearth-backend/internal/usecase/interfaces"

"github.com/reearth/reearth-backend/internal/usecase"
"github.com/reearth/reearth-backend/internal/usecase/repo"
"github.com/reearth/reearth-backend/pkg/id"
"github.com/reearth/reearth-backend/pkg/project"
Expand Down Expand Up @@ -46,6 +45,7 @@ func NewContainer(r *repo.Container, g *gateway.Container, config ContainerConfi
}
}

// Deprecated: common will be deprecated. Please use the Usecase function instead.
type common struct{}

func (common) OnlyOperator(op *usecase.Operator) error {
Expand Down
Loading

0 comments on commit d2d8008

Please sign in to comment.