139 lines
4.5 KiB
Go
139 lines
4.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"git.sch9.ru/new_gate/ms-tester/config"
|
|
testerv1 "git.sch9.ru/new_gate/ms-tester/contracts/tester/v1"
|
|
"git.sch9.ru/new_gate/ms-tester/internal/auth"
|
|
authHandlers "git.sch9.ru/new_gate/ms-tester/internal/auth/delivery/rest"
|
|
authUseCase "git.sch9.ru/new_gate/ms-tester/internal/auth/usecase"
|
|
"git.sch9.ru/new_gate/ms-tester/internal/contests"
|
|
contestsHandlers "git.sch9.ru/new_gate/ms-tester/internal/contests/delivery/rest"
|
|
contestsRepository "git.sch9.ru/new_gate/ms-tester/internal/contests/repository"
|
|
contestsUseCase "git.sch9.ru/new_gate/ms-tester/internal/contests/usecase"
|
|
"git.sch9.ru/new_gate/ms-tester/internal/middleware"
|
|
"git.sch9.ru/new_gate/ms-tester/internal/models"
|
|
"git.sch9.ru/new_gate/ms-tester/internal/problems"
|
|
problemsHandlers "git.sch9.ru/new_gate/ms-tester/internal/problems/delivery/rest"
|
|
problemsRepository "git.sch9.ru/new_gate/ms-tester/internal/problems/repository"
|
|
problemsUseCase "git.sch9.ru/new_gate/ms-tester/internal/problems/usecase"
|
|
sessionsRepository "git.sch9.ru/new_gate/ms-tester/internal/sessions/repository"
|
|
sessionsUseCase "git.sch9.ru/new_gate/ms-tester/internal/sessions/usecase"
|
|
"git.sch9.ru/new_gate/ms-tester/internal/users"
|
|
usersHandlers "git.sch9.ru/new_gate/ms-tester/internal/users/delivery/rest"
|
|
usersRepository "git.sch9.ru/new_gate/ms-tester/internal/users/repository"
|
|
usersUseCase "git.sch9.ru/new_gate/ms-tester/internal/users/usecase"
|
|
"git.sch9.ru/new_gate/ms-tester/pkg"
|
|
"github.com/gofiber/fiber/v2"
|
|
fiberlogger "github.com/gofiber/fiber/v2/middleware/logger"
|
|
"github.com/ilyakaznacheev/cleanenv"
|
|
"go.uber.org/zap"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
)
|
|
|
|
func main() {
|
|
var cfg config.Config
|
|
err := cleanenv.ReadConfig(".env", &cfg)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("error reading config: %s", err.Error()))
|
|
}
|
|
|
|
var logger *zap.Logger
|
|
if cfg.Env == "prod" {
|
|
logger = zap.Must(zap.NewProduction())
|
|
} else if cfg.Env == "dev" {
|
|
logger = zap.Must(zap.NewDevelopment())
|
|
} else {
|
|
panic(fmt.Sprintf(`error reading config: env expected "prod" or "dev", got "%s"`, cfg.Env))
|
|
}
|
|
|
|
logger.Info("connecting to postgres")
|
|
db, err := pkg.NewPostgresDB(cfg.PostgresDSN)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer db.Close()
|
|
logger.Info("successfully connected to postgres")
|
|
|
|
logger.Info("connecting to redis")
|
|
vk, err := pkg.NewValkeyClient(cfg.RedisDSN)
|
|
if err != nil {
|
|
logger.Fatal(fmt.Sprintf("error connecting to redis: %s", err.Error()))
|
|
}
|
|
logger.Info("successfully connected to redis")
|
|
|
|
usersRepo := usersRepository.NewRepository(db)
|
|
|
|
_, err = usersRepo.CreateUser(context.Background(),
|
|
usersRepo.DB(), &models.UserCreation{
|
|
Username: cfg.AdminUsername,
|
|
Password: cfg.AdminPassword,
|
|
Role: models.RoleAdmin,
|
|
})
|
|
if err != nil {
|
|
logger.Error(fmt.Sprintf("error creating admin user: %s", err.Error()))
|
|
}
|
|
|
|
sessionsRepo := sessionsRepository.NewValkeyRepository(vk)
|
|
sessionsUC := sessionsUseCase.NewUseCase(sessionsRepo, cfg)
|
|
|
|
usersUC := usersUseCase.NewUseCase(sessionsRepo, usersRepo)
|
|
|
|
authUC := authUseCase.NewUseCase(usersUC, sessionsUC)
|
|
|
|
pandocClient := pkg.NewPandocClient(&http.Client{}, cfg.Pandoc)
|
|
|
|
problemsRepo := problemsRepository.NewRepository(db)
|
|
problemsUC := problemsUseCase.NewUseCase(problemsRepo, pandocClient)
|
|
|
|
contestsRepo := contestsRepository.NewRepository(db)
|
|
contestsUC := contestsUseCase.NewContestUseCase(contestsRepo)
|
|
|
|
server := fiber.New()
|
|
|
|
type MergedHandlers struct {
|
|
users.UsersHandlers
|
|
auth.AuthHandlers
|
|
contests.ContestsHandlers
|
|
problems.ProblemsHandlers
|
|
}
|
|
|
|
merged := MergedHandlers{
|
|
usersHandlers.NewHandlers(usersUC),
|
|
authHandlers.NewHandlers(authUC, cfg.JWTSecret),
|
|
contestsHandlers.NewHandlers(problemsUC, contestsUC, cfg.JWTSecret),
|
|
problemsHandlers.NewHandlers(problemsUC),
|
|
}
|
|
|
|
testerv1.RegisterHandlersWithOptions(server, merged, testerv1.FiberServerOptions{
|
|
Middlewares: []testerv1.MiddlewareFunc{
|
|
fiberlogger.New(),
|
|
middleware.AuthMiddleware(cfg.JWTSecret, sessionsUC),
|
|
//rest.AuthMiddleware(cfg.JWTSecret, userUC),
|
|
//cors.New(cors.Config{
|
|
// AllowOrigins: "http://localhost:3000",
|
|
// AllowMethods: "GET,POST,PUT,DELETE,OPTIONS",
|
|
// AllowHeaders: "Content-Type,Set-Cookie,Credentials",
|
|
// AllowCredentials: true,
|
|
//}),
|
|
},
|
|
})
|
|
|
|
go func() {
|
|
err := server.Listen(cfg.Address)
|
|
if err != nil {
|
|
logger.Fatal(fmt.Sprintf("error starting server: %s", err.Error()))
|
|
}
|
|
}()
|
|
|
|
logger.Info(fmt.Sprintf("server started on %s", cfg.Address))
|
|
|
|
stop := make(chan os.Signal, 1)
|
|
signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT)
|
|
|
|
<-stop
|
|
}
|