ms-tester/main.go
2025-04-22 20:44:52 +05:00

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
}