86 lines
2.0 KiB
Go
86 lines
2.0 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/getkin/kin-openapi/openapi3"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/labstack/echo/v4/middleware"
|
|
"go.uber.org/zap"
|
|
"penahub.gitlab.yandexcloud.net/external/treasurer/internal/errors"
|
|
"penahub.gitlab.yandexcloud.net/external/treasurer/internal/models"
|
|
"penahub.gitlab.yandexcloud.net/external/treasurer/internal/swagger"
|
|
)
|
|
|
|
type DepsHTTP struct {
|
|
Logger *zap.Logger
|
|
Swagger *openapi3.T
|
|
}
|
|
|
|
type HTTP struct {
|
|
logger *zap.Logger
|
|
server *http.Server
|
|
echo *echo.Echo
|
|
}
|
|
|
|
func NewHTTP(deps DepsHTTP) (*HTTP, errors.Error) {
|
|
if deps.Logger == nil {
|
|
return nil, errors.NewWithMessage("Logger is nil on <NewHTTP>", errors.ErrInvalidArgs)
|
|
}
|
|
|
|
if deps.Swagger == nil {
|
|
return nil, errors.NewWithMessage("Swagger is nil on <NewHTTP>", errors.ErrInvalidArgs)
|
|
}
|
|
|
|
echo := echo.New()
|
|
|
|
echo.Use(middleware.Recover())
|
|
|
|
return &HTTP{
|
|
echo: echo,
|
|
logger: deps.Logger,
|
|
server: &http.Server{
|
|
Handler: echo,
|
|
MaxHeaderBytes: 1 << 20,
|
|
ReadTimeout: 10 * time.Second,
|
|
WriteTimeout: 10 * time.Second,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (receiver *HTTP) Listen(address string) error {
|
|
receiver.server.Addr = address
|
|
|
|
return receiver.server.ListenAndServe()
|
|
}
|
|
|
|
func (receiver *HTTP) Run(config *models.ConfigurationHTTP) {
|
|
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
|
|
}
|