Skip to content

Commit dded94c

Browse files
committed
feat(porter): support feature flag
1 parent f5f25e9 commit dded94c

15 files changed

Lines changed: 184 additions & 139 deletions

File tree

app/porter/cmd/porter/main.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package main
33
import (
44
"os"
55

6+
"github.com/tuihub/librarian/app/porter/internal/biz/bizs3"
7+
"github.com/tuihub/librarian/app/porter/internal/biz/bizsteam"
68
"github.com/tuihub/librarian/internal/conf"
79
"github.com/tuihub/librarian/internal/lib/libapp"
10+
pb "github.com/tuihub/protos/pkg/librarian/porter/v1"
811

912
"github.com/go-kratos/kratos/v2"
1013
"github.com/go-kratos/kratos/v2/registry"
@@ -21,12 +24,12 @@ var (
2124
id, _ = os.Hostname() //nolint:gochecknoglobals //TODO
2225
)
2326

24-
func newApp(gs *grpc.Server, r registry.Registrar) *kratos.App {
27+
func newApp(gs *grpc.Server, r registry.Registrar, m metadata) *kratos.App {
2528
return kratos.New(
2629
kratos.ID(id),
2730
kratos.Name(name),
2831
kratos.Version(version),
29-
kratos.Metadata(map[string]string{}),
32+
kratos.Metadata(m),
3033
kratos.Server(gs),
3134
kratos.Registrar(r),
3235
)
@@ -52,3 +55,17 @@ func main() {
5255
panic(err)
5356
}
5457
}
58+
59+
type metadata map[string]string
60+
61+
func newMetadata(steam *bizsteam.SteamUseCase, s3 *bizs3.S3) metadata {
62+
v := "enable"
63+
res := metadata{}
64+
if steam.FeatureEnabled() {
65+
res[pb.FeatureFlag_name[int32(pb.FeatureFlag_FEATURE_FLAG_SOURCE_STEAM)]] = v
66+
}
67+
if s3.FeatureEnabled() {
68+
res[pb.FeatureFlag_name[int32(pb.FeatureFlag_FEATURE_FLAG_DEFAULT_DATA_STORAGE)]] = v
69+
}
70+
return res
71+
}

app/porter/cmd/porter/wire.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func wireApp(*conf.Porter_Server, *conf.Porter_Data, *libapp.Settings) (*kratos.
2626
client.ProviderSet,
2727
service.ProviderSet,
2828
libapp.ProviderSet,
29+
newMetadata,
2930
newApp,
3031
))
3132
}

app/porter/cmd/porter/wire_gen.go

Lines changed: 5 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/porter/internal/biz/bizs3/s3.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package bizs3
33
import (
44
"context"
55
"io"
6+
7+
"github.com/go-kratos/kratos/v2/errors"
68
)
79

