add dailyplayerstats/dailytribestats resolvers/usecases/repositories

This commit is contained in:
Dawid Wysokiński 2020-06-25 16:02:00 +02:00
parent 96517c9108
commit c19c510b24
19 changed files with 2557 additions and 22 deletions

View File

@ -0,0 +1,5 @@
package dailyplayerstats
const (
PaginationLimit = 500
)

View File

@ -0,0 +1,17 @@
package dailyplayerstats
import (
"context"
"github.com/tribalwarshelp/shared/models"
)
type FetchConfig struct {
Server string
Filter *models.DailyPlayerStatsFilter
Count bool
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.DailyPlayerStats, int, error)
}

View File

@ -0,0 +1,52 @@
package repository
import (
"context"
"fmt"
"strings"
"github.com/go-pg/pg/v10"
"github.com/pkg/errors"
"github.com/tribalwarshelp/api/dailyplayerstats"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
*pg.DB
}
func NewPGRepository(db *pg.DB) dailyplayerstats.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg dailyplayerstats.FetchConfig) ([]*models.DailyPlayerStats, int, error) {
var err error
data := []*models.DailyPlayerStats{}
total := 0
query := repo.WithParam("SERVER", pg.Safe(cfg.Server)).Model(&data).Context(ctx)
if cfg.Filter != nil {
query = query.
WhereStruct(cfg.Filter).
Limit(cfg.Filter.Limit).
Offset(cfg.Filter.Offset)
if cfg.Filter.Sort != "" {
query = query.Order(cfg.Filter.Sort)
}
}
if cfg.Count {
total, err = query.SelectAndCount()
} else {
err = query.Select()
}
if err != nil && err != pg.ErrNoRows {
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
return nil, 0, fmt.Errorf("Server not found")
}
return nil, 0, errors.Wrap(err, "Internal server error")
}
return data, total, nil
}

View File

@ -0,0 +1,11 @@
package dailyplayerstats
import (
"context"
"github.com/tribalwarshelp/shared/models"
)
type Usecase interface {
Fetch(ctx context.Context, server string, filter *models.DailyPlayerStatsFilter) ([]*models.DailyPlayerStats, int, error)
}

View File

@ -0,0 +1,32 @@
package usecase
import (
"context"
"github.com/tribalwarshelp/api/dailyplayerstats"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
repo dailyplayerstats.Repository
}
func New(repo dailyplayerstats.Repository) dailyplayerstats.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, server string, filter *models.DailyPlayerStatsFilter) ([]*models.DailyPlayerStats, int, error) {
if filter == nil {
filter = &models.DailyPlayerStatsFilter{}
}
if filter.Limit > dailyplayerstats.PaginationLimit || filter.Limit <= 0 {
filter.Limit = dailyplayerstats.PaginationLimit
}
filter.Sort = utils.SanitizeSort(filter.Sort)
return ucase.repo.Fetch(ctx, dailyplayerstats.FetchConfig{
Server: server,
Filter: filter,
Count: true,
})
}

View File

@ -0,0 +1,5 @@
package dailytribestats
const (
PaginationLimit = 500
)

View File

@ -0,0 +1,17 @@
package dailytribestats
import (
"context"
"github.com/tribalwarshelp/shared/models"
)
type FetchConfig struct {
Server string
Filter *models.DailyTribeStatsFilter
Count bool
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.DailyTribeStats, int, error)
}

View File

@ -0,0 +1,52 @@
package repository
import (
"context"
"fmt"
"strings"
"github.com/go-pg/pg/v10"
"github.com/pkg/errors"
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
*pg.DB
}
func NewPGRepository(db *pg.DB) dailytribestats.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg dailytribestats.FetchConfig) ([]*models.DailyTribeStats, int, error) {
var err error
data := []*models.DailyTribeStats{}
total := 0
query := repo.WithParam("SERVER", pg.Safe(cfg.Server)).Model(&data).Context(ctx)
if cfg.Filter != nil {
query = query.
WhereStruct(cfg.Filter).
Limit(cfg.Filter.Limit).
Offset(cfg.Filter.Offset)
if cfg.Filter.Sort != "" {
query = query.Order(cfg.Filter.Sort)
}
}
if cfg.Count {
total, err = query.SelectAndCount()
} else {
err = query.Select()
}
if err != nil && err != pg.ErrNoRows {
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
return nil, 0, fmt.Errorf("Server not found")
}
return nil, 0, errors.Wrap(err, "Internal server error")
}
return data, total, nil
}

View File

