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 }