middleware

package
v1.2.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 20, 2023 License: MIT Imports: 23 Imported by: 0

README

Middleware.

Получение параметров из запросов.

Для получения параметров из запросов, пакет предоставляет ряд middleware:

  • NewParam(logger logger.Logger, caster Caster, options ...Option) - ищет нужный параметр в различных местах запроса и помещает его в контекст запроса с нужным типом, для этого нужно передать:

    • метод преобразования типов, из строки в нужный тип - caster;
    • набор опций:
      • WithUri(name string) - добавляет функцию поиска параметра которая ищет `GET' параметр в строке запроса

      Пример

      NewParam(logger, caster, WithUri("fieldName"))
      
      • WithChiURLParam(name string) - добавляет функцию поиска параметра которая ищет `GET' параметр в строке запроса, в роутинге пакета https://github.com/go-chi/chi

      Пример

      NewParam(logger, caster, WithChiURLParam("fieldName"))
      
      • WithHeader(name string) - добавляет функцию поиска параметра которая ищет параметр в заголовках запроса

      Пример

      NewParam(logger, caster, WithHeader("fieldName"))
      
      • WithCookie(name string) - добавляет функцию поиска параметра которая ищет параметр в куках запроса

      Пример

      NewParam(logger, caster, WithCookie("fieldName"))
      
      • AddGetter(getter Getter) - добавляет функцию поиска параметра

      Пример

      NewParam(logger, caster, AddGetter(func(request *http.Request) string {...}))
      
      • WithValidator(validator Validator) - добавляет метод валидации параметра

      Пример

      NewParam(logger, caster, WithValidator(func(any) error {...}))
      
      • WithName(name string) - имя параметра, под которым он будет доступен в контексте запроса

      Пример

      NewParam(logger, caster, WithName("fieldName"))
      
      • WithDefault(name string) - значение параметра по умолчанию, если он не найден

      Пример

      NewParam(logger, caster, WithDefault("default1"))
      

    Пример полного набора опций

    NewParam(logger, caster, 
      WithUri("fieldName"),
      WithChiURLParam("chiFieldName"),
      WithHeader("headerFieldName"),
      WithCookie("cookieFieldName"),
      WithName("field"),
      WithDefault("default1"),
    )
    

    Важно. Если параметру не будет установлено значение по умолчанию и параметр не будет найден в запросе, то запрос будет отменен со статусом 400.

    Важно. Все геттеры применяются в том порядке, в котором они были переданы, тот гетер который вернул значение, прерывает цепочку вызовов геттеров.

  • NewParamUUID - оборачивает метод NewParam и добавляет caster который приводит параметр в тип github.com/google/uuid/UUID

  • NewParamString - оборачивает метод NewParam и добавляет caster который приводит параметр в тип string

  • NewParamInt - оборачивает метод NewParam и добавляет caster который приводит параметр в тип int

  • NewParamInt8 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип int8

  • NewParamInt16 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип int16

  • NewParamInt32 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип int132

  • NewParamInt64 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип int164

  • NewParamFloat32 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип float32

  • NewParamFloat64 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип float64

  • NewParamUint - оборачивает метод NewParam и добавляет caster который приводит параметр в тип uint

  • NewParamUint8 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип uint8

  • NewParamUint16 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип uint16

  • NewParamUint32 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип uint32

  • NewParamUint64 - оборачивает метод NewParam и добавляет caster который приводит параметр в тип uint64

  • NewParamBool - оборачивает метод NewParam и добавляет caster который приводит параметр в тип bool

  • NewParamDuration - оборачивает метод NewParam и добавляет caster который приводит параметр в тип time.Duration

  • NewParamTime - оборачивает метод NewParam и добавляет caster который приводит параметр в тип time.Time

  • NewIp - вызывает метод NewParam, с готовой конфигурацией для получения IP адреса из запроса, сканирует заголовки X-REAL-IP, X-FORWARDED-FOR и помещает найденный ip адрес в контекст запроса под именем ip, это имя доступно в константе пакета IpFieldName

  • NewPaginationSortDirection - вызывает метод NewParam, с готовой конфигурацией для получения направления сортировки, сканирует заголовки X-Pagination-Sort-Direction и гет параметр запроса direction и помещает найденное значение в контекст запроса под именем direction, это имя доступно в константе пакета SortDirectionFieldName, доступные значения для этого поля находятся в константах пакета:

    • SortDirectionAsc - asc
    • SortDirectionDesc - desc
  • NewPaginationSortColumn - вызывает метод NewParam, с готовой конфигурацией для получения имени столбца для сортировки, так же принимает список доступных имен столбцов для валидации, сканирует заголовки X-Pagination-Sort-Column и гет параметр запроса colSort и помещает найденное значение в контекст запроса под именем colSort, это имя доступно в константе пакета SortColumnFieldName

  • NewPaginationPage - вызывает метод NewParam, с готовой конфигурацией для получения номера страницы, для постраничной выгрузки, сканирует заголовки X-Pagination-Page и гет параметр запроса page и помещает найденное значение в контекст запроса под именем page, это имя доступно в константе пакета PageFieldName

  • NewPaginationLimit - вызывает метод NewParam, с готовой конфигурацией для получения лимита, для постраничной выгрузки, сканирует заголовки X-Pagination-Limit и гет параметр запроса limit и помещает найденное значение в контекст запроса под именем limit, это имя доступно в константе пакета LimitFieldName

  • NewPagination - объединяет методы: NewPaginationSortDirection, NewPaginationSortColumn, NewPaginationPage, NewPaginationLimit, в один вызов.

