add playerhistory and tribehistory

This commit is contained in:
Dawid Wysokiński 2020-06-21 13:27:08 +02:00
parent 52b6f59d94
commit ca2cb4debe
20 changed files with 2641 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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"`

View File

@ -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

View File

@ -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
}

View File

@ -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 }

View File

@ -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
}

View File

@ -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!
}

View File

@ -13,6 +13,7 @@ type Tribe {
rankDef: Int!
scoreDef: Int!
rankTotal: Int!
dominance: Float!
scoreTotal: Int!
}

View File

@ -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!
}

View File

@ -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),
},
})

View File

@ -0,0 +1,5 @@
package playerhistory
const (
PaginationLimit = 100
)

View File

@ -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)
}

View File

@ -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
}

11
playerhistory/usecase.go Normal file
View File

@ -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)
}

View File

@ -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)
}

View File

@ -0,0 +1,5 @@
package tribehistory
const (
PaginationLimit = 100
)

View File

@ -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)
}

View File

@ -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
}

11
tribehistory/usecase.go Normal file
View File

@ -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)
}

View File

@ -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)
}