mirror of
https://github.com/mxpv/podsync.git
synced 2024-05-11 05:55:04 +00:00
Downgrade feed if delete pledge
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/emicklei/go-restful/log"
|
||||
"github.com/go-pg/pg"
|
||||
itunes "github.com/mxpv/podcast"
|
||||
"github.com/mxpv/podsync/pkg/api"
|
||||
@@ -130,6 +131,30 @@ func (s Service) GetMetadata(hashID string) (*api.Metadata, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s Service) Downgrade(patronID string, featureLevel int) error {
|
||||
log.Printf("Downgrading patron '%s' to feature level %d", patronID, featureLevel)
|
||||
|
||||
if featureLevel == api.DefaultFeatures {
|
||||
res, err := s.db.
|
||||
Model(&model.Feed{}).
|
||||
Set("page_size = ?", 50).
|
||||
Set("feature_level = ?", 0).
|
||||
Set("format = ?", api.FormatVideo).
|
||||
Set("quality = ?", api.QualityHigh).Where("user_id = ?", patronID).
|
||||
Update()
|
||||
|
||||
if err != nil {
|
||||
log.Printf("failed to downgrade patron '%s' to feature level %d: %v", patronID, featureLevel, err)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("Updated %d feed(s) of user '%s' to feature level %d", res.RowsAffected(), patronID, featureLevel)
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("unsupported downgrade type")
|
||||
}
|
||||
|
||||
type feedOption func(*Service)
|
||||
|
||||
//noinspection GoExportedFuncWithUnexportedType
|
||||
|
@@ -77,6 +77,37 @@ func TestService_GetMetadata(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestService_DowngradeToAnonymous(t *testing.T) {
|
||||
s := Service{db: createDatabase(t)}
|
||||
|
||||
feed := &model.Feed{
|
||||
HashID: "123456",
|
||||
UserID: "123456",
|
||||
ItemID: "123456",
|
||||
Provider: api.ProviderVimeo,
|
||||
LinkType: api.LinkTypeGroup,
|
||||
PageSize: 150,
|
||||
Quality: api.QualityLow,
|
||||
Format: api.FormatAudio,
|
||||
FeatureLevel: api.ExtendedFeatures,
|
||||
}
|
||||
|
||||
err := s.db.Insert(feed)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = s.Downgrade(feed.UserID, api.DefaultFeatures)
|
||||
require.NoError(t, err)
|
||||
|
||||
downgraded := &model.Feed{FeedID: feed.FeedID}
|
||||
err = s.db.Select(downgraded)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, 50, downgraded.PageSize)
|
||||
require.Equal(t, api.QualityHigh, downgraded.Quality)
|
||||
require.Equal(t, api.FormatVideo, downgraded.Format)
|
||||
require.Equal(t, api.DefaultFeatures, downgraded.FeatureLevel)
|
||||
}
|
||||
|
||||
func createDatabase(t *testing.T) *pg.DB {
|
||||
opts, err := pg.ParseURL("postgres://postgres:@localhost/podsync?sslmode=disable")
|
||||
if err != nil {
|
||||
|
@@ -26,6 +26,7 @@ type feedService interface {
|
||||
CreateFeed(req *api.CreateFeedRequest, identity *api.Identity) (string, error)
|
||||
BuildFeed(hashID string) (*itunes.Podcast, error)
|
||||
GetMetadata(hashId string) (*api.Metadata, error)
|
||||
Downgrade(patronID string, featureLevel int) error
|
||||
}
|
||||
|
||||
type patreonService interface {
|
||||
@@ -230,6 +231,13 @@ func (h handler) webhook(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
if eventName == patreon.EventDeletePledge {
|
||||
if err := h.feed.Downgrade(pledge.Data.Relationships.Patron.Data.ID, api.DefaultFeatures); err != nil {
|
||||
log.Printf("downgrade failed: %v", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("sucessfully processed patreon event %s (%s)", pledge.Data.ID, eventName)
|
||||
}
|
||||
|
||||
|
@@ -73,6 +73,18 @@ func (_mr *MockfeedServiceMockRecorder) GetMetadata(arg0 interface{}) *gomock.Ca
|
||||
return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "GetMetadata", reflect.TypeOf((*MockfeedService)(nil).GetMetadata), arg0)
|
||||
}
|
||||
|
||||
// Downgrade mocks base method
|
||||
func (_m *MockfeedService) Downgrade(patronID string, featureLevel int) error {
|
||||
ret := _m.ctrl.Call(_m, "Downgrade", patronID, featureLevel)
|
||||
ret0, _ := ret[0].(error)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// Downgrade indicates an expected call of Downgrade
|
||||
func (_mr *MockfeedServiceMockRecorder) Downgrade(arg0, arg1 interface{}) *gomock.Call {
|
||||
return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "Downgrade", reflect.TypeOf((*MockfeedService)(nil).Downgrade), arg0, arg1)
|
||||
}
|
||||
|
||||
// MockpatreonService is a mock of patreonService interface
|
||||
type MockpatreonService struct {
|
||||
ctrl *gomock.Controller
|
||||
|
Reference in New Issue
Block a user