Documentation

Index

Constants

View Source
const (
	PageFieldName          = "page"
	LimitFieldName         = "limit"
	SortColumnFieldName    = "colSort"
	SortDirectionFieldName = "direction"

	CountHeaderName         = "X-Pagination-Count"
	PageHeaderName          = "X-Pagination-Page"
	LimitHeaderName         = "X-Pagination-Limit"
	SortColumnHeaderName    = "X-Pagination-Sort-Column"
	SortDirectionHeaderName = "X-Pagination-Sort-Direction"

	SortDirectionAsc  = "asc"
	SortDirectionDesc = "desc"
	SortColumnDefault = "id"

	LimitDefault = uint8(20)
	PageDefault  = uint32(1)

	IpFieldName        = "ip"
	HeaderRealIp       = "X-REAL-IP"
	HeaderForwardedFor = "X-FORWARDED-FOR"
)

Variables

View Source
var (
	MetricTotalRequestCountComponent = &app.Component{
		Dependencies: app.Components{
			logger.Component,
			router.Component,
		},
		Constructor: func(container container.Container) error {
			return container.Provide(NewTotalRequestCount)
		},
		Run: func(c container.Container) error {
			metric, err := container.Get[*TotalRequestCount](c)
			if err != nil {
				return err
			}

			router, err := container.Get[router.Router](c)
			if err != nil {
				return err
			}

			informer, err := container.Get[logger.Informer](c)
			if err != nil {
				return err
			}

			informer.Info("http.server.middleware: added a metric for the total number of requests")

			router.Use(metric)

			return nil
		},
	}

	MetricDurationComponent = &app.Component{
		Dependencies: app.Components{
			logger.Component,
			router.Component,
		},
		Constructor: func(container container.Container) error {
			return container.Provide(NewDurationMetric)
		},
		Run: func(c container.Container) error {
			metric, err := container.Get[*DurationMetric](c)
			if err != nil {
				return err
			}

			router, err := container.Get[router.Router](c)
			if err != nil {
				return err
			}

			informer, err := container.Get[logger.Informer](c)
			if err != nil {
				return err
			}

			informer.Info("http.server.middleware: added metric of query execution time counter")

			router.Use(metric)

			return nil
		},
	}

	ResponseLoggerComponent = &app.Component{
		Dependencies: app.Components{
			logger.Component,
			router.Component,
		},
		Constructor: func(container container.Container) error {
			return container.Provide(NewResponseLogger)
		},
		Run: func(c container.Container) error {
			loggerMiddleware, err := container.Get[*ResponseLogger](c)
			if err != nil {
				return err
			}

			router, err := container.Get[router.Router](c)
			if err != nil {
				return err
			}

			informer, err := container.Get[logger.Informer](c)
			if err != nil {
				return err
			}

			informer.Info("http.server.middleware: added response logger")

			router.Use(loggerMiddleware)

			return nil
		},
	}

	RequestLoggerComponent = &app.Component{
		Dependencies: app.Components{
			logger.Component,
			router.Component,
		},
		Constructor: func(container container.Container) error {
			return container.Provide(NewRequestLogger)
		},
		Run: func(c container.Container) error {
			loggerMiddleware, err := container.Get[*RequestLogger](c)
			if err != nil {
				return err
			}

			router, err := container.Get[router.Router](c)
			if err != nil {
				return err
			}

			informer, err := container.Get[logger.Informer](c)
			if err != nil {
				return err
			}

			informer.Info("http.server.middleware: added request logger")

			router.Use(loggerMiddleware)

			return nil
		},
	}
)

Functions

func DecrementModifier

func DecrementModifier(value any) (any, error)

func GetSortDirectionName added in v1.1.0

func GetSortDirectionName(sortDirection client.SortDirection) string

func IpCaster

func IpCaster(value any) (any, error)

func ValueOrZeroModifier

func ValueOrZeroModifier(value any) (any, error)

Types

type Caster

