This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
backend/main.go

208 lines
6.2 KiB
Go
Raw Normal View History

2021-02-21 09:17:54 +00:00
package main
import (
"context"
"github.com/Kichiyaki/appmode"
"github.com/Kichiyaki/goutil/envutil"
2021-02-21 09:17:54 +00:00
"net/http"
"os"
"os/signal"
"time"
2021-05-02 07:15:10 +00:00
graphqlhttpdelivery "github.com/zdam-egzamin-zawodowy/backend/internal/graphql/delivery/httpdelivery"
2021-03-06 13:02:48 +00:00
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/directive"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/resolvers"
"github.com/pkg/errors"
2021-05-21 21:04:01 +00:00
2021-03-06 13:02:48 +00:00
"github.com/zdam-egzamin-zawodowy/backend/internal/auth/jwt"
authusecase "github.com/zdam-egzamin-zawodowy/backend/internal/auth/usecase"
2021-03-06 09:33:47 +00:00
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
2021-03-06 13:02:48 +00:00
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/dataloader"
2021-05-02 07:15:10 +00:00
"github.com/zdam-egzamin-zawodowy/backend/internal/postgres"
2021-03-06 13:02:48 +00:00
professionrepository "github.com/zdam-egzamin-zawodowy/backend/internal/profession/repository"
professionusecase "github.com/zdam-egzamin-zawodowy/backend/internal/profession/usecase"
qualificationrepository "github.com/zdam-egzamin-zawodowy/backend/internal/qualification/repository"
qualificationusecase "github.com/zdam-egzamin-zawodowy/backend/internal/qualification/usecase"
questionrepository "github.com/zdam-egzamin-zawodowy/backend/internal/question/repository"
questionusecase "github.com/zdam-egzamin-zawodowy/backend/internal/question/usecase"
userrepository "github.com/zdam-egzamin-zawodowy/backend/internal/user/repository"
userusecase "github.com/zdam-egzamin-zawodowy/backend/internal/user/usecase"
"github.com/Kichiyaki/ginlogrus"
2021-02-21 09:17:54 +00:00
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
"github.com/sirupsen/logrus"
2021-05-21 21:04:01 +00:00
2021-07-16 15:44:41 +00:00
"github.com/zdam-egzamin-zawodowy/backend/fstorage"
2021-02-21 09:17:54 +00:00
)
func init() {
os.Setenv("TZ", "UTC")
if appmode.Equals(appmode.DevelopmentMode) {
2021-02-21 09:17:54 +00:00
godotenv.Load(".env.local")
}
setupLogger()
}
func main() {
2021-05-02 07:15:10 +00:00
fileStorage := fstorage.New(&fstorage.Config{
BasePath: envutil.GetenvString("FILE_STORAGE_PATH"),
2021-03-06 13:02:48 +00:00
})
2021-05-02 07:15:10 +00:00
dbConn, err := postgres.Connect(&postgres.Config{
2021-05-02 06:36:10 +00:00
LogQueries: envutil.GetenvBool("LOG_DB_QUERIES"),
})
if err != nil {
2021-04-25 16:29:50 +00:00
logrus.Fatal(errors.Wrap(err, "Couldn't connect to the db"))
}
2021-03-06 13:02:48 +00:00
//repositories
userRepository, err := userrepository.NewPGRepository(&userrepository.PGRepositoryConfig{
DB: dbConn,
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "userRepository"))
2021-03-06 13:02:48 +00:00
}
professionRepository, err := professionrepository.NewPGRepository(&professionrepository.PGRepositoryConfig{
DB: dbConn,
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "professionRepository"))
2021-03-06 13:02:48 +00:00
}
qualificationRepository, err := qualificationrepository.NewPGRepository(&qualificationrepository.PGRepositoryConfig{
DB: dbConn,
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "qualificationRepository"))
2021-03-06 13:02:48 +00:00
}
questionRepository, err := questionrepository.NewPGRepository(&questionrepository.PGRepositoryConfig{
DB: dbConn,
FileStorage: fileStorage,
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "questionRepository"))
2021-03-06 13:02:48 +00:00
}
//usecases
authUsecase, err := authusecase.New(&authusecase.Config{
UserRepository: userRepository,
TokenGenerator: jwt.NewTokenGenerator(envutil.GetenvString("ACCESS_SECRET")),
2021-03-06 13:02:48 +00:00
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "authUsecase"))
2021-03-06 13:02:48 +00:00
}
userUsecase, err := userusecase.New(&userusecase.Config{
UserRepository: userRepository,
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "userUsecase"))
2021-03-06 13:02:48 +00:00
}
professionUsecase, err := professionusecase.New(&professionusecase.Config{
ProfessionRepository: professionRepository,
})
if err != nil {
logrus.Fatal(err)
}
qualificationUsecase, err := qualificationusecase.New(&qualificationusecase.Config{
QualificationRepository: qualificationRepository,
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "qualificationUsecase"))
2021-03-06 13:02:48 +00:00
}
questionUsecase, err := questionusecase.New(&questionusecase.Config{
QuestionRepository: questionRepository,
})
if err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatal(errors.Wrap(err, "questionUsecase"))
2021-03-06 13:02:48 +00:00
}
2021-03-06 09:33:47 +00:00
router := setupRouter()
2021-03-06 13:02:48 +00:00
graphql := router.Group("")
graphql.Use(
middleware.GinContextToContext(),
middleware.DataLoaderToContext(dataloader.Config{
ProfessionRepo: professionRepository,
2021-03-06 13:02:48 +00:00
QualificationRepo: qualificationRepository,
}),
middleware.Authenticate(authUsecase),
)
graphqlhttpdelivery.Attach(graphql, graphqlhttpdelivery.Config{
Resolver: &resolvers.Resolver{
AuthUsecase: authUsecase,
UserUsecase: userUsecase,
ProfessionUsecase: professionUsecase,
QualificationUsecase: qualificationUsecase,
QuestionUsecase: questionUsecase,
},
Directive: &directive.Directive{},
})
2021-02-21 09:17:54 +00:00
srv := &http.Server{
Addr: ":8080",
Handler: router,
}
go func() {
// service connections
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
2021-05-14 13:34:26 +00:00
logrus.Fatalln("listen:", err)
2021-02-21 09:17:54 +00:00
}
}()
2021-05-02 07:30:02 +00:00
logrus.Info("Server is listening on the port 8080")
2021-02-21 09:17:54 +00:00
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
logrus.Info("Shutdown Server ...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
2021-05-14 13:34:26 +00:00
logrus.Fatalln("Server Shutdown:", err)
2021-02-21 09:17:54 +00:00
}
logrus.Info("Server exiting")
}
func setupLogger() {
if appmode.Equals(appmode.DevelopmentMode) {
2021-02-21 09:17:54 +00:00
logrus.SetLevel(logrus.DebugLevel)
}
timestampFormat := "2006-01-02 15:04:05"
if appmode.Equals(appmode.ProductionMode) {
customFormatter := new(logrus.JSONFormatter)
customFormatter.TimestampFormat = timestampFormat
logrus.SetFormatter(customFormatter)
} else {
customFormatter := new(logrus.TextFormatter)
customFormatter.TimestampFormat = timestampFormat
customFormatter.FullTimestamp = true
logrus.SetFormatter(customFormatter)
}
2021-02-21 09:17:54 +00:00
}
2021-03-06 09:33:47 +00:00
func setupRouter() *gin.Engine {
router := gin.New()
router.Use(gin.Recovery())
if !envutil.GetenvBool("DISABLE_ACCESS_LOG") {
router.Use(ginlogrus.Logger(logrus.StandardLogger()))
}
if appmode.Equals(appmode.DevelopmentMode) {
2021-03-06 09:33:47 +00:00
router.Use(cors.New(cors.Config{
AllowOriginFunc: func(string) bool {
return true
},
AllowCredentials: true,
ExposeHeaders: []string{"Authorization"},
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
AllowWebSockets: false,
}))
}
return router
}