add playerhistory and tribehistory
This commit is contained in:
parent
52b6f59d94
commit
ca2cb4debe
File diff suppressed because it is too large
Load Diff
|
@ -16,6 +16,11 @@ type LangVersionsList struct {
|
|||
Total int `json:"total"`
|
||||
}
|
||||
|
||||
type PlayerHistory struct {
|
||||
Total int `json:"total"`
|
||||
Items []*models.PlayerHistory `json:"items"`
|
||||
}
|
||||
|
||||
type PlayersList struct {
|
||||
Items []*models.Player `json:"items"`
|
||||
Total int `json:"total"`
|
||||
|
@ -26,6 +31,11 @@ type ServersList struct {
|
|||
Total int `json:"total"`
|
||||
}
|
||||
|
||||
type TribeHistory struct {
|
||||
Total int `json:"total"`
|
||||
Items []*models.TribeHistory `json:"items"`
|
||||
}
|
||||
|
||||
type TribesList struct {
|
||||
Items []*models.Tribe `json:"items"`
|
||||
Total int `json:"total"`
|
||||
|
|
|
@ -78,3 +78,11 @@ models:
|
|||
model: github.com/tribalwarshelp/shared/models.Ennoblement
|
||||
EnnoblementFilter:
|
||||
model: github.com/tribalwarshelp/shared/models.EnnoblementFilter
|
||||
PlayerHistoryRecord:
|
||||
model: github.com/tribalwarshelp/shared/models.PlayerHistory
|
||||
PlayerHistoryFilter:
|
||||
model: github.com/tribalwarshelp/shared/models.PlayerHistoryFilter
|
||||
TribeHistoryRecord:
|
||||
model: github.com/tribalwarshelp/shared/models.TribeHistory
|
||||
TribeHistoryFilter:
|
||||
model: github.com/tribalwarshelp/shared/models.TribeHistoryFilter
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
package resolvers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/tribalwarshelp/api/graphql/generated"
|
||||
"github.com/tribalwarshelp/api/utils"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
func (r *playerHistoryRecordResolver) Player(ctx context.Context, obj *models.PlayerHistory) (*models.Player, error) {
|
||||
if obj.Player != nil {
|
||||
return obj.Player, nil
|
||||
}
|
||||
|
||||
return getPlayer(ctx, obj.PlayerID), nil
|
||||
}
|
||||
|
||||
func (r *playerHistoryRecordResolver) Tribe(ctx context.Context, obj *models.PlayerHistory) (*models.Tribe, error) {
|
||||
if obj.Tribe != nil {
|
||||
return obj.Tribe, nil
|
||||
}
|
||||
|
||||
return getTribe(ctx, obj.TribeID), nil
|
||||
}
|
||||
|
||||
func (r *playerHistoryRecordResolver) CreatedAt(ctx context.Context, obj *models.PlayerHistory) (*time.Time, error) {
|
||||
server, _ := getServer(ctx)
|
||||
t := formatDate(ctx, utils.LanguageTagFromServerKey(server), obj.CreatedAt)
|
||||
return &t, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) PlayerHistory(ctx context.Context, server string, filter *models.PlayerHistoryFilter) (*generated.PlayerHistory, error) {
|
||||
var err error
|
||||
list := &generated.PlayerHistory{}
|
||||
list.Items, list.Total, err = r.PlayerHistoryUcase.Fetch(ctx, server, filter)
|
||||
return list, err
|
||||
}
|
|
@ -6,8 +6,10 @@ import (
|
|||
"github.com/tribalwarshelp/api/langversion"
|
||||
"github.com/tribalwarshelp/api/liveennoblement"
|
||||
"github.com/tribalwarshelp/api/player"
|
||||
"github.com/tribalwarshelp/api/playerhistory"
|
||||
"github.com/tribalwarshelp/api/server"
|
||||
"github.com/tribalwarshelp/api/tribe"
|
||||
"github.com/tribalwarshelp/api/tribehistory"
|
||||
"github.com/tribalwarshelp/api/village"
|
||||
)
|
||||
|
||||
|
@ -19,6 +21,8 @@ type Resolver struct {
|
|||
VillageUcase village.Usecase
|
||||
LiveEnnoblementUcase liveennoblement.Usecase
|
||||
EnnoblementUcase ennoblement.Usecase
|
||||
PlayerHistoryUcase playerhistory.Usecase
|
||||
TribeHistoryUcase tribehistory.Usecase
|
||||
}
|
||||
|
||||
// Query returns generated.QueryResolver implementation.
|
||||
|
@ -30,6 +34,12 @@ func (r *Resolver) LiveEnnoblement() generated.LiveEnnoblementResolver {
|
|||
}
|
||||
func (r *Resolver) Ennoblement() generated.EnnoblementResolver { return &ennoblementResolver{r} }
|
||||
func (r *Resolver) Server() generated.ServerResolver { return &serverResolver{r} }
|
||||
func (r *Resolver) PlayerHistoryRecord() generated.PlayerHistoryRecordResolver {
|
||||
return &playerHistoryRecordResolver{r}
|
||||
}
|
||||
func (r *Resolver) TribeHistoryRecord() generated.TribeHistoryRecordResolver {
|
||||
return &tribeHistoryRecordResolver{r}
|
||||
}
|
||||
|
||||
type queryResolver struct{ *Resolver }
|
||||
type playerResolver struct{ *Resolver }
|
||||
|
@ -37,3 +47,5 @@ type villageResolver struct{ *Resolver }
|
|||
type liveEnnoblementResolver struct{ *Resolver }
|
||||
type ennoblementResolver struct{ *Resolver }
|
||||
type serverResolver struct{ *Resolver }
|
||||
type playerHistoryRecordResolver struct{ *Resolver }
|
||||
type tribeHistoryRecordResolver struct{ *Resolver }
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
package resolvers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/tribalwarshelp/api/graphql/generated"
|
||||
"github.com/tribalwarshelp/api/utils"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
func (r *tribeHistoryRecordResolver) Tribe(ctx context.Context, obj *models.TribeHistory) (*models.Tribe, error) {
|
||||
if obj.Tribe != nil {
|
||||
return obj.Tribe, nil
|
||||
}
|
||||
|
||||
return getTribe(ctx, obj.TribeID), nil
|
||||
}
|
||||
|
||||
func (r *tribeHistoryRecordResolver) CreatedAt(ctx context.Context, obj *models.TribeHistory) (*time.Time, error) {
|
||||
server, _ := getServer(ctx)
|
||||
t := formatDate(ctx, utils.LanguageTagFromServerKey(server), obj.CreatedAt)
|
||||
return &t, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) TribeHistory(ctx context.Context, server string, filter *models.TribeHistoryFilter) (*generated.TribeHistory, error) {
|
||||
var err error
|
||||
list := &generated.TribeHistory{}
|
||||
list.Items, list.Total, err = r.TribeHistoryUcase.Fetch(ctx, server, filter)
|
||||
return list, err
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
type PlayerHistoryRecord {
|
||||
player: Player @goField(forceResolver: true)
|
||||
totalVillages: Int!
|
||||
points: Int!
|
||||
rank: Int!
|
||||
rankAtt: Int!
|
||||
scoreAtt: Int!
|
||||
rankDef: Int!
|
||||
scoreDef: Int!
|
||||
rankSup: Int!
|
||||
scoreSup: Int!
|
||||
rankTotal: Int!
|
||||
scoreTotal: Int!
|
||||
tribe: Tribe @goField(forceResolver: true)
|
||||
createdAt: Time! @goField(forceResolver: true)
|
||||
}
|
||||
|
||||
type PlayerHistory {
|
||||
total: Int!
|
||||
items: [PlayerHistoryRecord!]
|
||||
}
|
||||
|
||||
input PlayerHistoryFilter {
|
||||
playerID: [Int!]
|
||||
playerIDNEQ: [Int!]
|
||||
|
||||
createdAt: Time
|
||||
createdAtGT: Time
|
||||
createdAtGTE: Time
|
||||
createdAtLT: Time
|
||||
createdAtLTE: Time
|
||||
|
||||
offset: Int
|
||||
limit: Int
|
||||
sort: String
|
||||
}
|
||||
|
||||
extend type Query {
|
||||
playerHistory(server: String!, filter: PlayerHistoryFilter): PlayerHistory!
|
||||
}
|
|
@ -13,6 +13,7 @@ type Tribe {
|
|||
rankDef: Int!
|
||||
scoreDef: Int!
|
||||
rankTotal: Int!
|
||||
dominance: Float!
|
||||
scoreTotal: Int!
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
type TribeHistoryRecord {
|
||||
tribe: Tribe @goField(forceResolver: true)
|
||||
totalVillages: Int!
|
||||
totalMembers: Int!
|
||||
points: Int!
|
||||
allPoints: Int!
|
||||
rank: Int!
|
||||
dominance: Float!
|
||||
rankAtt: Int!
|
||||
scoreAtt: Int!
|
||||
rankDef: Int!
|
||||
scoreDef: Int!
|
||||
rankTotal: Int!
|
||||
scoreTotal: Int!
|
||||
createdAt: Time! @goField(forceResolver: true)
|
||||
}
|
||||
|
||||
type TribeHistory {
|
||||
total: Int!
|
||||
items: [TribeHistoryRecord!]
|
||||
}
|
||||
|
||||
input TribeHistoryFilter {
|
||||
tribeID: [Int!]
|
||||
tribeIDNEQ: [Int!]
|
||||
|
||||
createdAt: Time
|
||||
createdAtGT: Time
|
||||
createdAtGTE: Time
|
||||
createdAtLT: Time
|
||||
createdAtLTE: Time
|
||||
|
||||
offset: Int
|
||||
limit: Int
|
||||
sort: String
|
||||
}
|
||||
|
||||
extend type Query {
|
||||
tribeHistory(server: String!, filter: TribeHistoryFilter): TribeHistory!
|
||||
}
|
8
main.go
8
main.go
|
@ -26,10 +26,14 @@ import (
|
|||
"github.com/tribalwarshelp/api/middleware"
|
||||
playerrepo "github.com/tribalwarshelp/api/player/repository"
|
||||
playerucase "github.com/tribalwarshelp/api/player/usecase"
|
||||
playerhistoryrepo "github.com/tribalwarshelp/api/playerhistory/repository"
|
||||
playerhistoryucase "github.com/tribalwarshelp/api/playerhistory/usecase"
|
||||
serverrepo "github.com/tribalwarshelp/api/server/repository"
|
||||
serverucase "github.com/tribalwarshelp/api/server/usecase"
|
||||
triberepo "github.com/tribalwarshelp/api/tribe/repository"
|
||||
tribeucase "github.com/tribalwarshelp/api/tribe/usecase"
|
||||
tribehistoryrepo "github.com/tribalwarshelp/api/tribehistory/repository"
|
||||
tribehistoryucase "github.com/tribalwarshelp/api/tribehistory/usecase"
|
||||
villagerepo "github.com/tribalwarshelp/api/village/repository"
|
||||
villageucase "github.com/tribalwarshelp/api/village/usecase"
|
||||
|
||||
|
@ -86,6 +90,8 @@ func main() {
|
|||
playerRepo := playerrepo.NewPGRepository(db)
|
||||
villageRepo := villagerepo.NewPGRepository(db)
|
||||
ennoblementRepo := ennoblementrepo.NewPGRepository(db)
|
||||
tribehistoryRepo := tribehistoryrepo.NewPGRepository(db)
|
||||
playerhistoryRepo := playerhistoryrepo.NewPGRepository(db)
|
||||
liveennoblementRepo := liveennoblementrepo.NewPGRepository(db, redisClient)
|
||||
|
||||
router := gin.Default()
|
||||
|
@ -106,6 +112,8 @@ func main() {
|
|||
VillageUcase: villageucase.New(villageRepo),
|
||||
EnnoblementUcase: ennoblementucase.New(ennoblementRepo),
|
||||
LiveEnnoblementUcase: liveennoblementucase.New(liveennoblementRepo),
|
||||
TribeHistoryUcase: tribehistoryucase.New(tribehistoryRepo),
|
||||
PlayerHistoryUcase: playerhistoryucase.New(playerhistoryRepo),
|
||||
},
|
||||
})
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
package playerhistory
|
||||
|
||||
const (
|
||||
PaginationLimit = 100
|
||||
)
|
|
@ -0,0 +1,11 @@
|
|||
package playerhistory
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type Repository interface {
|
||||
Fetch(ctx context.Context, server string, filter *models.PlayerHistoryFilter) ([]*models.PlayerHistory, int, error)
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/tribalwarshelp/api/playerhistory"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type pgRepository struct {
|
||||
*pg.DB
|
||||
}
|
||||
|
||||
func NewPGRepository(db *pg.DB) playerhistory.Repository {
|
||||
return &pgRepository{db}
|
||||
}
|
||||
|
||||
func (repo *pgRepository) Fetch(ctx context.Context, server string, f *models.PlayerHistoryFilter) ([]*models.PlayerHistory, int, error) {
|
||||
var err error
|
||||
data := []*models.PlayerHistory{}
|
||||
query := repo.WithParam("SERVER", pg.Safe(server)).Model(&data).Context(ctx)
|
||||
|
||||
if f != nil {
|
||||
query = query.
|
||||
WhereStruct(f).
|
||||
Limit(f.Limit).
|
||||
Offset(f.Offset)
|
||||
|
||||
if f.Sort != "" {
|
||||
query = query.Order(f.Sort)
|
||||
}
|
||||
}
|
||||
|
||||
total, err := query.SelectAndCount()
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+server) {
|
||||
return nil, 0, fmt.Errorf("Server not found")
|
||||
}
|
||||
return nil, 0, errors.Wrap(err, "Internal server error")
|
||||
}
|
||||
|
||||
return data, total, nil
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package playerhistory
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type Usecase interface {
|
||||
Fetch(ctx context.Context, server string, filter *models.PlayerHistoryFilter) ([]*models.PlayerHistory, int, error)
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package usecase
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/api/playerhistory"
|
||||
"github.com/tribalwarshelp/api/utils"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type usecase struct {
|
||||
repo playerhistory.Repository
|
||||
}
|
||||
|
||||
func New(repo playerhistory.Repository) playerhistory.Usecase {
|
||||
return &usecase{repo}
|
||||
}
|
||||
|
||||
func (ucase *usecase) Fetch(ctx context.Context, server string, filter *models.PlayerHistoryFilter) ([]*models.PlayerHistory, int, error) {
|
||||
if filter == nil {
|
||||
filter = &models.PlayerHistoryFilter{}
|
||||
}
|
||||
if filter.Limit > playerhistory.PaginationLimit || filter.Limit <= 0 {
|
||||
filter.Limit = playerhistory.PaginationLimit
|
||||
}
|
||||
filter.Sort = utils.SanitizeSort(filter.Sort)
|
||||
return ucase.repo.Fetch(ctx, server, filter)
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package tribehistory
|
||||
|
||||
const (
|
||||
PaginationLimit = 100
|
||||
)
|
|
@ -0,0 +1,11 @@
|
|||
package tribehistory
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type Repository interface {
|
||||
Fetch(ctx context.Context, server string, filter *models.TribeHistoryFilter) ([]*models.TribeHistory, int, error)
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/tribalwarshelp/api/tribehistory"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type pgRepository struct {
|
||||
*pg.DB
|
||||
}
|
||||
|
||||
func NewPGRepository(db *pg.DB) tribehistory.Repository {
|
||||
return &pgRepository{db}
|
||||
}
|
||||
|
||||
func (repo *pgRepository) Fetch(ctx context.Context, server string, f *models.TribeHistoryFilter) ([]*models.TribeHistory, int, error) {
|
||||
var err error
|
||||
data := []*models.TribeHistory{}
|
||||
query := repo.WithParam("SERVER", pg.Safe(server)).Model(&data).Context(ctx)
|
||||
|
||||
if f != nil {
|
||||
query = query.
|
||||
WhereStruct(f).
|
||||
Limit(f.Limit).
|
||||
Offset(f.Offset)
|
||||
|
||||
if f.Sort != "" {
|
||||
query = query.Order(f.Sort)
|
||||
}
|
||||
}
|
||||
|
||||
total, err := query.SelectAndCount()
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+server) {
|
||||
return nil, 0, fmt.Errorf("Server not found")
|
||||
}
|
||||
return nil, 0, errors.Wrap(err, "Internal server error")
|
||||
}
|
||||
|
||||
return data, total, nil
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package tribehistory
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type Usecase interface {
|
||||
Fetch(ctx context.Context, server string, filter *models.TribeHistoryFilter) ([]*models.TribeHistory, int, error)
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package usecase
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tribalwarshelp/api/tribehistory"
|
||||
"github.com/tribalwarshelp/api/utils"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
type usecase struct {
|
||||
repo tribehistory.Repository
|
||||
}
|
||||
|
||||
func New(repo tribehistory.Repository) tribehistory.Usecase {
|
||||
return &usecase{repo}
|
||||
}
|
||||
|
||||
func (ucase *usecase) Fetch(ctx context.Context, server string, filter *models.TribeHistoryFilter) ([]*models.TribeHistory, int, error) {
|
||||
if filter == nil {
|
||||
filter = &models.TribeHistoryFilter{}
|
||||
}
|
||||
if filter.Limit > tribehistory.PaginationLimit || filter.Limit <= 0 {
|
||||
filter.Limit = tribehistory.PaginationLimit
|
||||
}
|
||||
filter.Sort = utils.SanitizeSort(filter.Sort)
|
||||
return ucase.repo.Fetch(ctx, server, filter)
|
||||
}
|
Reference in New Issue