type Caster func(any) (any, error)

type DurationMetric

type DurationMetric struct {
	// contains filtered or unexported fields
}

func NewDurationMetric

func NewDurationMetric(appConfig *app.Config) *DurationMetric

func (*DurationMetric) Middleware

func (middleware *DurationMetric) Middleware(next http.Handler) http.Handler

type Getter

type Getter func(request *http.Request) string

type Modifier

type Modifier func(any) (any, error)

type Option

type Option func(param *Param) *Param

func AddGetter

func AddGetter(getter Getter) Option

func WithChiURLParam

func WithChiURLParam(name string) Option

func WithCookie

func WithCookie(name string) Option

func WithDefault

func WithDefault(value any) Option

func WithHeader

func WithHeader(name string) Option

func WithModifier

func WithModifier(modifier Modifier) Option

func WithName

func WithName(name string) Option

func WithUri

func WithUri(name string) Option

func WithValidator

func WithValidator(validator Validator) Option

type Page added in v1.1.0

type Page struct {
	Page    uint32 `json:"page,omitempty"`
	Limit   uint8  `json:"limit,omitempty"`
	Count   uint64 `json:"count,omitempty"`
	Sorting *Sort  `json:"sort"`
}

type Param

type Param struct {
	// contains filtered or unexported fields
}

func NewIp

func NewIp(logger logger.Logger) *Param

func NewPagination

func NewPagination(logger logger.Logger, allowedColumns ...string) []*Param

func NewPaginationLimit

func NewPaginationLimit(logger logger.Logger) *Param

func NewPaginationPage

func NewPaginationPage(logger logger.Logger) *Param

func NewPaginationSortColumn

func NewPaginationSortColumn(logger logger.Logger, allowedColumns ...string) *Param

func NewPaginationSortDirection

func NewPaginationSortDirection(logger logger.Logger) *Param

func NewParam

func NewParam(logger logger.Logger, caster Caster, options ...Option) *Param

func NewParamBool

func NewParamBool(logger logger.Logger, options ...Option) *Param

func NewParamDuration

func NewParamDuration(logger logger.Logger, options ...Option) *Param

func NewParamFloat32

func NewParamFloat32(logger logger.Logger, options ...Option) *Param

func NewParamFloat64

func NewParamFloat64(logger logger.Logger, options ...Option) *Param

func NewParamInt

func NewParamInt(logger logger.Logger, options ...Option) *Param

func NewParamInt16

func NewParamInt16(logger logger.Logger, options ...Option) *Param

func NewParamInt32

func NewParamInt32(logger logger.Logger, options ...Option) *Param

func NewParamInt64

func NewParamInt64(logger logger.Logger, options ...Option) *Param

func NewParamInt8

func NewParamInt8(logger logger.Logger, options ...Option) *Param

func NewParamString

func NewParamString(logger logger.Logger, options ...Option) *Param

func NewParamTime

func NewParamTime(logger logger.Logger, options ...Option) *Param

func NewParamUUID

func NewParamUUID(logger logger.Logger, options ...Option) *Param

func NewParamUint

func NewParamUint(logger logger.Logger, options ...Option) *Param

func NewParamUint16

func NewParamUint16(logger logger.Logger, options ...Option) *Param

func NewParamUint32

func NewParamUint32(logger logger.Logger, options ...Option) *Param

func NewParamUint64

func NewParamUint64(logger logger.Logger, options ...Option) *Param

func NewParamUint8

func NewParamUint8(logger logger.Logger, options ...Option) *Param

func (*Param) Middleware

func (middleware *Param) Middleware(next http.Handler) http.Handler

type RequestLogger

type RequestLogger struct {
	// contains filtered or unexported fields
}

func NewRequestLogger

func NewRequestLogger(logger logger.Logger) *RequestLogger

func (*RequestLogger) Middleware

func (r *RequestLogger) Middleware(next http.Handler) http.Handler

type ResponseLogger

type ResponseLogger struct {
	// contains filtered or unexported fields
}

func NewResponseLogger

func NewResponseLogger(logger logger.Logger) *ResponseLogger

func (*ResponseLogger) Middleware

func (r *ResponseLogger) Middleware(next http.Handler) http.Handler

type Sort added in v1.1.0

type Sort struct {
	Column    string `json:"column,omitempty"`
	Direction string `json:"direction,omitempty"`
}

type TotalRequestCount

type TotalRequestCount struct {
	// contains filtered or unexported fields
}

func NewTotalRequestCount

func NewTotalRequestCount(appConfig *app.Config) *TotalRequestCount

func (*TotalRequestCount) Middleware

func (middleware *TotalRequestCount) Middleware(next http.Handler) http.Handler

type Validator

type Validator func(any) error

func GteValidator

func GteValidator(val float64) Validator

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL