2020-06-02 15:45:21 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2021-05-05 17:32:45 +00:00
|
|
|
"github.com/Kichiyaki/appmode"
|
|
|
|
"github.com/Kichiyaki/goutil/envutil"
|
2021-04-23 18:55:06 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2020-06-02 15:45:21 +00:00
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
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"
|
2021-04-23 18:55:06 +00:00
|
|
|
|
2020-06-22 15:59:56 +00:00
|
|
|
servermaphttpdelivery "github.com/tribalwarshelp/api/servermap/delivery/http"
|
|
|
|
|
2020-06-02 15:45:21 +00:00
|
|
|
httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http"
|
|
|
|
"github.com/tribalwarshelp/api/graphql/resolvers"
|
|
|
|
|
2021-05-10 21:15:55 +00:00
|
|
|
"github.com/tribalwarshelp/api/graphql/dataloader"
|
2020-06-02 15:45:21 +00:00
|
|
|
|
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-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"
|
|
|
|
"github.com/joho/godotenv"
|
|
|
|
|
2021-08-22 14:30:45 +00:00
|
|
|
"github.com/Kichiyaki/ginlogrus"
|
|
|
|
"github.com/Kichiyaki/go-pg-logrus-query-logger/v10"
|
2020-06-02 15:45:21 +00:00
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
os.Setenv("TZ", "UTC")
|
|
|
|
|
2021-05-05 17:32:45 +00:00
|
|
|
if appmode.Equals(appmode.DevelopmentMode) {
|
2021-04-23 18:55:06 +00:00
|
|
|
godotenv.Load(".env.local")
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
2021-04-23 18:55:06 +00:00
|
|
|
|
|
|
|
setupLogger()
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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"),
|
2021-05-05 17:32:45 +00:00
|
|
|
PoolSize: envutil.GetenvInt("DB_POOL_SIZE"),
|
2020-06-02 15:45:21 +00:00
|
|
|
})
|
|
|
|
defer func() {
|
|
|
|
if err := db.Close(); err != nil {
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Fatalln("Couldn't close the db connections:", err)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
|
|
|
}()
|
2020-08-09 13:10:44 +00:00
|
|
|
if strings.ToUpper(os.Getenv("LOG_DB_QUERIES")) == "TRUE" {
|
2021-08-22 14:30:45 +00:00
|
|
|
db.AddQueryHook(querylogger.Logger{
|
2021-04-28 18:10:09 +00:00
|
|
|
Log: logrus.NewEntry(logrus.StandardLogger()),
|
|
|
|
MaxQueryLength: 5000,
|
2021-01-06 16:43:02 +00:00
|
|
|
})
|
2020-08-09 13:10:44 +00:00
|
|
|
}
|
2020-06-24 13:05:31 +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 {
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Fatal(err)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
|
|
|
serverRepo, err := serverrepo.NewPGRepository(db)
|
|
|
|
if err != nil {
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Fatal(err)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
|
|
|
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-02 15:45:21 +00:00
|
|
|
|
2020-06-22 15:59:56 +00:00
|
|
|
serverUcase := serverucase.New(serverRepo)
|
|
|
|
|
2021-04-23 18:55:06 +00:00
|
|
|
router := gin.New()
|
2021-05-29 06:29:51 +00:00
|
|
|
router.Use(gin.Recovery())
|
|
|
|
if !envutil.GetenvBool("DISABLE_ACCESS_LOG") {
|
|
|
|
router.Use(ginlogrus.Logger(logrus.StandardLogger()))
|
|
|
|
}
|
2021-05-05 17:32:45 +00:00
|
|
|
if appmode.Equals(appmode.DevelopmentMode) {
|
2020-07-04 12:45:28 +00:00
|
|
|
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("")
|
2021-03-20 17:13:45 +00:00
|
|
|
graphql.Use(
|
|
|
|
middleware.DataLoadersToContext(
|
|
|
|
middleware.DataLoadersToContextConfig{
|
|
|
|
ServerRepo: serverRepo,
|
|
|
|
},
|
2021-05-10 21:15:55 +00:00
|
|
|
dataloader.Config{
|
2021-03-20 17:13:45 +00:00
|
|
|
PlayerRepo: playerRepo,
|
|
|
|
TribeRepo: tribeRepo,
|
|
|
|
VillageRepo: villageRepo,
|
|
|
|
VersionRepo: versionRepo,
|
|
|
|
},
|
|
|
|
),
|
|
|
|
)
|
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),
|
|
|
|
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() {
|
|
|
|
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Fatalf("listen: %s\n", err)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
|
|
|
}()
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Info("Server is listening on the port 8080")
|
2020-06-02 15:45:21 +00:00
|
|
|
|
|
|
|
quit := make(chan os.Signal)
|
|
|
|
signal.Notify(quit, os.Interrupt)
|
|
|
|
<-quit
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Info("Shutdown Server ...")
|
2020-06-02 15:45:21 +00:00
|
|
|
|
2021-01-15 17:59:24 +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 {
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Fatalln("Couldn't shutdown the server", err)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.Println("Server exiting")
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
2020-12-22 17:20:03 +00:00
|
|
|
|
2021-04-23 18:55:06 +00:00
|
|
|
func setupLogger() {
|
2021-05-05 17:32:45 +00:00
|
|
|
if appmode.Equals(appmode.DevelopmentMode) {
|
2021-04-23 18:55:06 +00:00
|
|
|
logrus.SetLevel(logrus.DebugLevel)
|
|
|
|
}
|
|
|
|
|
|
|
|
timestampFormat := "2006-01-02 15:04:05"
|
2021-05-05 17:32:45 +00:00
|
|
|
if appmode.Equals(appmode.ProductionMode) {
|
2021-04-23 18:55:06 +00:00
|
|
|
customFormatter := new(logrus.JSONFormatter)
|
|
|
|
customFormatter.TimestampFormat = timestampFormat
|
|
|
|
logrus.SetFormatter(customFormatter)
|
|
|
|
} else {
|
|
|
|
customFormatter := new(logrus.TextFormatter)
|
|
|
|
customFormatter.TimestampFormat = timestampFormat
|
|
|
|
customFormatter.FullTimestamp = true
|
|
|
|
logrus.SetFormatter(customFormatter)
|
|
|
|
}
|
|
|
|
}
|