Skip to content

Commit b662f76

Browse files
committed
refactor: update storage interfaces and methods for improved consistency and clarity
Signed-off-by: tbxark <[email protected]>
1 parent b359488 commit b662f76

File tree

13 files changed

+92
-69
lines changed

13 files changed

+92
-69
lines changed

layout/cmd/app/wire_gen.go

+7-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

layout/go.sum

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
109109
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
110110
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
111111
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
112+
github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE=
112113
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
113114
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
114115
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=

layout/internal/pkg/render/render.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
type Render struct {
9-
cdn storage.URLHandler
9+
cdn storage.ImageURLHandler
1010
db *dao.Dao
1111
hidePrivacy bool
1212
}
@@ -17,6 +17,6 @@ const (
1717
ImageWidthForCommon = 1024
1818
)
1919

20-
func NewRender(cdn storage.URLHandler, db *dao.Dao, hidePrivacy bool) *Render {
20+
func NewRender(cdn storage.ImageURLHandler, db *dao.Dao, hidePrivacy bool) *Render {
2121
return &Render{cdn: cdn, db: db, hidePrivacy: hidePrivacy}
2222
}

layout/internal/service/api/service.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ type TokenAuthorizer = authorizer.TokenAuthorizer[authorizer.RBACClaims[int64]]
1616
type Service struct {
1717
authorizer.ContextUtils[int64]
1818
DB *dao.Dao
19-
Storage storage.Storage
19+
Storage storage.ImageStorage
2020
Cache cache.ByteCache
2121
Wechat *wechat.Wechat
2222
Render *render.Render
2323
Authorizer TokenAuthorizer
2424
httpClient *http.Client
2525
}
2626

27-
func NewService(db *dao.Dao, wx *wechat.Wechat, store storage.Storage, cache cache.ByteCache) *Service {
27+
func NewService(db *dao.Dao, wx *wechat.Wechat, store storage.ImageStorage, cache cache.ByteCache) *Service {
2828
return &Service{
2929
DB: db,
3030
Storage: store,

layout/internal/service/api/user.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import (
99
"github.com/TBXark/sphere/layout/internal/pkg/database/ent/user"
1010
"github.com/TBXark/sphere/server/statuserr"
1111
"github.com/TBXark/sphere/storage"
12+
"net/http"
1213
"net/url"
1314
"strconv"
1415
"strings"
16+
"time"
1517
)
1618

1719
var _ apiv1.UserServiceHTTPServer = (*Service)(nil)
@@ -117,7 +119,13 @@ func (s *Service) uploadRemoteImage(ctx context.Context, uri string) (string, er
117119
return "", err
118120
}
119121
key = storage.DefaultKeyBuilder(strconv.Itoa(int(id)))(uri, "user")
120-
resp, err := s.httpClient.Get(uri)
122+
ctx, cancel := context.WithTimeout(ctx, time.Minute)
123+
defer cancel()
124+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
125+
if err != nil {
126+
return "", err
127+
}
128+
resp, err := s.httpClient.Do(req)
121129
if err != nil {
122130
return "", err
123131
}
@@ -129,5 +137,5 @@ func (s *Service) uploadRemoteImage(ctx context.Context, uri string) (string, er
129137
if err != nil {
130138
return "", err
131139
}
132-
return ret.Key, nil
140+
return ret, nil
133141
}

layout/internal/service/dash/service.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type TokenAuthorizer = authorizer.TokenAuthorizer[authorizer.RBACClaims[int64]]
2121
type Service struct {
2222
authorizer.ContextUtils[int64]
2323
DB *dao.Dao
24-
Storage storage.Storage
24+
Storage storage.ImageStorage
2525
Cache cache.ByteCache
2626
WeChat *wechat.Wechat
2727
Render *render.Render
@@ -32,7 +32,7 @@ type Service struct {
3232
ACL *acl.ACL
3333
}
3434

35-
func NewService(db *dao.Dao, wx *wechat.Wechat, store storage.Storage, cache cache.ByteCache) *Service {
35+
func NewService(db *dao.Dao, wx *wechat.Wechat, store storage.ImageStorage, cache cache.ByteCache) *Service {
3636
return &Service{
3737
DB: db,
3838
Storage: store,

layout/internal/service/shared/service.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import (
77

88
type Service struct {
99
authorizer.ContextUtils[int64]
10-
Storage storage.Storage
10+
Storage storage.ImageStorage
1111
StorageDir string
1212
}
1313

14-
func NewService(store storage.Storage, storageDir string) *Service {
14+
func NewService(store storage.ImageStorage, storageDir string) *Service {
1515
return &Service{
1616
Storage: store,
1717
StorageDir: storageDir,

layout/internal/service/shared/storage.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@ func (s *Service) UploadToken(ctx context.Context, req *sharedv1.UploadTokenRequ
1818
if err != nil {
1919
return nil, err
2020
}
21-
token := s.Storage.GenerateUploadToken(req.Filename, s.StorageDir, storage.DefaultKeyBuilder(strconv.Itoa(int(id))))
21+
token, err := s.Storage.GenerateUploadToken(req.Filename, s.StorageDir, storage.DefaultKeyBuilder(strconv.Itoa(int(id))))
22+
if err != nil {
23+
return nil, err
24+
}
2225
return &sharedv1.UploadTokenResponse{
23-
Token: token.Token,
24-
Key: token.Key,
25-
Url: token.URL,
26+
Token: token[0],
27+
Key: token[1],
28+
Url: token[2],
2629
}, nil
2730
}

layout/internal/wire.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var cacheSet = wire.NewSet(
2121

2222
var storageSet = wire.NewSet(
2323
qiniu.NewClient,
24-
wire.Bind(new(storage.Storage), new(*qiniu.Client)),
24+
wire.Bind(new(storage.ImageStorage), new(*qiniu.Client)),
2525
)
2626

2727
var ProviderSet = wire.NewSet(

storage/models/model.go

-11
This file was deleted.

storage/qiniu/qiniu.go

+12-17
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"crypto/md5"
66
"encoding/hex"
77
"fmt"
8-
"github.com/TBXark/sphere/storage/models"
98
"github.com/qiniu/go-sdk/v7/auth/qbox"
109
"github.com/qiniu/go-sdk/v7/storage"
1110
"io"
@@ -110,7 +109,7 @@ func (n *Client) ExtractKeyFromURL(uri string) string {
110109
return key
111110
}
112111

113-
func (n *Client) GenerateUploadToken(fileName string, dir string, nameBuilder func(fileName string, dir ...string) string) models.FileUploadToken {
112+
func (n *Client) GenerateUploadToken(fileName string, dir string, nameBuilder func(fileName string, dir ...string) string) ([3]string, error) {
114113
fileExt := path.Ext(fileName)
115114
sum := md5.Sum([]byte(fileName))
116115
nameMd5 := hex.EncodeToString(sum[:])
@@ -121,14 +120,14 @@ func (n *Client) GenerateUploadToken(fileName string, dir string, nameBuilder fu
121120
InsertOnly: 1,
122121
MimeLimit: "image/*;video/*",
123122
}
124-
return models.FileUploadToken{
125-
Token: put.UploadToken(n.mac),
126-
Key: key,
127-
URL: n.GenerateURL(key),
128-
}
123+
return [3]string{
124+
put.UploadToken(n.mac),
125+
key,
126+
n.GenerateURL(key),
127+
}, nil
129128
}
130129

131-
func (n *Client) UploadFile(ctx context.Context, file io.Reader, size int64, key string) (*models.FileUploadResult, error) {
130+
func (n *Client) UploadFile(ctx context.Context, file io.Reader, size int64, key string) (string, error) {
132131
put := &storage.PutPolicy{
133132
Scope: n.config.Bucket,
134133
}
@@ -139,14 +138,12 @@ func (n *Client) UploadFile(ctx context.Context, file io.Reader, size int64, key
139138
key = strings.TrimPrefix(key, "/")
140139
err := formUploader.Put(ctx, &ret, upToken, key, file, size, nil)
141140
if err != nil {
142-
return nil, err
141+
return "", err
143142
}
144-
return &models.FileUploadResult{
145-
Key: ret.Key,
146-
}, nil
143+
return ret.Key, nil
147144
}
148145

149-
func (n *Client) UploadLocalFile(ctx context.Context, file string, key string) (*models.FileUploadResult, error) {
146+
func (n *Client) UploadLocalFile(ctx context.Context, file string, key string) (string, error) {
150147
put := &storage.PutPolicy{
151148
Scope: n.config.Bucket,
152149
}
@@ -157,11 +154,9 @@ func (n *Client) UploadLocalFile(ctx context.Context, file string, key string) (
157154
key = strings.TrimPrefix(key, "/")
158155
err := formUploader.PutFile(ctx, &ret, upToken, key, file, nil)
159156
if err != nil {
160-
return nil, err
157+
return "", err
161158
}
162-
return &models.FileUploadResult{
163-
Key: ret.Key,
164-
}, nil
159+
return ret.Key, nil
165160
}
166161

167162
func (n *Client) DownloadFile(ctx context.Context, key string) (io.ReadCloser, error) {

storage/s3/s3.go

+32-13
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ package s3
22

33
import (
44
"context"
5+
"crypto/md5"
6+
"encoding/hex"
57
"fmt"
68
"github.com/TBXark/sphere/log"
7-
"github.com/TBXark/sphere/storage/models"
89
"io"
910
"net/url"
11+
"path"
1012
"strings"
13+
"time"
1114

1215
"github.com/minio/minio-go/v7"
1316
"github.com/minio/minio-go/v7/pkg/credentials"
@@ -86,8 +89,7 @@ func (s *Client) ExtractKeyFromURLWithMode(uri string, strict bool) (string, err
8689
}
8790
return uri, nil
8891
}
89-
path := strings.TrimPrefix(u.Path, "/")
90-
parts := strings.SplitN(path, "/", 2)
92+
parts := strings.SplitN(strings.TrimPrefix(u.Path, "/"), "/", 2)
9193
if len(parts) != 2 || parts[0] != s.config.Bucket {
9294
if strict {
9395
return "", fmt.Errorf("invalid url")
@@ -97,24 +99,41 @@ func (s *Client) ExtractKeyFromURLWithMode(uri string, strict bool) (string, err
9799
return parts[1], nil
98100
}
99101

100-
func (s *Client) UploadFile(ctx context.Context, file io.Reader, size int64, key string) (*models.FileUploadResult, error) {
101-
info, err := s.client.PutObject(ctx, s.config.Bucket, key, file, size, minio.PutObjectOptions{})
102+
func (s *Client) GenerateUploadToken(fileName string, dir string, nameBuilder func(filename string, dir ...string) string) ([3]string, error) {
103+
fileExt := path.Ext(fileName)
104+
sum := md5.Sum([]byte(fileName))
105+
nameMd5 := hex.EncodeToString(sum[:])
106+
key := nameBuilder(nameMd5+fileExt, dir)
107+
key = strings.TrimPrefix(key, "/")
108+
109+
preSignedURL, err := s.client.PresignedPutObject(context.Background(),
110+
s.config.Bucket,
111+
key,
112+
time.Hour)
102113
if err != nil {
103-
return nil, err
114+
return [3]string{}, err
104115
}
105-
return &models.FileUploadResult{
106-
Key: info.Key,
116+
return [3]string{
117+
preSignedURL.String(),
118+
key,
119+
s.GenerateURL(key),
107120
}, nil
108121
}
109122

110-
func (s *Client) UploadLocalFile(ctx context.Context, file string, key string) (*models.FileUploadResult, error) {
123+
func (s *Client) UploadFile(ctx context.Context, file io.Reader, size int64, key string) (string, error) {
124+
info, err := s.client.PutObject(ctx, s.config.Bucket, key, file, size, minio.PutObjectOptions{})
125+
if err != nil {
126+
return "", err
127+
}
128+
return info.Key, nil
129+
}
130+
131+
func (s *Client) UploadLocalFile(ctx context.Context, file string, key string) (string, error) {
111132
info, err := s.client.FPutObject(ctx, s.config.Bucket, key, file, minio.PutObjectOptions{})
112133
if err != nil {
113-
return nil, err
134+
return "", err
114135
}
115-
return &models.FileUploadResult{
116-
Key: info.Key,
117-
}, nil
136+
return info.Key, nil
118137
}
119138

120139
func (s *Client) DownloadFile(ctx context.Context, key string) (io.ReadCloser, error) {

storage/storage.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,28 @@ package storage
22

33
import (
44
"context"
5-
"github.com/TBXark/sphere/storage/models"
65
"io"
76
)
87

98
type URLHandler interface {
109
GenerateURL(key string) string
1110
GenerateURLs(keys []string) []string
12-
GenerateImageURL(key string, width int) string
1311
ExtractKeyFromURL(uri string) string
1412
ExtractKeyFromURLWithMode(uri string, strict bool) (string, error)
1513
}
1614

15+
type ImageURLHandler interface {
16+
GenerateImageURL(key string, width int) string
17+
}
18+
1719
type TokenGenerator interface {
18-
GenerateUploadToken(fileName string, dir string, nameBuilder func(filename string, dir ...string) string) models.FileUploadToken
20+
// GenerateUploadToken [token, key, url]
21+
GenerateUploadToken(fileName string, dir string, nameBuilder func(filename string, dir ...string) string) ([3]string, error)
1922
}
2023

2124
type FileUploader interface {
22-
UploadFile(ctx context.Context, file io.Reader, size int64, key string) (*models.FileUploadResult, error)
23-
UploadLocalFile(ctx context.Context, file string, key string) (*models.FileUploadResult, error)
25+
UploadFile(ctx context.Context, file io.Reader, size int64, key string) (string, error)
26+
UploadLocalFile(ctx context.Context, file string, key string) (string, error)
2427
}
2528

2629
type FileDownloader interface {
@@ -29,7 +32,12 @@ type FileDownloader interface {
2932

3033
type Storage interface {
3134
URLHandler
32-
TokenGenerator
3335
FileUploader
3436
FileDownloader
37+
TokenGenerator
38+
}
39+
40+
type ImageStorage interface {
41+
Storage
42+
ImageURLHandler
3543
}

0 commit comments

Comments
 (0)