package rest import ( "context" "gerald/internal/adapters/config" "gerald/internal/adapters/logger" "gerald/internal/interfaces/rest/handlers" "gerald/internal/interfaces/rest/restapi" "gerald/internal/interfaces/rest/restapi/operations" "gerald/internal/interfaces/rest/restapi/operations/feedback" "github.com/go-openapi/loads" "github.com/rs/zerolog" "go.uber.org/fx" "net/http" ) type Server struct { config *config.Config logger zerolog.Logger feedback *handlers.FeedbackHandler } func NewServer( config *config.Config, logger zerolog.Logger, feedback *handlers.FeedbackHandler, ) *Server { return &Server{ config: config, logger: logger, feedback: feedback, } } func (s *Server) SetupMiddleware(handler http.Handler) http.Handler { return logger.HTTPLoggerFunc(s.logger, handler) } func StartHTTPServer(s *Server, lifecycle fx.Lifecycle) { swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON) if err != nil { return } api := operations.NewGeraldAPI(swaggerSpec) api.UseSwaggerUI() // Feedback api.FeedbackCreateFeedbackHandler = feedback.CreateFeedbackHandlerFunc(s.feedback.CreateFeedback) api.FeedbackGetFeedbacksHandler = feedback.GetFeedbacksHandlerFunc(s.feedback.GetFeedbacks) api.FeedbackUpvoteFeedbackHandler = feedback.UpvoteFeedbackHandlerFunc(s.feedback.VoteFeedback) api.FeedbackGetFeedbacksForProjectHandler = feedback.GetFeedbacksForProjectHandlerFunc(s.feedback.GetFeedbacksForProject) // Add global middleware here server := restapi.NewServer(api) handler := s.SetupMiddleware(api.Serve(nil)) server.SetHandler(handler) server.Port = int(s.config.ApplicationPort) go func() { err = server.Serve() if err != nil { s.logger.Fatal().Err(err).Msg("Cannot start HTTP server") } }() lifecycle.Append(fx.Hook{ OnStop: func(ctx context.Context) error { return server.Shutdown() }, }) }