package app import ( "context" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" "merch-api/config" "merch-api/internal/merch" "merch-api/pkg/router" "time" ) type App struct { cfg config.Config router *router.Router modules []Module } func New(cfg config.Config) *App { //providers r := router.NewRouter(router.Deps{ Host: cfg.Http.Host, Port: cfg.Http.Port, Prefix: cfg.Http.Prefix, GinMode: cfg.Http.GinMode, }) //modules var modules []Module m := merch.New(nil) modules = append(modules, m) return &App{ cfg: cfg, router: r, modules: modules, } } func (app *App) Run(ctx context.Context) error { log.Info("Starting application...") baseGroup := app.router.BaseGroup() app.collectRoutes(baseGroup) errCh := make(chan error, 10) go func() { if err := app.router.Run(); err != nil { errCh <- err } }() select { case <-ctx.Done(): app.shutdown(ctx) case err := <-errCh: return err } return nil } func (app *App) shutdown(ctx context.Context) { log.Info("Shutting down application...") shutdownCtx, shutdownCancel := context.WithTimeout(ctx, 15*time.Second) defer shutdownCancel() if err := app.router.Shutdown(shutdownCtx); err != nil { log.Warnf("Error shutting down application: %v", err) } log.Info("Application shutdown complete") } func (app *App) collectRoutes(group *gin.RouterGroup) { for _, m := range app.modules { m.RegisterRoutes(group) } }