add dailyplayerstats/dailytribestats resolvers/usecases/repositories
This commit is contained in:
parent
96517c9108
commit
c19c510b24
5
dailyplayerstats/constants.go
Normal file
5
dailyplayerstats/constants.go
Normal file
|
@ -0,0 +1,5 @@
|
|||
package dailyplayerstats
|
||||
|
||||
const (
|
||||
PaginationLimit = 500
|
||||
)
|
17
dailyplayerstats/repository.go
Normal file
17
dailyplayerstats/repository.go
Normal 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)
|
||||
}
|
52
dailyplayerstats/repository/pg_repository.go
Normal file
52
dailyplayerstats/repository/pg_repository.go
Normal 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
|
||||
}
|
11
dailyplayerstats/usecase.go
Normal file
11
dailyplayerstats/usecase.go
Normal 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)
|
||||
}
|
32
dailyplayerstats/usecase/dailyplayerstats_usecase.go
Normal file
32
dailyplayerstats/usecase/dailyplayerstats_usecase.go
Normal 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,
|
||||
})
|
||||
}
|
5
dailytribestats/constants.go
Normal file
5
dailytribestats/constants.go
Normal file
|
@ -0,0 +1,5 @@
|
|||
package dailytribestats
|
||||
|
||||
const (
|
||||
PaginationLimit = 500
|
||||
)
|
17
dailytribestats/repository.go
Normal file
17
dailytribestats/repository.go
Normal 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)
|
||||
}
|
52
dailytribestats/repository/pg_repository.go
Normal file
52
dailytribestats/repository/pg_repository.go
Normal 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
|
||||
}
|
11
dailytribestats/usecase.go
Normal file
11
dailytribestats/usecase.go
Normal 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)
|
||||
}
|
32
dailytribestats/usecase/dailytribestats_usecase.go
Normal file
32
dailytribestats/usecase/dailytribestats_usecase.go
Normal 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
|
@ -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"`
|
||||
|
|
|
@ -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
|
||||
|
|
23
graphql/resolvers/daily_player_stats.go
Normal file
23
graphql/resolvers/daily_player_stats.go
Normal 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
|
||||
}
|
23
graphql/resolvers/daily_tribe_stats.go
Normal file
23
graphql/resolvers/daily_tribe_stats.go
Normal 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
|
||||
}
|
|
@ -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 }
|
||||
|
|
42
graphql/schema/daily_player_stats.graphql
Normal file
42
graphql/schema/daily_player_stats.graphql
Normal 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!
|
||||
}
|
43
graphql/schema/daily_tribe_stats.graphql
Normal file
43
graphql/schema/daily_tribe_stats.graphql
Normal 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
30
main.go
|
@ -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),
|
||||
},
|
||||
})
|
||||
|
||||
|
|
Reference in New Issue
Block a user