- bump github.com/tribalwarshelp/shared
- delete liveennoblement usecase/repository - query `liveEnnoblements` is deprecated
This commit is contained in:
parent
2e92d09a2e
commit
f7f71e5b6c
|
@ -1,5 +1,5 @@
|
|||
package ennoblement
|
||||
|
||||
const (
|
||||
PaginationLimit = 100
|
||||
PaginationLimit = 200
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
4
go.mod
|
@ -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
10
go.sum
|
@ -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=
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -7,4 +7,5 @@ type LiveEnnoblement {
|
|||
|
||||
extend type Query {
|
||||
liveEnnoblements(server: String!): [LiveEnnoblement!]
|
||||
@deprecated(reason: "use `ennoblements` instead")
|
||||
}
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
package liveennoblement
|
||||
|
||||
const (
|
||||
EndpointGetConquer = "/interface.php?func=get_conquer&since=%d"
|
||||
)
|
|
@ -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)
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -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
23
main.go
|
@ -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)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
package player
|
||||
|
||||
const (
|
||||
PaginationLimit = 100
|
||||
PaginationLimit = 200
|
||||
)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
package tribe
|
||||
|
||||
const (
|
||||
PaginationLimit = 100
|
||||
PaginationLimit = 200
|
||||
)
|
||||
|
|
Reference in New Issue