1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00
mxpv-podsync/pkg/support/patreon.go

151 lines
3.3 KiB
Go
Raw Normal View History

2017-11-02 17:43:08 -07:00
package support
2017-10-26 14:36:52 -07:00
import (
"fmt"
"strconv"
"github.com/mxpv/patreon-go"
2018-11-24 11:58:08 -08:00
"github.com/pkg/errors"
2017-11-02 17:43:08 -07:00
"github.com/mxpv/podsync/pkg/api"
2017-11-02 21:41:52 -07:00
"github.com/mxpv/podsync/pkg/model"
2018-12-02 13:58:41 -08:00
log "github.com/sirupsen/logrus"
2017-10-26 14:36:52 -07:00
)
2017-11-02 17:43:08 -07:00
const (
creatorID = "2822191"
)
2018-11-24 11:58:08 -08:00
type storage interface {
AddPledge(pledge *model.Pledge) error
UpdatePledge(patronID string, pledge *model.Pledge) error
DeletePledge(pledge *model.Pledge) error
GetPledge(patronID string) (*model.Pledge, error)
}
2017-11-02 17:43:08 -07:00
type Patreon struct {
2018-11-24 11:58:08 -08:00
db storage
2017-10-26 14:36:52 -07:00
}
2018-11-24 11:58:08 -08:00
func ToModel(pledge *patreon.Pledge) (*model.Pledge, error) {
2017-10-30 17:26:46 -07:00
pledgeID, err := strconv.ParseInt(pledge.ID, 10, 64)
2017-10-26 14:36:52 -07:00
if err != nil {
2017-10-30 17:26:46 -07:00
return nil, errors.Wrapf(err, "failed to parse pledge id: %s", pledge.ID)
2017-10-26 14:36:52 -07:00
}
2017-10-30 17:26:46 -07:00
patronID, err := strconv.ParseInt(pledge.Relationships.Patron.Data.ID, 10, 64)
2017-10-26 14:36:52 -07:00
if err != nil {
2017-10-30 17:26:46 -07:00
return nil, errors.Wrapf(err, "failed to parse patron id: %s", pledge.Relationships.Patron.Data.ID)
2017-10-26 14:36:52 -07:00
}
2017-11-02 21:41:52 -07:00
m := &model.Pledge{
2017-10-26 14:36:52 -07:00
PledgeID: pledgeID,
PatronID: patronID,
AmountCents: pledge.Attributes.AmountCents,
}
if pledge.Attributes.CreatedAt.Valid {
2017-11-02 21:41:52 -07:00
m.CreatedAt = pledge.Attributes.CreatedAt.Time
2017-10-26 14:36:52 -07:00
}
if pledge.Attributes.DeclinedSince.Valid {
2017-11-02 21:41:52 -07:00
m.DeclinedSince = pledge.Attributes.DeclinedSince.Time
2017-10-26 14:36:52 -07:00
}
// Read optional fields
if pledge.Attributes.TotalHistoricalAmountCents != nil {
2017-11-02 21:41:52 -07:00
m.TotalHistoricalAmountCents = *pledge.Attributes.TotalHistoricalAmountCents
2017-10-26 14:36:52 -07:00
}
if pledge.Attributes.OutstandingPaymentAmountCents != nil {
2017-11-02 21:41:52 -07:00
m.OutstandingPaymentAmountCents = *pledge.Attributes.OutstandingPaymentAmountCents
2017-10-26 14:36:52 -07:00
}
if pledge.Attributes.IsPaused != nil {
2017-11-02 21:41:52 -07:00
m.IsPaused = *pledge.Attributes.IsPaused
2017-10-26 14:36:52 -07:00
}
2017-11-02 21:41:52 -07:00
return m, nil
2017-10-26 14:36:52 -07:00
}
2017-11-02 17:43:08 -07:00
func (h Patreon) Hook(pledge *patreon.Pledge, event string) error {
2018-12-02 13:58:41 -08:00
logger := log.WithFields(log.Fields{
"module": "hook",
"pledge_id": pledge.ID,
"pledge_event": event,
})
2018-11-24 11:58:08 -08:00
obj, err := ToModel(pledge)
2017-10-26 14:36:52 -07:00
if err != nil {
2018-12-02 13:58:41 -08:00
logger.WithError(err).Error("failed to convert pledge to model")
2017-10-26 14:36:52 -07:00
return err
}
switch event {
2017-10-30 17:26:46 -07:00
case patreon.EventCreatePledge:
2018-11-24 11:58:08 -08:00
return h.db.AddPledge(obj)
2017-10-30 17:26:46 -07:00
case patreon.EventUpdatePledge:
2017-11-14 12:31:38 -08:00
// Update comes with different PledgeID from Patreon, so do update by user ID
patronID := pledge.Relationships.Patron.Data.ID
2018-11-24 11:58:08 -08:00
if err := h.db.UpdatePledge(patronID, obj); err != nil {
2017-11-14 12:31:38 -08:00
return err
2017-11-05 13:04:36 -08:00
}
2017-11-14 12:31:38 -08:00
return nil
2017-10-30 17:26:46 -07:00
case patreon.EventDeletePledge:
2018-11-24 11:58:08 -08:00
return h.db.DeletePledge(obj)
2017-10-26 14:36:52 -07:00
default:
return fmt.Errorf("unknown event: %s", event)
}
}
2017-11-02 21:41:52 -07:00
func (h Patreon) FindPledge(patronID string) (*model.Pledge, error) {
2018-11-24 11:58:08 -08:00
return h.db.GetPledge(patronID)
2017-11-02 17:13:01 -07:00
}
2017-11-10 17:13:01 -08:00
func (h Patreon) GetFeatureLevelByID(patronID string) (level int) {
2017-11-02 17:43:08 -07:00
level = api.DefaultFeatures
if patronID == "" {
return
}
2017-11-02 17:43:08 -07:00
if patronID == creatorID {
level = api.PodcasterFeature
return
}
pledge, err := h.FindPledge(patronID)
if err != nil {
2018-12-02 13:58:41 -08:00
log.WithError(err).WithField("user_id", patronID).Error("can't find pledge for user")
2017-11-02 17:43:08 -07:00
return
}
// Check pledge is valid
if pledge.DeclinedSince.IsZero() && !pledge.IsPaused {
2017-11-10 17:13:01 -08:00
level = h.GetFeatureLevelFromAmount(pledge.AmountCents)
return
2017-11-02 17:43:08 -07:00
}
return
}
2017-11-10 17:13:01 -08:00
func (h Patreon) GetFeatureLevelFromAmount(amount int) int {
// Check the amount of pledge
if amount >= 300 {
return api.ExtendedPagination
}
if amount >= 100 {
return api.ExtendedFeatures
}
return api.DefaultFeatures
}
2018-11-24 11:58:08 -08:00
func NewPatreon(db storage) *Patreon {
2017-11-02 17:43:08 -07:00
return &Patreon{db: db}
2017-10-26 14:36:52 -07:00
}