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"
@ -16,17 +18,19 @@ import (
)
type Resolver struct {
LangVersionUcase langversion.Usecase
ServerUcase server.Usecase
PlayerUcase player.Usecase
TribeUcase tribe.Usecase
VillageUcase village.Usecase
LiveEnnoblementUcase liveennoblement.Usecase
EnnoblementUcase ennoblement.Usecase
PlayerHistoryUcase playerhistory.Usecase
TribeHistoryUcase tribehistory.Usecase
ServerStatsUcase serverstats.Usecase
TribeChangeUcase tribechange.Usecase
LangVersionUcase langversion.Usecase
ServerUcase server.Usecase
PlayerUcase player.Usecase
TribeUcase tribe.Usecase
VillageUcase village.Usecase
LiveEnnoblementUcase liveennoblement.Usecase
EnnoblementUcase ennoblement.Usecase
PlayerHistoryUcase playerhistory.Usecase
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!
}

30
main.go
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)
@ -123,17 +129,19 @@ func main() {
httpdelivery.Attach(httpdelivery.Config{
RouterGroup: graphql,
Resolver: &resolvers.Resolver{
LangVersionUcase: langversionucase.New(langversionRepo),
ServerUcase: serverUcase,
TribeUcase: tribeucase.New(tribeRepo),
PlayerUcase: playerucase.New(playerRepo),
VillageUcase: villageucase.New(villageRepo),
EnnoblementUcase: ennoblementucase.New(ennoblementRepo),
LiveEnnoblementUcase: liveennoblementucase.New(liveennoblementRepo),
TribeHistoryUcase: tribehistoryucase.New(tribehistoryRepo),
PlayerHistoryUcase: playerhistoryucase.New(playerhistoryRepo),
ServerStatsUcase: serverstatsucase.New(serverstatsRepo),
TribeChangeUcase: tribechangeucase.New(tribeChangeRepo),
LangVersionUcase: langversionucase.New(langversionRepo),
ServerUcase: serverUcase,
TribeUcase: tribeucase.New(tribeRepo),
PlayerUcase: playerucase.New(playerRepo),
VillageUcase: villageucase.New(villageRepo),
EnnoblementUcase: ennoblementucase.New(ennoblementRepo),
LiveEnnoblementUcase: liveennoblementucase.New(liveennoblementRepo),
TribeHistoryUcase: tribehistoryucase.New(tribehistoryRepo),
PlayerHistoryUcase: playerhistoryucase.New(playerhistoryRepo),
ServerStatsUcase: serverstatsucase.New(serverstatsRepo),
TribeChangeUcase: tribechangeucase.New(tribeChangeRepo),
DailyPlayerStatsUcase: dailyplayerstatsucase.New(dailyPlayerStatsRepo),
DailyTribeStatsUcase: dailytribestatsucase.New(dailyTribeStatsRepo),
},
})