This repository has been archived by the owner on Aug 16, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
asset.go
125 lines (104 loc) · 2.76 KB
/
asset.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package interactor
import (
"context"
"net/url"
"path"
"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/repo"
"github.com/reearth/reearth-backend/pkg/asset"
"github.com/reearth/reearth-backend/pkg/id"
)
type Asset struct {
common
assetRepo repo.Asset
teamRepo repo.Team
transaction repo.Transaction
file gateway.File
}
func NewAsset(r *repo.Container, gr *gateway.Container) interfaces.Asset {
return &Asset{
assetRepo: r.Asset,
teamRepo: r.Team,
transaction: r.Transaction,
file: gr.File,
}
}
func (i *Asset) Fetch(ctx context.Context, assets []id.AssetID, operator *usecase.Operator) ([]*asset.Asset, error) {
return i.assetRepo.FindByIDs(ctx, assets, operator.ReadableTeams)
}
func (i *Asset) FindByTeam(ctx context.Context, tid id.TeamID, 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.assetRepo.FindByTeam(ctx, tid, 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.transaction.Begin()
if err != nil {
return
}
defer func() {
if err2 := tx.End(ctx); err == nil && err2 != nil {
err = err2
}
}()
url, err := i.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.assetRepo.Save(ctx, result); err != nil {
return
}
tx.Commit()
return
}
func (i *Asset) Remove(ctx context.Context, aid id.AssetID, operator *usecase.Operator) (result id.AssetID, err error) {
asset, err := i.assetRepo.FindByID(ctx, aid, operator.WritableTeams)
if err != nil {
return aid, err
}
tx, err := i.transaction.Begin()
if err != nil {
return
}
defer func() {
if err2 := tx.End(ctx); err == nil && err2 != nil {
err = err2
}
}()
team, err := i.teamRepo.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.file.RemoveAsset(ctx, url); err != nil {
return aid, err
}
}
if err = i.assetRepo.Remove(ctx, aid); err != nil {
return
}
tx.Commit()
return aid, nil
}