From 4ca6d8bcc666b2510ba9e01ec2516951ad3453f2 Mon Sep 17 00:00:00 2001 From: Maksym Pavlenko Date: Sun, 20 Aug 2017 18:35:47 -0700 Subject: [PATCH] Detect feature level --- Gopkg.toml | 6 +++++- pkg/feeds/feeds.go | 17 +++++++++++++-- pkg/server/server.go | 38 +++++++++++++++++++++++++++++----- pkg/server/server_mock_test.go | 5 ++--- pkg/server/server_test.go | 2 +- 5 files changed, 56 insertions(+), 12 deletions(-) diff --git a/Gopkg.toml b/Gopkg.toml index c280986..1876b59 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -13,4 +13,8 @@ [[constraint]] name = "github.com/gin-contrib/sessions" - revision = "a71ea9167c616cf9f02bc928ed08bc390c8279bc" \ No newline at end of file + revision = "a71ea9167c616cf9f02bc928ed08bc390c8279bc" + +[[constraint]] + name = "github.com/mxpv/patreon-go" + version = "1.2" \ No newline at end of file diff --git a/pkg/feeds/feeds.go b/pkg/feeds/feeds.go index 9188d7d..0e46f79 100644 --- a/pkg/feeds/feeds.go +++ b/pkg/feeds/feeds.go @@ -1,7 +1,6 @@ package feeds import ( - "context" "fmt" "time" @@ -10,13 +9,17 @@ import ( "github.com/pkg/errors" ) +const ( + maxPageSize = 150 +) + type service struct { id id storage storage builders map[api.Provider]builder } -func (s *service) CreateFeed(ctx context.Context, req *api.CreateFeedRequest) (string, error) { +func (s *service) CreateFeed(req *api.CreateFeedRequest, identity *api.Identity) (string, error) { feed, err := parseURL(req.URL) if err != nil { return "", errors.Wrapf(err, "failed to create feed for URL: %s", req.URL) @@ -35,6 +38,16 @@ func (s *service) CreateFeed(ctx context.Context, req *api.CreateFeedRequest) (s feed.FeatureLevel = api.DefaultFeatures feed.LastAccess = time.Now().UTC() + if identity.FeatureLevel > 0 { + feed.Quality = req.Quality + feed.Format = req.Format + feed.FeatureLevel = identity.FeatureLevel + feed.PageSize = req.PageSize + if feed.PageSize > maxPageSize { + feed.PageSize = maxPageSize + } + } + // Generate short id hashId, err := s.id.Generate(feed) if err != nil { diff --git a/pkg/server/server.go b/pkg/server/server.go index b650293..e3cc9b8 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1,7 +1,6 @@ package server import ( - "context" "crypto/rand" "encoding/base64" "encoding/json" @@ -26,7 +25,7 @@ const ( ) type feed interface { - CreateFeed(ctx context.Context, req *api.CreateFeedRequest) (string, error) + CreateFeed(req *api.CreateFeedRequest, identity *api.Identity) (string, error) GetFeed(hashId string) (*itunes.Podcast, error) GetMetadata(hashId string) (*api.Feed, error) } @@ -116,18 +115,32 @@ func MakeHandlers(feed feed, cfg *config.AppConfig) http.Handler { client := patreon.NewClient(tc) // Query user info from Patreon - user, err := client.FetchUser(patreon.WithIncludes(patreon.UserDefaultRelations)) + user, err := client.FetchUser() if err != nil { c.String(http.StatusInternalServerError, err.Error()) return } + // Determine feature level + level := api.DefaultFeatures + amount := 0 + for _, item := range user.Included.Items { + pledge, ok := item.(*patreon.Pledge) + if ok { + amount += pledge.Attributes.AmountCents + } + } + + if amount >= 100 { + level = api.ExtendedFeatures + } + identity := &api.Identity{ UserId: user.Data.Id, FullName: user.Data.Attributes.FullName, Email: user.Data.Attributes.Email, ProfileURL: user.Data.Attributes.URL, - FeatureLevel: api.ExtendedFeatures, + FeatureLevel: level, } // Serialize identity and return cookies @@ -158,7 +171,22 @@ func MakeHandlers(feed feed, cfg *config.AppConfig) http.Handler { return } - hashId, err := feed.CreateFeed(c.Request.Context(), req) + s := sessions.Default(c) + + identity := &api.Identity{ + FeatureLevel: api.DefaultFeatures, + } + + buf, ok := s.Get(identitySessionKey).(string) + if ok { + // We are failed to deserialize Identity structure, do cleanup, force user to login again + if err := json.Unmarshal([]byte(buf), identity); err != nil { + s.Clear() + s.Save() + } + } + + hashId, err := feed.CreateFeed(req, identity) if err != nil { c.JSON(internalError(err)) return diff --git a/pkg/server/server_mock_test.go b/pkg/server/server_mock_test.go index c7644f3..a808718 100644 --- a/pkg/server/server_mock_test.go +++ b/pkg/server/server_mock_test.go @@ -4,7 +4,6 @@ package server import ( - context "context" gomock "github.com/golang/mock/gomock" podcast "github.com/mxpv/podcast" api "github.com/mxpv/podsync/pkg/api" @@ -35,8 +34,8 @@ func (_m *Mockfeed) EXPECT() *MockfeedMockRecorder { } // CreateFeed mocks base method -func (_m *Mockfeed) CreateFeed(ctx context.Context, req *api.CreateFeedRequest) (string, error) { - ret := _m.ctrl.Call(_m, "CreateFeed", ctx, req) +func (_m *Mockfeed) CreateFeed(req *api.CreateFeedRequest, identity *api.Identity) (string, error) { + ret := _m.ctrl.Call(_m, "CreateFeed", req, identity) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 1be635b..ca83574 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -30,7 +30,7 @@ func TestCreateFeed(t *testing.T) { } feed := NewMockfeed(ctrl) - feed.EXPECT().CreateFeed(gomock.Any(), gomock.Eq(req)).Times(1).Return("456", nil) + feed.EXPECT().CreateFeed(gomock.Eq(req), gomock.Any()).Times(1).Return("456", nil) srv := httptest.NewServer(MakeHandlers(feed, cfg)) defer srv.Close()