package router import ( "downloader/internal/app/api/download" "downloader/internal/core/ports/download_request/in_memory" "downloader/internal/core/ports/downloader/yt_downloader" "downloader/internal/core/services/download/default" "downloader/pkg/common/uuid" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "go.uber.org/zap" "go.uber.org/zap/zapcore" "net/http" "os" "time" ) type router struct { internalRouter *chi.Mux } func NewRouter() *router { router := &router{internalRouter: chi.NewRouter()} router. setupMiddleware(). setupRoutes() return router } func (router *router) Run() { _ = http.ListenAndServe(":3333", router.internalRouter) } func (router *router) RegisterApi() *chi.Mux { return router.internalRouter } func (router *router) setupMiddleware() *router { router.internalRouter.Use(middleware.Logger) router.internalRouter.Use(middleware.RequestID) router.internalRouter.Use(middleware.RealIP) router.internalRouter.Use(middleware.Recoverer) router.internalRouter.Use(middleware.Timeout(time.Second * 60)) return router } func (router *router) setupRoutes() *router { setupDownloadRoute(router) return router } func setupDownloadRoute(router *router) { sugaredLogger := setupLogger() drRepository := in_memory.NewInMemoryRepository(sugaredLogger) downloader := yt_downloader.New(sugaredLogger) drBackgroundService := _default.NewLocalBackgroundService(drRepository, sugaredLogger, downloader) gen := uuid.New() drService := _default.NewLocalService(drRepository, gen, drBackgroundService, sugaredLogger) downloadApi := download.New(drService) downloadApi.SetupDownloadApi(router.internalRouter) } func setupLogger() *zap.SugaredLogger { consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) jsonEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) consoleDebugging := zapcore.Lock(os.Stdout) lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl < zapcore.ErrorLevel }) highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.ErrorLevel }) consoleErrors := zapcore.Lock(os.Stderr) core := zapcore.NewTee( zapcore.NewCore(jsonEncoder, consoleErrors, highPriority), zapcore.NewCore(jsonEncoder, consoleDebugging, highPriority), zapcore.NewCore(consoleEncoder, consoleErrors, highPriority), zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority), ) logger := zap.New(core) defer func(logger *zap.Logger) { _ = logger.Sync() }(logger) sugaredLogger := logger.Sugar() return sugaredLogger }