810
type PutObject struct {
@@ -23,6 +25,7 @@ func (p *PutObject) Write(b []byte) (int, error) {
2325
}
2426

2527
type S3Repo interface {
28+
FeatureEnabled() bool
2629
PutObject(context.Context, io.Reader, Bucket, string) error
2730
}
2831

@@ -38,12 +41,22 @@ const (
3841
)
3942

4043
func NewS3(repo S3Repo) *S3 {
44+
if !repo.FeatureEnabled() {
45+
return new(S3)
46+
}
4147
return &S3{
4248
repo,
4349
}
4450
}
4551

52+
func (s *S3) FeatureEnabled() bool {
53+
return s.repo != nil
54+
}
55+
4656
func (s *S3) NewPushData(ctx context.Context, bucket Bucket, objectName string) (*PutObject, error) {
57+
if !s.FeatureEnabled() {
58+
return nil, errors.BadRequest("request disabled feature", "")
59+
}
4760
reader, writer := io.Pipe()
4861
ch := make(chan error)
4962
go func() {

app/porter/internal/biz/bizsteam/steam.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package bizsteam
22

33
import (
44
"context"
5-
"errors"
65
"fmt"
76
"strconv"
87
"strings"
98

109
"github.com/tuihub/librarian/app/porter/internal/client/steam"
1110
"github.com/tuihub/librarian/app/porter/internal/client/steam/model"
12-
"github.com/tuihub/librarian/app/porter/internal/data"
11+
12+
"github.com/go-kratos/kratos/v2/errors"
1313
)
1414

1515
type User struct {
@@ -58,16 +58,26 @@ type SteamUseCase struct {
5858
c *steam.Steam
5959
}
6060

61-
func NewSteamUseCase(client *steam.Steam, _ *data.Data) *SteamUseCase {
61+
func NewSteamUseCase(client *steam.Steam) *SteamUseCase {
62+
if !client.FeatureEnabled() {
63+
return new(SteamUseCase)
64+
}
6265
return &SteamUseCase{c: client}
6366
}
6467

68+
func (s *SteamUseCase) FeatureEnabled() bool {
69+
return s.c != nil
70+
}
71+
6572
func (s *SteamUseCase) GetUser(ctx context.Context, steamID string) (*User, error) {
73+
if !s.FeatureEnabled() {
74+
return nil, errors.BadRequest("request disabled feature", "")
75+
}
6676
id, err := strconv.ParseUint(steamID, 10, 64)
6777
if err != nil {
6878
return nil, err
6979
}
70-
resp, err := s.c.WebAPI.GetPlayerSummary(ctx, model.GetPlayerSummariesRequest{
80+
resp, err := s.c.GetPlayerSummary(ctx, model.GetPlayerSummariesRequest{
7181
SteamID: id,
7282
})
7383
if err != nil {
@@ -82,11 +92,14 @@ func (s *SteamUseCase) GetUser(ctx context.Context, steamID string) (*User, erro
8292
}
8393

8494
func (s *SteamUseCase) GetOwnedGames(ctx context.Context, steamID string) ([]*App, error) {
95+
if !s.FeatureEnabled() {
96+
return nil, errors.BadRequest("request disabled feature", "")
97+
}
8598
id, err := strconv.ParseUint(steamID, 10, 64)
8699
if err != nil {
87100
return nil, err
88101
}
89-
resp, err := s.c.WebAPI.GetOwnedGames(ctx, model.GetOwnedGamesRequest{
102+
resp, err := s.c.GetOwnedGames(ctx, model.GetOwnedGamesRequest{
90103
SteamID: id,
91104
IncludeAppInfo: true,
92105
IncludePlayedFreeGames: true,
@@ -117,7 +130,10 @@ func (s *SteamUseCase) GetOwnedGames(ctx context.Context, steamID string) ([]*Ap
117130
}
118131

119132
func (s *SteamUseCase) GetAppDetails(ctx context.Context, appID int) (*App, error) {
120-
resp, err := s.c.StoreAPI.GetAppDetails(ctx, model.GetAppDetailsRequest{
133+
if !s.FeatureEnabled() {
134+
return nil, errors.BadRequest("request disabled feature", "")
135+
}
136+
resp, err := s.c.GetAppDetails(ctx, model.GetAppDetailsRequest{
121137
AppIDs: []int{appID},
122138
CountryCode: "",
123139
Language: "",
@@ -126,7 +142,7 @@ func (s *SteamUseCase) GetAppDetails(ctx context.Context, appID int) (*App, erro
126142
return nil, err
127143
}
128144
if len(resp) != 1 {
129-
return nil, errors.New("unexpected result")
145+
return nil, errors.InternalServer("unexpected result", "")
130146
}
131147
var res *App
132148
for _, app := range resp {
Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,37 @@
11
package steam
22

3-
import "github.com/google/wire"
3+
import (
4+
"github.com/tuihub/librarian/internal/conf"
5+
6+
"github.com/gocolly/colly/v2"
7+
"github.com/google/wire"
8+
)
49

510
var ProviderSet = wire.NewSet(NewSteam, NewStoreAPI, NewWebAPI)
611

712
type Steam struct {
8-
StoreAPI *StoreAPI
9-
WebAPI *WebAPI
13+
*StoreAPI
14+
*WebAPI
1015
}
1116

12-
func NewSteam(s *StoreAPI, w *WebAPI) *Steam {
17+
func NewSteam(c *colly.Collector, config *conf.Porter_Data) (*Steam, error) {
18+
if c == nil || config == nil || config.Steam == nil {
19+
return new(Steam), nil
20+
}
21+
s, err := NewStoreAPI(c)
22+
if err != nil {
23+
return nil, err
24+
}
25+
w, err := NewWebAPI(c, config.Steam)
26+
if err != nil {
27+
return nil, err
28+
}
1329
return &Steam{
1430
StoreAPI: s,
1531
WebAPI: w,
16-
}
32+
}, nil
33+
}
34+
35+
func (s *Steam) FeatureEnabled() bool {
36+
return s.StoreAPI != nil && s.WebAPI != nil
1737
}

app/porter/internal/client/steam/steam_test.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,13 @@ func getAppID() int {
3232
}
3333

3434
func TestWebAPI_GetPlayerSummary(t *testing.T) {
35-
r, _ := steam.NewWebAPI(client.NewColly(), &conf.Porter_Data{
36-
S3: nil,
37-
Steam: &conf.Porter_Data_Steam{ApiKey: getAPIKey()},
38-
})
35+
r, _ := steam.NewWebAPI(client.NewColly(), &conf.Porter_Data_Steam{ApiKey: getAPIKey()})
3936
res, err := r.GetPlayerSummary(context.Background(), model.GetPlayerSummariesRequest{SteamID: getSteamID()})
4037
logger.Infof("res %+v, err: %+v", res, err)
4138
}
4239

4340
func TestWebAPI_GetOwnedGames(t *testing.T) {
44-
r, _ := steam.NewWebAPI(client.NewColly(), &conf.Porter_Data{
45-
S3: nil,
46-
Steam: &conf.Porter_Data_Steam{ApiKey: getAPIKey()},
47-
})
41+
r, _ := steam.NewWebAPI(client.NewColly(), &conf.Porter_Data_Steam{ApiKey: getAPIKey()})
4842
res, err := r.GetOwnedGames(context.Background(), model.GetOwnedGamesRequest{
4943
SteamID: getSteamID(),
5044
IncludeAppInfo: false,

app/porter/internal/client/steam/web_api.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type WebAPI struct {
2020
c *colly.Collector
2121
}
2222

23-
func NewWebAPI(c *colly.Collector, config *conf.Porter_Data) (*WebAPI, error) {
23+
func NewWebAPI(c *colly.Collector, config *conf.Porter_Data_Steam) (*WebAPI, error) {
2424
err := c.Limit(&colly.LimitRule{
2525
DomainRegexp: "",
2626
DomainGlob: "*api.steampowered.com*",
@@ -32,7 +32,7 @@ func NewWebAPI(c *colly.Collector, config *conf.Porter_Data) (*WebAPI, error) {
3232
return nil, err
3333
}
3434
return &WebAPI{
35-
key: config.Steam.ApiKey,
35+
key: config.GetApiKey(),
3636
c: c,
3737
}, nil
3838
}

app/porter/internal/data/data.go

Lines changed: 1 addition & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,8 @@
11
package data
22

33
import (
4-
"context"
5-
"errors"
6-
7-
"github.com/tuihub/librarian/app/porter/internal/biz/bizs3"
8-
"github.com/tuihub/librarian/internal/conf"
9-
"github.com/tuihub/librarian/internal/lib/logger"
10-
114
"github.com/google/wire"
12-
"github.com/minio/minio-go/v7"
13-
"github.com/minio/minio-go/v7/pkg/credentials"
145
)
156

167
// ProviderSet is data providers.
17-
var ProviderSet = wire.NewSet(NewData, NewS3Repo)
18-
19-
// Data .
20-
type Data struct {
21-
mc *minio.Client
22-
buckets map[bizs3.Bucket]string
23-
}
24-
25-
// NewData .
26-
func NewData(c *conf.Porter_Data) (*Data, error) {
27-
if c.S3 == nil {
28-
return nil, errors.New("missing s3 config")
29-
}
30-
minioClient, err := minio.New(c.S3.EndPoint, &minio.Options{
31-
Creds: credentials.NewStaticV4(c.S3.AccessKey, c.S3.SecretKey, ""),
32-
Secure: c.S3.UseSsl,
33-
Transport: nil,
34-
Region: "",
35-
BucketLookup: 0,
36-
TrailingHeaders: false,
37-
CustomMD5: nil,
38-
CustomSHA256: nil,
39-
})
40-
if err != nil {
41-
return nil, err
42-
}
43-
44-
bucketName := defaultBucketName()
45-
location := "us-east-1"
46-
for i, v := range bucketName {
47-
if i == bizs3.BucketUnspecified {
48-
continue
49-
}
50-
if err = initBucket(minioClient, v, location); err != nil {
51-
return nil, err
52-
}
53-
}
54-
55-
return &Data{
56-
mc: minioClient,
57-
buckets: bucketName,
58-
}, nil
59-
}
60-
61-
func initBucket(mc *minio.Client, bucketName, location string) error {
62-
err := mc.MakeBucket(
63-
context.Background(),
64-
bucketName,
65-
minio.MakeBucketOptions{
66-
Region: location,
67-
ObjectLocking: false,
68-
},
69-
)
70-
if err != nil {
71-
// Check to see if we already own this bucket (which happens if you run this twice)
72-
exists, errBucketExists := mc.BucketExists(context.Background(), bucketName)
73-
if errBucketExists == nil && exists {
74-
logger.Infof("We already own %s\n", bucketName)
75-
} else {
76-
logger.Error(err)
77-
return err
78-
}
79-
} else {
80-
logger.Infof("Successfully created %s\n", bucketName)
81-
}
82-
return nil
83-
}
84-
85-
func defaultBucketName() map[bizs3.Bucket]string {
86-
return map[bizs3.Bucket]string{
87-
bizs3.BucketUnspecified: "",
88-
bizs3.BucketDefault: "default",
89-
}
90-
}
8+
var ProviderSet = wire.NewSet(NewS3Repo)

0 commit comments

Comments
 (0)