Files
gerald/internal/interfaces/rest/serve.go
aspasskiy ed403c2c72
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
upvotes
2024-04-23 19:13:48 +03:00

75 lines
1.9 KiB
Go

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