@ -0,0 +1,11 @@
package dailytribestats
import (
"context"
"github.com/tribalwarshelp/shared/models"
)
type Usecase interface {
Fetch(ctx context.Context, server string, filter *models.DailyTribeStatsFilter) ([]*models.DailyTribeStats, int, error)
}

View File

@ -0,0 +1,32 @@
package usecase
import (
"context"
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
repo dailytribestats.Repository
}
func New(repo dailytribestats.Repository) dailytribestats.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, server string, filter *models.DailyTribeStatsFilter) ([]*models.DailyTribeStats, int, error) {
if filter == nil {
filter = &models.DailyTribeStatsFilter{}
}
if filter.Limit > dailytribestats.PaginationLimit || filter.Limit <= 0 {
filter.Limit = dailytribestats.PaginationLimit
}
filter.Sort = utils.SanitizeSort(filter.Sort)
return ucase.repo.Fetch(ctx, dailytribestats.FetchConfig{
Server: server,
Filter: filter,
Count: true,
})
}

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,16 @@ import (
"github.com/tribalwarshelp/shared/models"
)
type DailyPlayerStats struct {
Total int `json:"total"`
Items []*models.DailyPlayerStats `json:"items"`
}
type DailyTribeStats struct {
Total int `json:"total"`
Items []*models.DailyTribeStats `json:"items"`
}
type EnnoblementsList struct {
Items []*models.Ennoblement `json:"items"`
Total int `json:"total"`

View File

@ -94,5 +94,13 @@ models:
model: github.com/tribalwarshelp/shared/models.TribeChange
TribeChangeFilter:
model: github.com/tribalwarshelp/shared/models.TribeChangeFilter
DailyPlayerStatsRecord:
model: github.com/tribalwarshelp/shared/models.DailyPlayerStats
DailyPlayerStatsFilter:
model: github.com/tribalwarshelp/shared/models.DailyPlayerStatsFilter
DailyTribeStatsRecord:
model: github.com/tribalwarshelp/shared/models.DailyTribeStats
DailyTribeStatsFilter:
model: github.com/tribalwarshelp/shared/models.DailyTribeStatsFilter
PlayerNameChange:
model: github.com/tribalwarshelp/shared/models.PlayerNameChange

View File

@ -0,0 +1,23 @@
package resolvers
import (
"context"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/shared/models"
)
func (r *dailyPlayerStatsRecordResolver) Player(ctx context.Context, obj *models.DailyPlayerStats) (*models.Player, error) {
if obj.Player != nil {
return obj.Player, nil
}
return getPlayer(ctx, obj.PlayerID), nil
}
func (r *queryResolver) DailyPlayerStats(ctx context.Context, server string, filter *models.DailyPlayerStatsFilter) (*generated.DailyPlayerStats, error) {
var err error
list := &generated.DailyPlayerStats{}
list.Items, list.Total, err = r.DailyPlayerStatsUcase.Fetch(ctx, server, filter)
return list, err
}

View File

@ -0,0 +1,23 @@
package resolvers
import (
"context"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/shared/models"
)
func (r *dailyTribeStatsRecordResolver) Tribe(ctx context.Context, obj *models.DailyTribeStats) (*models.Tribe, error) {
if obj.Tribe != nil {
return obj.Tribe, nil
}
return getTribe(ctx, obj.TribeID), nil
}
func (r *queryResolver) DailyTribeStats(ctx context.Context, server string, filter *models.DailyTribeStatsFilter) (*generated.DailyTribeStats, error) {
var err error
list := &generated.DailyTribeStats{}
list.Items, list.Total, err = r.DailyTribeStatsUcase.Fetch(ctx, server, filter)
return list, err
}

View File

@ -1,6 +1,8 @@
package resolvers
import (
"github.com/tribalwarshelp/api/dailyplayerstats"
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/api/ennoblement"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/langversion"
@ -27,6 +29,8 @@ type Resolver struct {
TribeHistoryUcase tribehistory.Usecase
ServerStatsUcase serverstats.Usecase
TribeChangeUcase tribechange.Usecase
DailyTribeStatsUcase dailytribestats.Usecase
DailyPlayerStatsUcase dailyplayerstats.Usecase
}
// Query returns generated.QueryResolver implementation.
@ -47,6 +51,12 @@ func (r *Resolver) TribeHistoryRecord() generated.TribeHistoryRecordResolver {
func (r *Resolver) TribeChangeRecord() generated.TribeChangeRecordResolver {
return &tribeChangeRecordResolver{r}
}
func (r *Resolver) DailyPlayerStatsRecord() generated.DailyPlayerStatsRecordResolver {
return &dailyPlayerStatsRecordResolver{r}
}
func (r *Resolver) DailyTribeStatsRecord() generated.DailyTribeStatsRecordResolver {
return &dailyTribeStatsRecordResolver{r}
}
type queryResolver struct{ *Resolver }
type playerResolver struct{ *Resolver }
@ -59,3 +69,5 @@ type playerHistoryRecordResolver struct{ *Resolver }
type tribeHistoryRecordResolver struct{ *Resolver }
type serverStatsRecordResolver struct{ *Resolver }
type tribeChangeRecordResolver struct{ *Resolver }
type dailyPlayerStatsRecordResolver struct{ *Resolver }
type dailyTribeStatsRecordResolver struct{ *Resolver }

View File

@ -0,0 +1,42 @@
type DailyPlayerStatsRecord {
player: Player @goField(forceResolver: true)
villages: Int!
points: Int!
rank: Int!
rankAtt: Int!
scoreAtt: Int!
rankDef: Int!
scoreDef: Int!
rankSup: Int!
scoreSup: Int!
rankTotal: Int!
scoreTotal: Int!
createdAt: Time!
}
type DailyPlayerStats {
total: Int!
items: [DailyPlayerStatsRecord!]
}
input DailyPlayerStatsFilter {
playerID: [Int!]
playerIDNEQ: [Int!]
createdAt: Time
createdAtGT: Time
createdAtGTE: Time
createdAtLT: Time
createdAtLTE: Time
offset: Int
limit: Int
sort: String
}
extend type Query {
dailyPlayerStats(
server: String!
filter: DailyPlayerStatsFilter
): DailyPlayerStats!
}

View File

@ -0,0 +1,43 @@
type DailyTribeStatsRecord {
tribe: Tribe @goField(forceResolver: true)
members: Int!
villages: Int!
points: Int!
allPoints: Int!
rank: Int!
rankAtt: Int!
scoreAtt: Int!
rankDef: Int!
scoreDef: Int!
rankTotal: Int!
scoreTotal: Int!
dominance: Float!
createdAt: Time!
}
type DailyTribeStats {
total: Int!
items: [DailyTribeStatsRecord!]
}
input DailyTribeStatsFilter {
tribeID: [Int!]
tribeIDNEQ: [Int!]
createdAt: Time
createdAtGT: Time
createdAtGTE: Time
createdAtLT: Time
createdAtLTE: Time
offset: Int
limit: Int
sort: String
}
extend type Query {
dailyTribeStats(
server: String!
filter: DailyTribeStatsFilter
): DailyTribeStats!
}

View File

@ -19,6 +19,10 @@ import (
"github.com/tribalwarshelp/api/graphql/dataloaders"
dailyplayerstatsrepo "github.com/tribalwarshelp/api/dailyplayerstats/repository"
dailyplayerstatsucase "github.com/tribalwarshelp/api/dailyplayerstats/usecase"
dailytribestatsrepo "github.com/tribalwarshelp/api/dailytribestats/repository"
dailytribestatsucase "github.com/tribalwarshelp/api/dailytribestats/usecase"
ennoblementrepo "github.com/tribalwarshelp/api/ennoblement/repository"
ennoblementucase "github.com/tribalwarshelp/api/ennoblement/usecase"
langversionrepo "github.com/tribalwarshelp/api/langversion/repository"
@ -102,6 +106,8 @@ func main() {
playerhistoryRepo := playerhistoryrepo.NewPGRepository(db)
serverstatsRepo := serverstatsrepo.NewPGRepository(db)
tribeChangeRepo := tribechangerepo.NewPGRepository(db)
dailyPlayerStatsRepo := dailyplayerstatsrepo.NewPGRepository(db)
dailyTribeStatsRepo := dailytribestatsrepo.NewPGRepository(db)
liveennoblementRepo := liveennoblementrepo.NewPGRepository(db, redisClient)
serverUcase := serverucase.New(serverRepo)
@ -134,6 +140,8 @@ func main() {
PlayerHistoryUcase: playerhistoryucase.New(playerhistoryRepo),
ServerStatsUcase: serverstatsucase.New(serverstatsRepo),
TribeChangeUcase: tribechangeucase.New(tribeChangeRepo),
DailyPlayerStatsUcase: dailyplayerstatsucase.New(dailyPlayerStatsRepo),
DailyTribeStatsUcase: dailytribestatsucase.New(dailyTribeStatsRepo),
},
})