This repository has been archived on 2022-09-04. You can view files and clone it, but cannot push or open issues or pull requests.
api/main.go

210 lines
7.0 KiB
Go
Raw Normal View History

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"
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"
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"
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"
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"
servermapucase "github.com/tribalwarshelp/api/servermap/usecase"
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"
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/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)
}
}()
if strings.ToUpper(os.Getenv("LOG_DB_QUERIES")) == "TRUE" {
db.AddQueryHook(pgext.DebugHook{})
}
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"),
})
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 {
log.Fatal(errors.Wrap(err, "cannot connect to redis"))
2020-06-12 16:26:48 +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)
ennoblementRepo := ennoblementrepo.NewPGRepository(db)
2020-06-21 11:27:08 +00:00
tribehistoryRepo := tribehistoryrepo.NewPGRepository(db)
playerhistoryRepo := playerhistoryrepo.NewPGRepository(db)
serverstatsRepo := serverstatsrepo.NewPGRepository(db)
tribeChangeRepo := tribechangerepo.NewPGRepository(db)
dailyPlayerStatsRepo := dailyplayerstatsrepo.NewPGRepository(db)
dailyTribeStatsRepo := dailytribestatsrepo.NewPGRepository(db)
liveennoblementRepo := liveennoblementrepo.NewPGRepository(db, redisClient)
2020-06-02 15:45:21 +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,
}))
}
rest := router.Group("")
servermaphttpdelivery.Attach(servermaphttpdelivery.Config{
RouterGroup: rest,
MapUsecase: servermapucase.New(villageRepo),
ServerUsecase: serverUcase,
})
graphql := router.Group("")
graphql.Use(middleware.DataLoadersToContext(middleware.DataLoadersToContextConfig{
ServerRepo: serverRepo,
},
dataloaders.Config{
2020-11-06 19:23:12 +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{
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),
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 ...")
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
}