package app import ( "context" "encoding/json" "errors" "net/http" "os" "os/signal" "syscall" "time" "git.roboces.dev/catalin/cvvvvv/internal/config" delivery "git.roboces.dev/catalin/cvvvvv/internal/delivery/http" "git.roboces.dev/catalin/cvvvvv/internal/domain" "git.roboces.dev/catalin/cvvvvv/internal/repo" "git.roboces.dev/catalin/cvvvvv/internal/server" "git.roboces.dev/catalin/cvvvvv/internal/service" "git.roboces.dev/catalin/cvvvvv/pkg/logger" ) func loadResume(path string, resume *domain.Resume) error { datafile, err := os.Open(path) if err != nil { return errors.New("could not open database file") } decoder := json.NewDecoder(datafile) if decoder.Decode(&resume) != nil { return errors.New("could not decode database") } return nil } func Run(configPath string) { cfg, err := config.Init(configPath) if err != nil { logger.Error(err) return } resume := domain.Resume{} if loadResume(cfg.Database, &resume) != nil { logger.Error(err) return } repos := repo.NewRepos(resume) services := service.NewServices(service.Deps{ Repos: repos, Config: cfg, }) handlers := delivery.NewHandler(services) srv := server.NewServer(cfg, handlers.Init(cfg)) go func() { if err := srv.Run(); !errors.Is(err, http.ErrServerClosed) { logger.Errorf("error occurred while running http server: %s\n", err.Error()) } }() logger.Info("Server started") // Graceful Shutdown quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGTERM, syscall.SIGINT) <-quit const timeout = 5 * time.Second ctx, shutdown := context.WithTimeout(context.Background(), timeout) defer shutdown() if err := srv.Stop(ctx); err != nil { logger.Errorf("failed to stop server: %v", err) } }