- bump github.com/tribalwarshelp/shared

- delete liveennoblement usecase/repository
- query `liveEnnoblements` is deprecated
This commit is contained in:
Dawid Wysokiński 2021-01-15 18:59:24 +01:00
parent 2e92d09a2e
commit f7f71e5b6c
18 changed files with 46 additions and 198 deletions

View File

@ -1,5 +1,5 @@
package ennoblement
const (
PaginationLimit = 100
PaginationLimit = 200
)

View File

@ -8,4 +8,5 @@ import (
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Ennoblement, int, error)
FetchLiveEnnoblements(ctx context.Context, server string) ([]*models.LiveEnnoblement, error)
}

View File

@ -2,6 +2,7 @@ package usecase
import (
"context"
"time"
"github.com/tribalwarshelp/api/ennoblement"
"github.com/tribalwarshelp/api/middleware"
@ -28,3 +29,36 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg ennoblement.FetchConfig) ([
cfg.Sort = utils.SanitizeSortExpressions(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}
func (ucase *usecase) FetchLiveEnnoblements(ctx context.Context, server string) ([]*models.LiveEnnoblement, error) {
limit := 0
if !middleware.CanExceedLimit(ctx) {
limit = ennoblement.PaginationLimit
}
ennoblements, _, err := ucase.repo.Fetch(ctx, ennoblement.FetchConfig{
Server: server,
Count: false,
Filter: &models.EnnoblementFilter{
EnnobledAtGTE: time.Now().Add(-1 * time.Hour),
},
Limit: limit,
Sort: []string{"ennobled_at ASC"},
})
if err != nil {
return nil, err
}
return convertToLiveEnnoblements(ennoblements), nil
}
func convertToLiveEnnoblements(ennoblements []*models.Ennoblement) []*models.LiveEnnoblement {
lv := []*models.LiveEnnoblement{}
for _, e := range ennoblements {
lv = append(lv, &models.LiveEnnoblement{
VillageID: e.VillageID,
NewOwnerID: e.NewOwnerID,
OldOwnerID: e.OldOwnerID,
EnnobledAt: e.EnnobledAt,
})
}
return lv
}

4
go.mod
View File

@ -9,14 +9,14 @@ require (
github.com/go-pg/pg/extra/pgdebug v0.2.0
github.com/go-pg/pg/v10 v10.7.3
github.com/go-playground/validator/v10 v10.3.0 // indirect
github.com/go-redis/redis/v8 v8.4.4
github.com/joho/godotenv v1.3.0
github.com/json-iterator/go v1.1.10 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/onsi/gomega v1.10.4 // indirect
github.com/pkg/errors v0.9.1
github.com/tribalwarshelp/map-generator v0.0.0-20210106163923-fa048a59f5f2
github.com/tribalwarshelp/shared v0.0.0-20210113192528-c747617519f2
github.com/tribalwarshelp/shared v0.0.0-20210115163415-972e2df3f7db
github.com/vektah/gqlparser/v2 v2.1.0
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
)

10
go.sum
View File

@ -10,16 +10,12 @@ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/dgryski/trifles v0.0.0-20190318185328-a8d75aae118c h1:TUuUh0Xgj97tLMNtWtNvI9mIV6isjEb9lBMNv+77IGM=
github.com/dgryski/trifles v0.0.0-20190318185328-a8d75aae118c/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
@ -57,8 +53,6 @@ github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.3.0 h1:nZU+7q+yJoFmwvNgv/LnPUkwPal62+b2xXj0AU1Es7o=
github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-redis/redis/v8 v8.4.4 h1:fGqgxCTR1sydaKI00oQf3OmkU/DIe/I/fYXvGklCIuc=
github.com/go-redis/redis/v8 v8.4.4/go.mod h1:nA0bQuF0i5JFx4Ta9RZxGKXFrQ8cRWntra97f0196iY=
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
@ -184,8 +178,8 @@ github.com/tribalwarshelp/map-generator v0.0.0-20210106163923-fa048a59f5f2 h1:yY
github.com/tribalwarshelp/map-generator v0.0.0-20210106163923-fa048a59f5f2/go.mod h1:ywyp0CZ3JsJ+0GAbUJVWo3dipHcAohD7KkV2TNbiTHU=
github.com/tribalwarshelp/shared v0.0.0-20210106162314-d3488036ca2f h1:E8ahQd4yo3nB0eJMpL/M0s6iZaWMGmxga14kiqsHcQ4=
github.com/tribalwarshelp/shared v0.0.0-20210106162314-d3488036ca2f/go.mod h1:vtDs7EjEysk4dpFPfu3c4lkICXZYIRV0BrT7rsqG0dw=
github.com/tribalwarshelp/shared v0.0.0-20210113192528-c747617519f2 h1:qBJGQiXhhKox/E4Bt+8uYhsOic9QcBLNMYO7LekCudg=
github.com/tribalwarshelp/shared v0.0.0-20210113192528-c747617519f2/go.mod h1:vtDs7EjEysk4dpFPfu3c4lkICXZYIRV0BrT7rsqG0dw=
github.com/tribalwarshelp/shared v0.0.0-20210115163415-972e2df3f7db h1:RzMEF4BP3YJ7jJOyYO00TdeB6DY7g0Dp/8cQ8t6WKzw=
github.com/tribalwarshelp/shared v0.0.0-20210115163415-972e2df3f7db/go.mod h1:vtDs7EjEysk4dpFPfu3c4lkICXZYIRV0BrT7rsqG0dw=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=

View File

@ -3649,6 +3649,7 @@ extend type Query {
extend type Query {
liveEnnoblements(server: String!): [LiveEnnoblement!]
@deprecated(reason: "use ` + "`" + `ennoblements` + "`" + ` instead")
}
`, BuiltIn: false},
{Name: "schema/player.graphql", Input: `type PlayerNameChange {

View File

@ -31,5 +31,5 @@ func (r *liveEnnoblementResolver) Village(ctx context.Context, obj *models.LiveE
}
func (r *queryResolver) LiveEnnoblements(ctx context.Context, server string) ([]*models.LiveEnnoblement, error) {
return r.LiveEnnoblementUcase.Fetch(ctx, server)
return r.EnnoblementUcase.FetchLiveEnnoblements(ctx, server)
}

View File

@ -5,7 +5,6 @@ import (
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/api/ennoblement"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/liveennoblement"
"github.com/tribalwarshelp/api/player"
"github.com/tribalwarshelp/api/playerhistory"
"github.com/tribalwarshelp/api/server"
@ -27,7 +26,6 @@ type Resolver struct {
PlayerUcase player.Usecase
TribeUcase tribe.Usecase
VillageUcase village.Usecase
LiveEnnoblementUcase liveennoblement.Usecase
EnnoblementUcase ennoblement.Usecase
PlayerHistoryUcase playerhistory.Usecase
TribeHistoryUcase tribehistory.Usecase

View File

@ -7,4 +7,5 @@ type LiveEnnoblement {
extend type Query {
liveEnnoblements(server: String!): [LiveEnnoblement!]
@deprecated(reason: "use `ennoblements` instead")
}

View File

@ -1,5 +0,0 @@
package liveennoblement
const (
EndpointGetConquer = "/interface.php?func=get_conquer&since=%d"
)

View File

@ -1,11 +0,0 @@
package liveennoblement
import (
"context"
"github.com/tribalwarshelp/shared/models"
)
type Repository interface {
Fetch(ctx context.Context, server string) ([]*models.LiveEnnoblement, error)
}

View File

@ -1,18 +0,0 @@
package repository
import (
"github.com/tribalwarshelp/shared/models"
)
func convertToLiveEnnoblements(ennoblements []*models.Ennoblement) []*models.LiveEnnoblement {
lv := []*models.LiveEnnoblement{}
for _, e := range ennoblements {
lv = append(lv, &models.LiveEnnoblement{
VillageID: e.VillageID,
NewOwnerID: e.NewOwnerID,
OldOwnerID: e.OldOwnerID,
EnnobledAt: e.EnnobledAt,
})
}
return lv
}

View File

@ -1,93 +0,0 @@
package repository
import (
"context"
"encoding/json"
"fmt"
"time"
"github.com/go-redis/redis/v8"
"github.com/tribalwarshelp/api/liveennoblement"
"github.com/go-pg/pg/v10"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/dataloader"
)
var (
cacheKey = "ennoblements-%s"
expiration = time.Second * 15
)
type pgRepository struct {
*pg.DB
cache redis.UniversalClient
}
func NewPGRepository(db *pg.DB, cache redis.UniversalClient) liveennoblement.Repository {
return &pgRepository{db, cache}
}
func (repo *pgRepository) Fetch(ctx context.Context, server string) ([]*models.LiveEnnoblement, error) {
if liveennoblements, loaded := repo.loadLiveEnnoblementsFromCache(server); loaded {
return liveennoblements, nil
}
s := &models.Server{}
if err := repo.Model(s).Where("key = ?", server).Relation("Version").Select(); err != nil {
if err == pg.ErrNoRows {
return nil, fmt.Errorf("Server not found")
}
return nil, fmt.Errorf("Internal server error")
}
if s.Status == models.ServerStatusClosed {
return []*models.LiveEnnoblement{}, nil
}
dl := dataloader.New(&dataloader.Config{
BaseURL: "https://" + s.Key + "." + s.Version.Host,
})
ennoblements, err := dl.LoadEnnoblements(&dataloader.LoadEnnoblementsConfig{
EnnobledAtGTE: time.Now().Add(-1 * time.Hour),
})
if err != nil {
return nil, fmt.Errorf("Cannot load ennoblements for the server '%s' at the moment, please try again later", s.Key)
}
liveEnnoblements := convertToLiveEnnoblements(ennoblements)
go repo.cacheLiveEnnoblements(server, liveEnnoblements)
return liveEnnoblements, nil
}
func (repo *pgRepository) loadLiveEnnoblementsFromCache(server string) ([]*models.LiveEnnoblement, bool) {
ennoblementsJSON, err := repo.
cache.
Get(context.Background(), fmt.Sprintf(cacheKey, server)).
Result()
if err != nil || ennoblementsJSON == "" {
return nil, false
}
ennoblements := []*models.LiveEnnoblement{}
if json.Unmarshal([]byte(ennoblementsJSON), &ennoblements) != nil {
return nil, false
}
return ennoblements, true
}
func (repo *pgRepository) cacheLiveEnnoblements(server string, ennoblements []*models.LiveEnnoblement) error {
ennoblementsJSON, err := json.Marshal(&ennoblements)
if err != nil {
return errors.Wrap(err, "cacheLiveEnnoblements")
}
if err := repo.
cache.
Set(context.Background(), fmt.Sprintf(cacheKey, server), ennoblementsJSON, expiration).
Err(); err != nil {
return errors.Wrap(err, "cacheLiveEnnoblements")
}
return nil
}

View File

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

View File

@ -1,22 +0,0 @@
package usecase
import (
"context"
"github.com/tribalwarshelp/api/liveennoblement"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
repo liveennoblement.Repository
}
func New(repo liveennoblement.Repository) liveennoblement.Usecase {
return &usecase{
repo,
}
}
func (ucase *usecase) Fetch(ctx context.Context, server string) ([]*models.LiveEnnoblement, error) {
return ucase.repo.Fetch(ctx, server)
}

23
main.go
View File

@ -15,8 +15,6 @@ import (
"github.com/gin-contrib/cors"
servermaphttpdelivery "github.com/tribalwarshelp/api/servermap/delivery/http"
"github.com/go-redis/redis/v8"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/mode"
httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http"
@ -30,8 +28,6 @@ import (
dailytribestatsucase "github.com/tribalwarshelp/api/dailytribestats/usecase"
ennoblementrepo "github.com/tribalwarshelp/api/ennoblement/repository"
ennoblementucase "github.com/tribalwarshelp/api/ennoblement/usecase"
liveennoblementrepo "github.com/tribalwarshelp/api/liveennoblement/repository"
liveennoblementucase "github.com/tribalwarshelp/api/liveennoblement/usecase"
"github.com/tribalwarshelp/api/middleware"
playerrepo "github.com/tribalwarshelp/api/player/repository"
playerucase "github.com/tribalwarshelp/api/player/usecase"
@ -86,21 +82,6 @@ func main() {
})
}
redisClient := redis.NewClient(&redis.Options{
Addr: os.Getenv("REDIS_HOST") + ":" + os.Getenv("REDIS_PORT"),
Password: os.Getenv("REDIS_PASSWORD"),
})
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
if err := redisClient.Ping(ctx).Err(); err != nil {
log.Fatal(errors.Wrap(err, "cannot connect to redis"))
}
cancel()
defer func() {
if err := redisClient.Close(); err != nil {
log.Fatal(err)
}
}()
versionRepo, err := versionrepo.NewPGRepository(db)
if err != nil {
log.Fatal(err)
@ -119,7 +100,6 @@ func main() {
tribeChangeRepo := tribechangerepo.NewPGRepository(db)
dailyPlayerStatsRepo := dailyplayerstatsrepo.NewPGRepository(db)
dailyTribeStatsRepo := dailytribestatsrepo.NewPGRepository(db)
liveennoblementRepo := liveennoblementrepo.NewPGRepository(db, redisClient)
serverUcase := serverucase.New(serverRepo)
@ -164,7 +144,6 @@ func main() {
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),
@ -191,7 +170,7 @@ func main() {
<-quit
log.Println("Shutdown Server ...")
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)

View File

@ -1,5 +1,5 @@
package player
const (
PaginationLimit = 100
PaginationLimit = 200
)

View File

@ -1,5 +1,5 @@
package tribe
const (
PaginationLimit = 100
PaginationLimit = 200
)