2020-06-02 15:45:21 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
2020-12-22 17:23:46 +00:00
|
|
|
"strconv"
|
2020-08-09 12:32:46 +00:00
|
|
|
"strings"
|
2020-06-02 15:45:21 +00:00
|
|
|
"time"
|
|
|
|
|
2020-07-04 12:45:28 +00:00
|
|
|
"github.com/gin-contrib/cors"
|
2020-06-22 15:59:56 +00:00
|
|
|
servermaphttpdelivery "github.com/tribalwarshelp/api/servermap/delivery/http"
|
|
|
|
|
2020-06-12 16:26:48 +00:00
|
|
|
"github.com/go-redis/redis/v8"
|
|
|
|
"github.com/pkg/errors"
|
2020-06-02 15:45:21 +00:00
|
|
|
"github.com/tribalwarshelp/shared/mode"
|
|
|
|
|
|
|
|
httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http"
|
|
|
|
"github.com/tribalwarshelp/api/graphql/resolvers"
|
|
|
|
|
|
|
|
"github.com/tribalwarshelp/api/graphql/dataloaders"
|
|
|
|
|
2020-06-25 14:02:00 +00:00
|
|
|
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"
|
2020-06-21 10:26:57 +00:00
|
|
|
ennoblementrepo "github.com/tribalwarshelp/api/ennoblement/repository"
|
|
|
|
ennoblementucase "github.com/tribalwarshelp/api/ennoblement/usecase"
|
2020-06-21 09:30:01 +00:00
|
|
|
liveennoblementrepo "github.com/tribalwarshelp/api/liveennoblement/repository"
|
|
|
|
liveennoblementucase "github.com/tribalwarshelp/api/liveennoblement/usecase"
|
2020-06-02 15:45:21 +00:00
|
|
|
"github.com/tribalwarshelp/api/middleware"
|
|
|
|
playerrepo "github.com/tribalwarshelp/api/player/repository"
|
|
|
|
playerucase "github.com/tribalwarshelp/api/player/usecase"
|
2020-06-21 11:27:08 +00:00
|
|
|
playerhistoryrepo "github.com/tribalwarshelp/api/playerhistory/repository"
|
|
|
|
playerhistoryucase "github.com/tribalwarshelp/api/playerhistory/usecase"
|
2020-06-02 15:45:21 +00:00
|
|
|
serverrepo "github.com/tribalwarshelp/api/server/repository"
|
|
|
|
serverucase "github.com/tribalwarshelp/api/server/usecase"
|
2020-06-22 15:59:56 +00:00
|
|
|
servermapucase "github.com/tribalwarshelp/api/servermap/usecase"
|
2020-06-21 11:51:26 +00:00
|
|
|
serverstatsrepo "github.com/tribalwarshelp/api/serverstats/repository"
|
|
|
|
serverstatsucase "github.com/tribalwarshelp/api/serverstats/usecase"
|
2020-06-02 15:45:21 +00:00
|
|
|
triberepo "github.com/tribalwarshelp/api/tribe/repository"
|
|
|
|
tribeucase "github.com/tribalwarshelp/api/tribe/usecase"
|
2020-06-24 13:25:31 +00:00
|
|
|
tribechangerepo "github.com/tribalwarshelp/api/tribechange/repository"
|
|
|
|
tribechangeucase "github.com/tribalwarshelp/api/tribechange/usecase"
|
2020-06-21 11:27:08 +00:00
|
|
|
tribehistoryrepo "github.com/tribalwarshelp/api/tribehistory/repository"
|
|
|
|
tribehistoryucase "github.com/tribalwarshelp/api/tribehistory/usecase"
|
2020-11-06 19:23:12 +00:00
|
|
|
versionrepo "github.com/tribalwarshelp/api/version/repository"
|
|
|
|
versionucase "github.com/tribalwarshelp/api/version/usecase"
|
2020-06-02 15:45:21 +00:00
|
|
|
villagerepo "github.com/tribalwarshelp/api/village/repository"
|
|
|
|
villageucase "github.com/tribalwarshelp/api/village/usecase"
|
|
|
|
|
|
|
|
"github.com/go-pg/pg/v10"
|
2020-08-09 13:10:44 +00:00
|
|
|
"github.com/go-pg/pg/v10/pgext"
|
2020-06-02 15:45:21 +00:00
|
|
|
"github.com/joho/godotenv"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
os.Setenv("TZ", "UTC")
|
|
|
|
|
|
|
|
if mode.Get() == mode.DevelopmentMode {
|
|
|
|
godotenv.Load(".env.development")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
db := pg.Connect(&pg.Options{
|
|
|
|
User: os.Getenv("DB_USER"),
|
|
|
|
Password: os.Getenv("DB_PASSWORD"),
|
|
|
|
Database: os.Getenv("DB_NAME"),
|
|
|
|
Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"),
|
2020-12-22 17:20:03 +00:00
|
|
|
PoolSize: mustParseEnvToInt("DB_POOL_SIZE"),
|
2020-06-02 15:45:21 +00:00
|
|
|
})
|
|
|
|
defer func() {
|
|
|
|
if err := db.Close(); err != nil {
|
|
|
|
log.Fatal("Database disconnecting:", err)
|
|
|
|
}
|
|
|
|
}()
|
2020-08-09 13:10:44 +00:00
|
|
|
if strings.ToUpper(os.Getenv("LOG_DB_QUERIES")) == "TRUE" {
|
|
|
|
db.AddQueryHook(pgext.DebugHook{})
|
|
|
|
}
|
2020-06-24 13:05:31 +00:00
|
|
|
|
2020-06-12 16:26:48 +00:00
|
|
|
redisClient := redis.NewClient(&redis.Options{
|
|
|
|
Addr: os.Getenv("REDIS_HOST") + ":" + os.Getenv("REDIS_PORT"),
|
|
|
|
Password: os.Getenv("REDIS_PASSWORD"),
|
|
|
|
})
|
2020-06-24 13:25:31 +00:00
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
2020-06-12 16:26:48 +00:00
|
|
|
if err := redisClient.Ping(ctx).Err(); err != nil {
|
2020-06-24 13:05:31 +00:00
|
|
|
log.Fatal(errors.Wrap(err, "cannot connect to redis"))
|
2020-06-12 16:26:48 +00:00
|
|
|
}
|
2020-06-24 13:25:31 +00:00
|
|
|
cancel()
|
2020-06-12 16:26:48 +00:00
|
|
|
defer func() {
|
|
|
|
if err := redisClient.Close(); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}()
|
2020-06-02 15:45:21 +00:00
|
|
|
|
2020-11-06 19:23:12 +00:00
|
|
|
versionRepo, err := versionrepo.NewPGRepository(db)
|
2020-06-02 15:45:21 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
serverRepo, err := serverrepo.NewPGRepository(db)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
tribeRepo := triberepo.NewPGRepository(db)
|
|
|
|
playerRepo := playerrepo.NewPGRepository(db)
|
|
|
|
villageRepo := villagerepo.NewPGRepository(db)
|
2020-06-21 10:26:57 +00:00
|
|
|
ennoblementRepo := ennoblementrepo.NewPGRepository(db)
|
2020-06-21 11:27:08 +00:00
|
|
|
tribehistoryRepo := tribehistoryrepo.NewPGRepository(db)
|
|
|
|
playerhistoryRepo := playerhistoryrepo.NewPGRepository(db)
|
2020-06-21 11:51:26 +00:00
|
|
|
serverstatsRepo := serverstatsrepo.NewPGRepository(db)
|
2020-06-24 13:25:31 +00:00
|
|
|
tribeChangeRepo := tribechangerepo.NewPGRepository(db)
|
2020-06-25 14:02:00 +00:00
|
|
|
dailyPlayerStatsRepo := dailyplayerstatsrepo.NewPGRepository(db)
|
|
|
|
dailyTribeStatsRepo := dailytribestatsrepo.NewPGRepository(db)
|
2020-06-21 09:30:01 +00:00
|
|
|
liveennoblementRepo := liveennoblementrepo.NewPGRepository(db, redisClient)
|
2020-06-02 15:45:21 +00:00
|
|
|
|
2020-06-22 15:59:56 +00:00
|
|
|
serverUcase := serverucase.New(serverRepo)
|
|
|
|
|
2020-06-02 15:45:21 +00:00
|
|
|
router := gin.Default()
|
2020-07-04 12:45:28 +00:00
|
|
|
if mode.Get() == mode.DevelopmentMode {
|
|
|
|
router.Use(cors.New(cors.Config{
|
|
|
|
AllowOriginFunc: func(string) bool {
|
|
|
|
return true
|
|
|
|
},
|
|
|
|
AllowCredentials: true,
|
|
|
|
ExposeHeaders: []string{"X-Access-Token", "X-Refresh-Token"},
|
|
|
|
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
|
|
|
|
AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
|
|
|
|
AllowWebSockets: true,
|
|
|
|
}))
|
|
|
|
}
|
2020-06-22 15:59:56 +00:00
|
|
|
rest := router.Group("")
|
|
|
|
servermaphttpdelivery.Attach(servermaphttpdelivery.Config{
|
|
|
|
RouterGroup: rest,
|
|
|
|
MapUsecase: servermapucase.New(villageRepo),
|
|
|
|
ServerUsecase: serverUcase,
|
|
|
|
})
|
|
|
|
graphql := router.Group("")
|
2020-07-28 10:52:08 +00:00
|
|
|
graphql.Use(middleware.DataLoadersToContext(middleware.DataLoadersToContextConfig{
|
2020-08-07 08:09:45 +00:00
|
|
|
ServerRepo: serverRepo,
|
2020-07-28 10:52:08 +00:00
|
|
|
},
|
|
|
|
dataloaders.Config{
|
2020-11-06 19:23:12 +00:00
|
|
|
PlayerRepo: playerRepo,
|
|
|
|
TribeRepo: tribeRepo,
|
|
|
|
VillageRepo: villageRepo,
|
|
|
|
VersionRepo: versionRepo,
|
2020-07-28 10:52:08 +00:00
|
|
|
}))
|
2020-08-09 12:32:46 +00:00
|
|
|
graphql.Use(middleware.LimitWhitelist(middleware.LimitWhitelistConfig{
|
|
|
|
IPAddresses: strings.Split(os.Getenv("LIMIT_WHITELIST"), ","),
|
|
|
|
}))
|
2020-06-03 15:21:28 +00:00
|
|
|
httpdelivery.Attach(httpdelivery.Config{
|
2020-06-22 15:59:56 +00:00
|
|
|
RouterGroup: graphql,
|
2020-06-03 15:21:28 +00:00
|
|
|
Resolver: &resolvers.Resolver{
|
2020-11-06 19:23:12 +00:00
|
|
|
VersionUcase: versionucase.New(versionRepo),
|
2020-06-25 14:02:00 +00:00
|
|
|
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),
|
2020-06-03 15:21:28 +00:00
|
|
|
},
|
2020-06-02 15:45:21 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
srv := &http.Server{
|
|
|
|
Addr: ":8080",
|
|
|
|
Handler: router,
|
|
|
|
}
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
// service connections
|
|
|
|
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
|
|
log.Fatalf("listen: %s\n", err)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
quit := make(chan os.Signal)
|
|
|
|
signal.Notify(quit, os.Interrupt)
|
|
|
|
<-quit
|
|
|
|
log.Println("Shutdown Server ...")
|
|
|
|
|
2020-06-24 13:25:31 +00:00
|
|
|
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
|
2020-06-02 15:45:21 +00:00
|
|
|
defer cancel()
|
|
|
|
if err := srv.Shutdown(ctx); err != nil {
|
|
|
|
log.Fatal("Server Shutdown:", err)
|
|
|
|
}
|
|
|
|
log.Println("Server exiting")
|
|
|
|
}
|
2020-12-22 17:20:03 +00:00
|
|
|
|
|
|
|
func mustParseEnvToInt(key string) int {
|
|
|
|
str := os.Getenv(key)
|
|
|
|
if str == "" {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
i, err := strconv.Atoi(str)
|
|
|
|
if err != nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return i
|
2020-12-22 17:23:46 +00:00
|
|
|
}
|