codeword/internal/app/app.go
2024-03-03 23:18:42 +03:00

85 lines
1.8 KiB
Go

package app
import (
"codeword/internal/controllers"
"codeword/internal/repository"
"codeword/internal/server/http"
"codeword/internal/service"
"context"
"go.uber.org/zap"
)
type Config struct {
AppName string `env:"APP_NAME"`
}
func Run(ctx context.Context, config Config, logger *zap.Logger) error {
defer func() {
if r := recover(); r != nil {
logger.Error("Recovered from a panic", zap.Any("error", r))
}
}()
logger.Info("App started", zap.Any("config", config))
ctx, cancel := context.WithCancel(ctx)
defer cancel()
// Инициализация репозиториев
promocodeRepository := repository.NewPromocodeRepository()
recoverRepository := repository.NewRecoverRepository()
statsRepository := repository.NewStatsRepository()
// Инициализация сервисов
promocodeService := service.NewPromocodeService(promocodeRepository)
recoverService := service.NewRecoverService(recoverRepository)
statsService := service.NewStatsService(statsRepository)
// Инициализация контроллеров
promocodeController := controllers.NewPromocodeController(promocodeService)
recoverController := controllers.NewRecoverController(recoverService)
statsController := controllers.NewStatsController(statsService)
// Создание сервера
server := http.NewServer(http.ServerConfig{
Controllers: []http.Controller{
promocodeController,
recoverController,
statsController,
},
})
go func() {
err := server.Start("Host + : + Port")
if err != nil {
logger.Error("Server startup error", zap.Error(err))
cancel()
}
}()
// Вывод маршрутов
server.ListRoutes()
<-ctx.Done()
logger.Info("App shutting down gracefully")
//TODO
// Остановка сервера
return nil
}