customer/internal/server/http.go

94 lines
2.4 KiB
Go
Raw Normal View History

2023-05-16 01:12:07 +00:00
package server
import (
"context"
"fmt"
"net/http"
"time"
2023-05-16 04:01:55 +00:00
"github.com/getkin/kin-openapi/openapi3"
2023-05-17 20:27:09 +00:00
"github.com/getkin/kin-openapi/openapi3filter"
2023-05-16 01:12:07 +00:00
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
2023-05-17 20:27:09 +00:00
"go.uber.org/zap"
2023-06-13 22:41:33 +00:00
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors"
2023-06-22 09:32:06 +00:00
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/interface/swagger"
2023-05-16 04:01:55 +00:00
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
2023-05-16 01:12:07 +00:00
)
2023-06-13 22:41:33 +00:00
type DepsHTTP struct {
Logger *zap.Logger
Swagger *openapi3.T
AuthenticationFunc openapi3filter.AuthenticationFunc
2023-05-17 20:27:09 +00:00
}
2023-05-16 01:12:07 +00:00
type HTTP struct {
2023-05-17 20:27:09 +00:00
logger *zap.Logger
2023-05-16 01:12:07 +00:00
server *http.Server
echo *echo.Echo
}
2023-06-13 22:41:33 +00:00
func NewHTTP(deps DepsHTTP) (*HTTP, errors.Error) {
if deps.Logger == nil {
return nil, errors.NewWithMessage("failed to init http server: logger is nil <NewHTTP>", errors.ErrInvalidArgs)
}
if deps.Swagger == nil {
return nil, errors.NewWithMessage("failed to init http server: swagger is nil <NewHTTP>", errors.ErrInvalidArgs)
}
if deps.AuthenticationFunc == nil {
return nil, errors.NewWithMessage("failed to init http server: AuthenticationFunc is nil <NewHTTP>", errors.ErrInvalidArgs)
}
2023-05-16 01:12:07 +00:00
echo := echo.New()
echo.Use(middleware.Recover())
echo.Use(swagger.CreateMiddleware(deps.Swagger, deps.AuthenticationFunc))
2023-05-16 01:12:07 +00:00
return &HTTP{
echo: echo,
2023-05-17 20:27:09 +00:00
logger: deps.Logger,
2023-05-16 01:12:07 +00:00
server: &http.Server{
Handler: echo,
MaxHeaderBytes: 1 << 20,
2023-06-14 17:28:43 +00:00
ReadTimeout: 20 * time.Second,
WriteTimeout: 20 * time.Second,
IdleTimeout: 20 * time.Second,
2023-05-16 01:12:07 +00:00
},
2023-06-13 22:41:33 +00:00
}, nil
2023-05-16 01:12:07 +00:00
}
func (receiver *HTTP) Listen(address string) error {
receiver.server.Addr = address
return receiver.server.ListenAndServe()
}
2023-06-13 16:09:17 +00:00
func (receiver *HTTP) Run(config *models.ConfigurationHTTP) {
2023-05-16 01:12:07 +00:00
connectionString := fmt.Sprintf("%s:%s", config.Host, config.Port)
startServerMessage := fmt.Sprintf("starting http server on %s", connectionString)
2023-05-17 20:27:09 +00:00
receiver.logger.Info(startServerMessage)
2023-05-16 01:12:07 +00:00
if err := receiver.Listen(connectionString); err != nil && err != http.ErrServerClosed {
2023-05-17 20:27:09 +00:00
receiver.logger.Error("http listen error: ", zap.Error(err))
2023-05-16 01:12:07 +00:00
}
}
func (receiver *HTTP) Stop(ctx context.Context) error {
2023-05-17 20:27:09 +00:00
receiver.logger.Info("shutting down server...")
2023-05-16 01:12:07 +00:00
if err := receiver.server.Shutdown(ctx); err != nil {
return fmt.Errorf("failed to shutdown server: %w", err)
}
return nil
}
2023-05-17 20:27:09 +00:00
func (receiver *HTTP) Register(api *swagger.API) *HTTP {
swagger.RegisterHandlers(receiver.echo, api)
2023-05-16 01:12:07 +00:00
return receiver
}