diff --git a/pkg/handler/handler.go b/pkg/handler/handler.go index 5a4f930..117a956 100644 --- a/pkg/handler/handler.go +++ b/pkg/handler/handler.go @@ -16,12 +16,11 @@ import ( "github.com/mxpv/podsync/pkg/api" "github.com/mxpv/podsync/pkg/config" "github.com/mxpv/podsync/pkg/session" - "github.com/mxpv/podsync/pkg/webhook" + "github.com/mxpv/podsync/pkg/support" "golang.org/x/oauth2" ) const ( - creatorID = "2822191" maxHashIDLength = 16 ) @@ -32,10 +31,10 @@ type feed interface { } type handler struct { - feed feed - cfg *config.AppConfig - oauth2 oauth2.Config - hook *webhook.Handler + feed feed + cfg *config.AppConfig + oauth2 oauth2.Config + patreon *support.Patreon } func (h handler) index(c *gin.Context) { @@ -90,24 +89,7 @@ func (h handler) patreonCallback(c *gin.Context) { } // Determine feature level - level := api.DefaultFeatures - - if user.Data.ID == creatorID { - level = api.PodcasterFeature - } else { - pledge, err := h.hook.FindPledge(user.Data.ID) - if err != nil { - log.Printf("! can't find pledge for user %s: %v", user.Data.ID, err) - } else { - // Check pledge is valid - if pledge.DeclinedSince.IsZero() && !pledge.IsPaused { - // Check the amount of pledge - if pledge.AmountCents >= 100 { - level = api.ExtendedFeatures - } - } - } - } + level := h.patreon.GetFeatureLevel(user.Data.ID) identity := &api.Identity{ UserId: user.Data.ID, @@ -236,7 +218,7 @@ func (h handler) webhook(c *gin.Context) { return } - if err := h.hook.Handle(&pledge.Data, eventName); err != nil { + if err := h.patreon.Hook(&pledge.Data, eventName); err != nil { log.Printf("failed to process patreon event %s (%s): %v", pledge.Data.ID, eventName, err) c.JSON(internalError(err)) return @@ -265,9 +247,9 @@ func New(feed feed, db *pg.DB, cfg *config.AppConfig) http.Handler { } h := handler{ - feed: feed, - cfg: cfg, - hook: webhook.NewHookHandler(db), + feed: feed, + cfg: cfg, + patreon: support.NewPatreon(db), } // OAuth 2 configuration diff --git a/pkg/webhook/hook.go b/pkg/support/patreon.go similarity index 67% rename from pkg/webhook/hook.go rename to pkg/support/patreon.go index e459e3c..75e155a 100644 --- a/pkg/webhook/hook.go +++ b/pkg/support/patreon.go @@ -1,20 +1,26 @@ -package webhook +package support import ( "fmt" + "log" "strconv" "github.com/go-pg/pg" "github.com/mxpv/patreon-go" + "github.com/mxpv/podsync/pkg/api" "github.com/mxpv/podsync/pkg/models" "github.com/pkg/errors" ) -type Handler struct { +const ( + creatorID = "2822191" +) + +type Patreon struct { db *pg.DB } -func (h Handler) toModel(pledge *patreon.Pledge) (*models.Pledge, error) { +func (h Patreon) toModel(pledge *patreon.Pledge) (*models.Pledge, error) { pledgeID, err := strconv.ParseInt(pledge.ID, 10, 64) if err != nil { return nil, errors.Wrapf(err, "failed to parse pledge id: %s", pledge.ID) @@ -56,7 +62,7 @@ func (h Handler) toModel(pledge *patreon.Pledge) (*models.Pledge, error) { return model, nil } -func (h Handler) Handle(pledge *patreon.Pledge, event string) error { +func (h Patreon) Hook(pledge *patreon.Pledge, event string) error { model, err := h.toModel(pledge) if err != nil { return err @@ -79,11 +85,37 @@ func (h Handler) Handle(pledge *patreon.Pledge, event string) error { } } -func (h Handler) FindPledge(patronID string) (*models.Pledge, error) { +func (h Patreon) FindPledge(patronID string) (*models.Pledge, error) { p := &models.Pledge{} return p, h.db.Model(p).Where("patron_id = ?", patronID).Limit(1).Select() } -func NewHookHandler(db *pg.DB) *Handler { - return &Handler{db: db} +func (h Patreon) GetFeatureLevel(patronID string) (level int) { + level = api.DefaultFeatures + + if patronID == creatorID { + level = api.PodcasterFeature + return + } + + pledge, err := h.FindPledge(patronID) + if err != nil { + log.Printf("! can't find pledge for user %s: %v", patronID, err) + return + } + + // Check pledge is valid + if pledge.DeclinedSince.IsZero() && !pledge.IsPaused { + // Check the amount of pledge + if pledge.AmountCents >= 100 { + level = api.ExtendedFeatures + return + } + } + + return +} + +func NewPatreon(db *pg.DB) *Patreon { + return &Patreon{db: db} } diff --git a/pkg/webhook/hook_test.go b/pkg/support/patreon_test.go similarity index 67% rename from pkg/webhook/hook_test.go rename to pkg/support/patreon_test.go index 7a2fa2c..bd48233 100644 --- a/pkg/webhook/hook_test.go +++ b/pkg/support/patreon_test.go @@ -1,4 +1,4 @@ -package webhook +package support import ( "testing" @@ -6,6 +6,7 @@ import ( "github.com/go-pg/pg" "github.com/mxpv/patreon-go" + "github.com/mxpv/podsync/pkg/api" "github.com/mxpv/podsync/pkg/models" "github.com/stretchr/testify/require" ) @@ -14,7 +15,7 @@ func TestCreate(t *testing.T) { pledge := createPledge() hook := createHandler(t) - err := hook.Handle(pledge, patreon.EventCreatePledge) + err := hook.Hook(pledge, patreon.EventCreatePledge) require.NoError(t, err) model := &models.Pledge{PledgeID: 12345} @@ -27,12 +28,12 @@ func TestUpdate(t *testing.T) { pledge := createPledge() hook := createHandler(t) - err := hook.Handle(pledge, patreon.EventCreatePledge) + err := hook.Hook(pledge, patreon.EventCreatePledge) require.NoError(t, err) pledge.Attributes.AmountCents = 999 - err = hook.Handle(pledge, patreon.EventUpdatePledge) + err = hook.Hook(pledge, patreon.EventUpdatePledge) require.NoError(t, err) model := &models.Pledge{PledgeID: 12345} @@ -45,10 +46,10 @@ func TestDelete(t *testing.T) { pledge := createPledge() hook := createHandler(t) - err := hook.Handle(pledge, patreon.EventCreatePledge) + err := hook.Hook(pledge, patreon.EventCreatePledge) require.NoError(t, err) - err = hook.Handle(pledge, patreon.EventDeletePledge) + err = hook.Hook(pledge, patreon.EventDeletePledge) require.NoError(t, err) } @@ -56,7 +57,7 @@ func TestFindPledge(t *testing.T) { pledge := createPledge() hook := createHandler(t) - err := hook.Handle(pledge, patreon.EventCreatePledge) + err := hook.Hook(pledge, patreon.EventCreatePledge) require.NoError(t, err) res, err := hook.FindPledge("67890") @@ -64,7 +65,19 @@ func TestFindPledge(t *testing.T) { require.Equal(t, res.AmountCents, pledge.Attributes.AmountCents) } -func createHandler(t *testing.T) *Handler { +func TestGetFeatureLevel(t *testing.T) { + pledge := createPledge() + hook := createHandler(t) + + err := hook.Hook(pledge, patreon.EventCreatePledge) + require.NoError(t, err) + + require.Equal(t, api.PodcasterFeature, hook.GetFeatureLevel(creatorID)) + require.Equal(t, api.DefaultFeatures, hook.GetFeatureLevel("xyz")) + require.Equal(t, api.ExtendedFeatures, hook.GetFeatureLevel(pledge.Relationships.Patron.Data.ID)) +} + +func createHandler(t *testing.T) *Patreon { opts, err := pg.ParseURL("postgres://postgres:@localhost/podsync?sslmode=disable") if err != nil { require.NoError(t, err) @@ -75,7 +88,7 @@ func createHandler(t *testing.T) *Handler { _, err = db.Model(&models.Pledge{}).Where("1=1").Delete() require.NoError(t, err) - return NewHookHandler(db) + return NewPatreon(db) } func createPledge() *patreon.Pledge {