cvvvvv/internal/app/app.go

74 lines
1.7 KiB
Go

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)
}
}