merch-api/internal/app/handler.go
2026-02-23 19:33:21 +03:00

61 lines
1.1 KiB
Go

package app
import (
"context"
log "github.com/sirupsen/logrus"
"merch-api/config"
"merch-api/pkg/router"
"time"
)
type App struct {
cfg config.Config
router *router.Router
}
func New(cfg config.Config) *App {
r := router.NewRouter(router.Deps{
Host: cfg.Http.Host,
Port: cfg.Http.Port,
Prefix: cfg.Http.Prefix,
GinMode: cfg.Http.GinMode,
})
return &App{
cfg: cfg,
router: r,
}
}
func (app *App) Run(ctx context.Context) error {
log.Info("Starting application...")
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")
}