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

Code style fixes

This commit is contained in:
Maksym Pavlenko
2019-01-06 21:36:42 -08:00
parent 49900d9ab3
commit c378ed0a87
18 changed files with 99 additions and 104 deletions

View File

@@ -1,9 +1,14 @@
linters:
disable-all: true
presets:
- bugs
- unused
- format
- style
- complexity
- performance
- performance
disable:
- megacheck
- typecheck
issues:
exclude:
- if block ends with a return statement, so drop this else and outdent its block

View File

@@ -65,12 +65,12 @@ func main() {
// Builders
youtube, err := builders.NewYouTubeBuilder(cfg.YouTubeApiKey)
youtube, err := builders.NewYouTubeBuilder(cfg.YouTubeAPIKey)
if err != nil {
log.WithError(err).Fatal("failed to create YouTube builder")
}
vimeo, err := builders.NewVimeoBuilder(ctx, cfg.VimeoApiKey)
vimeo, err := builders.NewVimeoBuilder(ctx, cfg.VimeoAPIKey)
if err != nil {
log.WithError(err).Fatal("failed to create Vimeo builder")
}

View File

@@ -54,23 +54,26 @@ type Metadata struct {
}
const (
// DefaultFeatures represent features for Anonymous user
// Page size: 50
// Format: video
// Quality: high
DefaultFeatures = iota
// ExtendedFeatures represent features for 1$ pledges
// Max page size: 150
// Format: any
// Quality: any
ExtendedFeatures
// ExtendedPagination represent extended pagination feature set
// Max page size: 600
// Format: any
// Quality: any
ExtendedPagination
// Unlimited
PodcasterFeature
// PodcasterFeatures reserved for future
PodcasterFeatures
)
type CreateFeedRequest struct {
@@ -81,7 +84,7 @@ type CreateFeedRequest struct {
}
type Identity struct {
UserId string `json:"user_id"`
UserID string `json:"user_id"`
FullName string `json:"full_name"`
Email string `json:"email"`
ProfileURL string `json:"profile_url"`

View File

@@ -5,12 +5,13 @@ import (
"strconv"
itunes "github.com/mxpv/podcast"
"github.com/mxpv/podsync/pkg/api"
"github.com/mxpv/podsync/pkg/model"
"github.com/pkg/errors"
"github.com/silentsokolov/go-vimeo"
vimeo "github.com/silentsokolov/go-vimeo"
"golang.org/x/net/context"
"golang.org/x/oauth2"
"github.com/mxpv/podsync/pkg/api"
"github.com/mxpv/podsync/pkg/model"
)
const (
@@ -34,15 +35,15 @@ func (v *VimeoBuilder) selectImage(p *vimeo.Pictures, q api.Quality) string {
}
func (v *VimeoBuilder) queryChannel(feed *model.Feed) (*itunes.Podcast, error) {
channelId := feed.ItemID
channelID := feed.ItemID
ch, resp, err := v.client.Channels.Get(channelId)
ch, resp, err := v.client.Channels.Get(channelID)
if err != nil {
if resp.StatusCode == http.StatusNotFound {
return nil, api.ErrNotFound
}
return nil, errors.Wrapf(err, "failed to query channel with channelId %s", channelId)
return nil, errors.Wrapf(err, "failed to query channel with id %q", channelID)
}
podcast := itunes.New(ch.Name, ch.Link, ch.Description, &ch.CreatedTime, nil)
@@ -56,15 +57,15 @@ func (v *VimeoBuilder) queryChannel(feed *model.Feed) (*itunes.Podcast, error) {
}
func (v *VimeoBuilder) queryGroup(feed *model.Feed) (*itunes.Podcast, error) {
groupId := feed.ItemID
groupID := feed.ItemID
gr, resp, err := v.client.Groups.Get(groupId)
gr, resp, err := v.client.Groups.Get(groupID)
if err != nil {
if resp.StatusCode == http.StatusNotFound {
return nil, api.ErrNotFound
}
return nil, errors.Wrapf(err, "failed to query group with id %s", groupId)
return nil, errors.Wrapf(err, "failed to query group with id %q", groupID)
}
podcast := itunes.New(gr.Name, gr.Link, gr.Description, &gr.CreatedTime, nil)
@@ -78,15 +79,15 @@ func (v *VimeoBuilder) queryGroup(feed *model.Feed) (*itunes.Podcast, error) {
}
func (v *VimeoBuilder) queryUser(feed *model.Feed) (*itunes.Podcast, error) {
userId := feed.ItemID
userID := feed.ItemID
user, resp, err := v.client.Users.Get(userId)
user, resp, err := v.client.Users.Get(userID)
if err != nil {
if resp.StatusCode == http.StatusNotFound {
return nil, api.ErrNotFound
}
return nil, errors.Wrapf(err, "failed to query user with id %s", userId)
return nil, errors.Wrapf(err, "failed to query user with id %q", userID)
}
podcast := itunes.New(user.Name, user.Link, user.Bio, &user.CreatedTime, nil)

View File

@@ -11,7 +11,7 @@ import (
"github.com/BrianHicks/finch/duration"
itunes "github.com/mxpv/podcast"
"github.com/pkg/errors"
"google.golang.org/api/youtube/v3"
youtube "google.golang.org/api/youtube/v3"
"github.com/mxpv/podsync/pkg/api"
"github.com/mxpv/podsync/pkg/model"
@@ -64,13 +64,13 @@ func (yt *YouTubeBuilder) listChannels(linkType api.LinkType, id string) (*youtu
// Cost: 3 units (call method: 1, snippet: 2)
// See https://developers.google.com/youtube/v3/docs/playlists/list#part
func (yt *YouTubeBuilder) listPlaylists(id, channelId string) (*youtube.Playlist, error) {
func (yt *YouTubeBuilder) listPlaylists(id, channelID string) (*youtube.Playlist, error) {
req := yt.client.Playlists.List("id,snippet")
if id != "" {
req = req.Id(id)
} else {
req = req.ChannelId(channelId)
req = req.ChannelId(channelID)
}
resp, err := req.Do(yt.key)
@@ -88,8 +88,8 @@ func (yt *YouTubeBuilder) listPlaylists(id, channelId string) (*youtube.Playlist
// Cost: 3 units (call: 1, snippet: 2)
// See https://developers.google.com/youtube/v3/docs/playlistItems/list#part
func (yt *YouTubeBuilder) listPlaylistItems(itemId string, pageToken string) ([]*youtube.PlaylistItem, string, error) {
req := yt.client.PlaylistItems.List("id,snippet").MaxResults(maxYoutubeResults).PlaylistId(itemId)
func (yt *YouTubeBuilder) listPlaylistItems(itemID string, pageToken string) ([]*youtube.PlaylistItem, string, error) {
req := yt.client.PlaylistItems.List("id,snippet").MaxResults(maxYoutubeResults).PlaylistId(itemID)
if pageToken != "" {
req = req.PageToken(pageToken)
}
@@ -331,14 +331,14 @@ func (yt *YouTubeBuilder) queryVideoDescriptions(playlistItems map[string]*youtu
}
// Cost: (3 units + 5 units) * X pages = 8 units per page
func (yt *YouTubeBuilder) queryItems(itemId string, feed *model.Feed, podcast *itunes.Podcast) error {
func (yt *YouTubeBuilder) queryItems(itemID string, feed *model.Feed, podcast *itunes.Podcast) error {
var (
token string
count int
)
for {
items, pageToken, err := yt.listPlaylistItems(itemId, token)
items, pageToken, err := yt.listPlaylistItems(itemID, token)
if err != nil {
return err
}
@@ -370,7 +370,7 @@ func (yt *YouTubeBuilder) queryItems(itemId string, feed *model.Feed, podcast *i
func (yt *YouTubeBuilder) Build(feed *model.Feed) (*itunes.Podcast, error) {
// Query general information about feed (title, description, lang, etc)
podcast, itemId, err := yt.queryFeed(feed)
podcast, itemID, err := yt.queryFeed(feed)
if err != nil {
return nil, err
}
@@ -380,7 +380,7 @@ func (yt *YouTubeBuilder) Build(feed *model.Feed) (*itunes.Podcast, error) {
feed.PageSize = maxYoutubeResults
}
if err := yt.queryItems(itemId, feed, podcast); err != nil {
if err := yt.queryItems(itemID, feed, podcast); err != nil {
return nil, err
}

View File

@@ -9,9 +9,9 @@ import (
const FileName = "podsync"
type AppConfig struct {
YouTubeApiKey string `yaml:"youtubeApiKey"`
VimeoApiKey string `yaml:"vimeoApiKey"`
PatreonClientId string `yaml:"patreonClientId"`
YouTubeAPIKey string `yaml:"youtubeApiKey"`
VimeoAPIKey string `yaml:"vimeoApiKey"`
PatreonClientID string `yaml:"patreonClientId"`
PatreonSecret string `yaml:"patreonSecret"`
PatreonRedirectURL string `yaml:"patreonRedirectUrl"`
PatreonWebhooksSecret string `json:"patreonWebhooksSecret"`

View File

@@ -34,9 +34,9 @@ func TestReadYaml(t *testing.T) {
cfg, err := ReadConfiguration()
require.NoError(t, err)
require.Equal(t, "1", cfg.YouTubeApiKey)
require.Equal(t, "2", cfg.VimeoApiKey)
require.Equal(t, "3", cfg.PatreonClientId)
require.Equal(t, "1", cfg.YouTubeAPIKey)
require.Equal(t, "2", cfg.VimeoAPIKey)
require.Equal(t, "3", cfg.PatreonClientID)
require.Equal(t, "4", cfg.PatreonSecret)
require.Equal(t, "5", cfg.PostgresConnectionURL)
require.Equal(t, "6", cfg.CookieSecret)
@@ -68,9 +68,9 @@ func TestReadEnv(t *testing.T) {
cfg, err := ReadConfiguration()
require.NoError(t, err)
require.Equal(t, "11", cfg.YouTubeApiKey)
require.Equal(t, "22", cfg.VimeoApiKey)
require.Equal(t, "33", cfg.PatreonClientId)
require.Equal(t, "11", cfg.YouTubeAPIKey)
require.Equal(t, "22", cfg.VimeoAPIKey)
require.Equal(t, "33", cfg.PatreonClientID)
require.Equal(t, "44", cfg.PatreonSecret)
require.Equal(t, "55", cfg.PostgresConnectionURL)
require.Equal(t, "66", cfg.CookieSecret)

View File

@@ -48,7 +48,7 @@ func (s Service) makeFeed(req *api.CreateFeedRequest, identity *api.Identity) (*
now := time.Now().UTC()
feed.UserID = identity.UserId
feed.UserID = identity.UserID
feed.FeatureLevel = identity.FeatureLevel
feed.Quality = req.Quality
feed.Format = req.Format
@@ -71,12 +71,12 @@ func (s Service) makeFeed(req *api.CreateFeedRequest, identity *api.Identity) (*
}
// Generate short id
hashId, err := s.generator.Generate()
hashID, err := s.generator.Generate()
if err != nil {
return nil, errors.Wrap(err, "failed to generate id for feed")
}
feed.HashID = hashId
feed.HashID = hashID
return feed, nil
}
@@ -163,30 +163,30 @@ func (s Service) Downgrade(patronID string, featureLevel int) error {
return nil
}
type feedOption func(*Service)
type FeedOption func(*Service)
//noinspection GoExportedFuncWithUnexportedType
func WithStorage(db storage) feedOption {
func WithStorage(db storage) FeedOption {
return func(service *Service) {
service.db = db
}
}
//noinspection GoExportedFuncWithUnexportedType
func WithBuilder(provider api.Provider, builder builder) feedOption {
func WithBuilder(provider api.Provider, builder builder) FeedOption {
return func(service *Service) {
service.builders[provider] = builder
}
}
//noinspection GoExportedFuncWithUnexportedType
func WithStats(m stats) feedOption {
func WithStats(m stats) FeedOption {
return func(service *Service) {
service.stats = m
}
}
func NewFeedService(opts ...feedOption) (*Service, error) {
func NewFeedService(opts ...FeedOption) (*Service, error) {
idGen, err := NewIDGen()
if err != nil {
return nil, err

View File

@@ -45,9 +45,9 @@ func TestService_CreateFeed(t *testing.T) {
Format: api.FormatVideo,
}
hashId, err := s.CreateFeed(req, &api.Identity{})
hashID, err := s.CreateFeed(req, &api.Identity{})
require.NoError(t, err)
require.NotEmpty(t, hashId)
require.NotEmpty(t, hashID)
}
func TestService_makeFeed(t *testing.T) {

View File

@@ -3,7 +3,7 @@ package feeds
import (
"time"
"github.com/ventu-io/go-shortid"
shortid "github.com/ventu-io/go-shortid"
)
type IDGen struct {
@@ -21,4 +21,4 @@ func NewIDGen() (IDGen, error) {
func (id IDGen) Generate() (string, error) {
return id.sid.Generate()
}
}

View File

@@ -26,7 +26,7 @@ const (
type feedService interface {
CreateFeed(req *api.CreateFeedRequest, identity *api.Identity) (string, error)
BuildFeed(hashID string) (*itunes.Podcast, error)
GetMetadata(hashId string) (*api.Metadata, error)
GetMetadata(hashID string) (*api.Metadata, error)
Downgrade(patronID string, featureLevel int) error
}
@@ -59,7 +59,7 @@ func New(feed feedService, support patreonService, cfg *config.AppConfig) http.H
// OAuth 2 configuration
h.oauth2 = oauth2.Config{
ClientID: cfg.PatreonClientId,
ClientID: cfg.PatreonClientID,
ClientSecret: cfg.PatreonSecret,
RedirectURL: cfg.PatreonRedirectURL,
Scopes: []string{"users", "pledges-to-me", "my-campaign"},
@@ -132,7 +132,7 @@ func (h handler) patreonCallback(c *gin.Context) {
level := h.patreon.GetFeatureLevelByID(user.Data.ID)
identity := &api.Identity{
UserId: user.Data.ID,
UserID: user.Data.ID,
FullName: user.Data.Attributes.FullName,
Email: user.Data.Attributes.Email,
ProfileURL: user.Data.Attributes.URL,
@@ -154,7 +154,7 @@ func (h handler) user(c *gin.Context) {
}
c.JSON(http.StatusOK, gin.H{
"user_id": identity.UserId,
"user_id": identity.UserID,
"feature_level": identity.FeatureLevel,
"full_name": identity.FullName,
})
@@ -179,23 +179,23 @@ func (h handler) create(c *gin.Context) {
}
// Check feature level again if user deleted pledge by still logged in
identity.FeatureLevel = h.patreon.GetFeatureLevelByID(identity.UserId)
identity.FeatureLevel = h.patreon.GetFeatureLevelByID(identity.UserID)
createEventLog = createEventLog.WithFields(log.Fields{
"user_id": identity.UserId,
"user_id": identity.UserID,
"feature_level": identity.FeatureLevel,
})
createEventLog.Info("creating feed")
hashId, err := h.feed.CreateFeed(req, identity)
hashID, err := h.feed.CreateFeed(req, identity)
if err != nil {
createEventLog.WithError(err).Error("failed to create new feed")
c.JSON(internalError(err))
return
}
c.JSON(http.StatusOK, gin.H{"id": hashId})
c.JSON(http.StatusOK, gin.H{"id": hashID})
}
func (h handler) getFeed(c *gin.Context) {

View File

@@ -79,8 +79,8 @@ func (r RedisStats) Close() error {
return r.client.Close()
}
func NewRedisStats(redisUrl string) (*RedisStats, error) {
opts, err := redis.ParseURL(redisUrl)
func NewRedisStats(redisURL string) (*RedisStats, error) {
opts, err := redis.ParseURL(redisURL)
if err != nil {
return nil, err
}

View File

@@ -1,8 +1,9 @@
package stats
import (
"github.com/stretchr/testify/require"
"testing"
"github.com/stretchr/testify/require"
)
const metric = "downloads"

View File

@@ -276,7 +276,7 @@ func (d Dynamo) Downgrade(userID string, featureLevel int) error {
KeyConditionExpression: keyConditionExpression.KeyCondition(),
ExpressionAttributeNames: keyConditionExpression.Names(),
ExpressionAttributeValues: keyConditionExpression.Values(),
Select: aws.String(dynamodb.SelectAllProjectedAttributes),
Select: aws.String(dynamodb.SelectAllProjectedAttributes),
}
var keys []map[string]*dynamodb.AttributeValue

View File

@@ -61,4 +61,4 @@ CREATE INDEX IF NOT EXISTS feeds_user_id_idx ON feeds(user_id);
COMMIT;
END;
`
`

View File

@@ -51,6 +51,18 @@ var (
CreatedAt: time.Now().UTC(),
LastAccess: time.Now().UTC(),
}
testDowngradePledge = &model.Feed{
HashID: "123456",
UserID: "123456",
ItemID: "123456",
Provider: api.ProviderVimeo,
LinkType: api.LinkTypeGroup,
PageSize: 200,
Quality: api.QualityLow,
Format: api.FormatAudio,
FeatureLevel: api.ExtendedFeatures,
}
)
func runStorageTests(t *testing.T, createFn func(t *testing.T) storage) {
@@ -118,25 +130,13 @@ func testGetMetadata(t *testing.T, storage storage) {
}
func testDowngradeToDefaultFeatures(t *testing.T, storage storage) {
feed := &model.Feed{
HashID: "123456",
UserID: "123456",
ItemID: "123456",
Provider: api.ProviderVimeo,
LinkType: api.LinkTypeGroup,
PageSize: 200,
Quality: api.QualityLow,
Format: api.FormatAudio,
FeatureLevel: api.ExtendedFeatures,
}
err := storage.SaveFeed(feed)
err := storage.SaveFeed(testDowngradePledge)
require.NoError(t, err)
err = storage.Downgrade(feed.UserID, api.DefaultFeatures)
err = storage.Downgrade(testDowngradePledge.UserID, api.DefaultFeatures)
require.NoError(t, err)
downgraded, err := storage.GetFeed(feed.HashID)
downgraded, err := storage.GetFeed(testDowngradePledge.HashID)
require.NoError(t, err)
require.Equal(t, 50, downgraded.PageSize)
@@ -146,30 +146,18 @@ func testDowngradeToDefaultFeatures(t *testing.T, storage storage) {
}
func testDowngradeToExtendedFeatures(t *testing.T, storage storage) {
feed := &model.Feed{
HashID: "123456",
UserID: "123456",
ItemID: "123456",
Provider: api.ProviderVimeo,
LinkType: api.LinkTypeGroup,
PageSize: 500,
Quality: api.QualityLow,
Format: api.FormatAudio,
FeatureLevel: api.ExtendedFeatures,
}
err := storage.SaveFeed(feed)
err := storage.SaveFeed(testDowngradePledge)
require.NoError(t, err)
err = storage.Downgrade(feed.UserID, api.ExtendedFeatures)
err = storage.Downgrade(testDowngradePledge.UserID, api.ExtendedFeatures)
require.NoError(t, err)
downgraded, err := storage.GetFeed(feed.HashID)
downgraded, err := storage.GetFeed(testDowngradePledge.HashID)
require.NoError(t, err)
require.Equal(t, 150, downgraded.PageSize)
require.Equal(t, feed.Quality, downgraded.Quality)
require.Equal(t, feed.Format, downgraded.Format)
require.Equal(t, testDowngradePledge.Quality, downgraded.Quality)
require.Equal(t, testDowngradePledge.Format, downgraded.Format)
require.Equal(t, api.ExtendedFeatures, downgraded.FeatureLevel)
}
@@ -207,14 +195,7 @@ func testAddPledge(t *testing.T, storage storage) {
pledge, err := storage.GetPledge(strconv.FormatInt(testPledge.PatronID, 10))
require.NoError(t, err)
require.Equal(t, testPledge.PledgeID, pledge.PledgeID)
require.Equal(t, testPledge.PatronID, pledge.PatronID)
require.Equal(t, testPledge.CreatedAt.Unix(), pledge.CreatedAt.Unix())
require.Equal(t, testPledge.DeclinedSince.Unix(), pledge.DeclinedSince.Unix())
require.Equal(t, testPledge.AmountCents, pledge.AmountCents)
require.Equal(t, testPledge.TotalHistoricalAmountCents, pledge.TotalHistoricalAmountCents)
require.Equal(t, testPledge.OutstandingPaymentAmountCents, pledge.OutstandingPaymentAmountCents)
require.Equal(t, testPledge.IsPaused, pledge.IsPaused)
compareWithTestPledge(t, pledge)
}
func testGetPledge(t *testing.T, storage storage) {
@@ -224,6 +205,10 @@ func testGetPledge(t *testing.T, storage storage) {
pledge, err := storage.GetPledge(strconv.FormatInt(testPledge.PatronID, 10))
require.NoError(t, err)
compareWithTestPledge(t, pledge)
}
func compareWithTestPledge(t *testing.T, pledge *model.Pledge) {
require.Equal(t, testPledge.PledgeID, pledge.PledgeID)
require.Equal(t, testPledge.PatronID, pledge.PatronID)
require.Equal(t, testPledge.CreatedAt.Unix(), pledge.CreatedAt.Unix())

View File

@@ -113,7 +113,7 @@ func (h Patreon) GetFeatureLevelByID(patronID string) (level int) {
}
if patronID == creatorID {
level = api.PodcasterFeature
level = api.PodcasterFeatures
return
}

View File

@@ -103,7 +103,7 @@ func TestGetFeatureLevel(t *testing.T) {
hook := Patreon{db: storage}
require.Equal(t, api.PodcasterFeature, hook.GetFeatureLevelByID(creatorID))
require.Equal(t, api.PodcasterFeatures, hook.GetFeatureLevelByID(creatorID))
require.Equal(t, api.DefaultFeatures, hook.GetFeatureLevelByID("xyz"))
require.Equal(t, api.ExtendedPagination, hook.GetFeatureLevelByID(pledge.Relationships.Patron.Data.ID))
}