customer/internal/server/http.go
2023-05-17 23:27:09 +03:00

87 lines
2.2 KiB
Go

package server
import (
"context"
"fmt"
"net/http"
"time"
"github.com/brpaz/echozap"
oapiMiddleware "github.com/deepmap/oapi-codegen/pkg/middleware"
"github.com/getkin/kin-openapi/openapi3"
"github.com/getkin/kin-openapi/openapi3filter"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/swagger"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/utils"
)
type Deps struct {
Logger *zap.Logger
Swagger *openapi3.T
JWTUtil *utils.JWT[models.AuthJWTDecoded]
}
type HTTP struct {
logger *zap.Logger
server *http.Server
echo *echo.Echo
}
func New(deps *Deps) *HTTP {
echo := echo.New()
echo.Use(echozap.ZapLogger(deps.Logger))
echo.Use(middleware.Recover())
echo.Use(oapiMiddleware.OapiRequestValidator(deps.Swagger))
echo.Use(oapiMiddleware.OapiRequestValidatorWithOptions(deps.Swagger, &oapiMiddleware.Options{
Options: openapi3filter.Options{AuthenticationFunc: utils.NewAuthenticator(deps.JWTUtil)},
}))
return &HTTP{
echo: echo,
logger: deps.Logger,
server: &http.Server{
Handler: echo,
MaxHeaderBytes: 1 << 20,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
},
}
}
func (receiver *HTTP) Listen(address string) error {
receiver.server.Addr = address
return receiver.server.ListenAndServe()
}
func (receiver *HTTP) Run(config *models.HTTPConfiguration) {
connectionString := fmt.Sprintf("%s:%s", config.Host, config.Port)
startServerMessage := fmt.Sprintf("starting http server on %s", connectionString)
receiver.logger.Info(startServerMessage)
if err := receiver.Listen(connectionString); err != nil && err != http.ErrServerClosed {
receiver.logger.Error("http listen error: ", zap.Error(err))
}
}
func (receiver *HTTP) Stop(ctx context.Context) error {
receiver.logger.Info("shutting down server...")
if err := receiver.server.Shutdown(ctx); err != nil {
return fmt.Errorf("failed to shutdown server: %w", err)
}
return nil
}
func (receiver *HTTP) Register(api *swagger.API) *HTTP {
swagger.RegisterHandlers(receiver.echo, api)
return receiver
}