Documentation
¶
Index ¶
- Constants
- Variables
- func CalcRequestTimeout(req *http.Request, defaultTimeout, maxTimeout time.Duration) time.Duration
- func CheckObjectDocumented(example interface{})
- func InitAPIServerConfig(apiConfig, monitoringConfig, corsConfig config.Section)
- func IsNull(v any) bool
- func RequestIDHeader() string
- func SetRequestIDHeader(header string)
- func ValueString(f FieldSerialization) string
- type APIRequest
- type APIServer
- type APIServerOptions
- type APIServerRouteExt
- type APIVersion
- type AndFilter
- type BaseURLVariable
- type BigIntField
- type BoolField
- type Bytes32Field
- type CtxFFRequestIDKey
- type CtxHeadersKey
- type FFStringArrayField
- type Field
- type FieldMod
- type FieldResolverFn
- type FieldSerialization
- type Filter
- type FilterBuilder
- type FilterInfo
- type FilterJSON
- type FilterJSONBase
- type FilterJSONKeyValue
- type FilterJSONKeyValues
- type FilterJSONOps
- type FilterModifiers
- type FilterOp
- type FilterResult
- type FilterResultsWithCount
- type FormParam
- type HandlerFactory
- type HandlerFunction
- type HasFieldMods
- type Int64Field
- type ItemsResultTyped
- type JSONBuildFilterOpt
- type JSONField
- type MultiConditionFilter
- type Multipart
- type NullBehavior
- type OpenAPIFormat
- type OpenAPIHandlerFactory
- func (ohf *OpenAPIHandlerFactory) OpenAPIHandler(apiPath string, format OpenAPIFormat, routes []*Route) HandlerFunction
- func (ohf *OpenAPIHandlerFactory) OpenAPIHandlerVersioned(apiPath string, format OpenAPIFormat, apiVersionObject *APIVersion) HandlerFunction
- func (ohf *OpenAPIHandlerFactory) SwaggerUIHandler(openAPIPath string) HandlerFunction
- type OrFilter
- type PathParam
- type QueryBuilder
- type QueryFactory
- type QueryFields
- type QueryJSON
- type QueryParam
- type Route
- type SchemaGenerator
- type SetOperation
- type SimpleFilterValue
- type SortField
- type StringField
- type StringFieldLower
- type SwaggerGen
- type SwaggerGenOptions
- type TimeField
- type UUIDField
- type Update
- type UpdateBuilder
- type UpdateFactory
- type UpdateInfo
- type UpdateOps
- type ValueFilter
- type ValueResolverFn
- type VersionedAPIs
Constants ¶
const APIServerMetricsSubSystemName = "api_server_rest"
const DefaultRequestIDHeader = "X-FireFly-Request-ID"
Variables ¶
var ( ConfMonitoringServerEnabled = "enabled" ConfMonitoringServerMetricsPath = "metricsPath" ConfMonitoringServerLivenessPath = "livenessPath" ConfAPIDefaultFilterLimit = "defaultFilterLimit" ConfAPIMaxFilterLimit = "maxFilterLimit" ConfAPIMaxFilterSkip = "maxFilterSkip" ConfAPIRequestTimeout = "requestTimeout" ConfAPIRequestMaxTimeout = "requestMaxTimeout" ConfAPIAlwaysPaginate = "alwaysPaginate" ConfAPIDynamicPublicURLHeader = "dynamicPublicURLHeader" )
var ( // AddOns is a map of add-ons to be used in the query Not addOns = func(op *FilterJSONBase) { op.Not = true } CaseInsensitive addOns = func(op *FilterJSONBase) { op.CaseInsensitive = true } CaseSensitive addOns = func(op *FilterJSONBase) { op.CaseInsensitive = false } )
Functions ¶
func CalcRequestTimeout ¶ added in v1.2.11
func CheckObjectDocumented ¶ added in v1.4.0
func CheckObjectDocumented(example interface{})
CheckObjectDocumented lets unit tests on individual structures validate that all the ffstruct tags are set, without having to build their own swagger.
func InitAPIServerConfig ¶ added in v1.2.8
func RequestIDHeader ¶ added in v1.5.0
func RequestIDHeader() string
RequestIDHeader returns the header name used to pass the request ID for ffapi server and ffresty client requests.
func SetRequestIDHeader ¶ added in v1.5.0
func SetRequestIDHeader(header string)
SetRequestIDHeader configures the header used to pass the request ID between ffapi server and ffresty client requests. Should be set at initialization of a process.
func ValueString ¶ added in v1.1.5
func ValueString(f FieldSerialization) string
Types ¶
type APIRequest ¶
type APIRequest struct {
Req *http.Request
QP map[string]string
QAP map[string][]string
PP map[string]string
FP map[string]string
Filter AndFilter
Input interface{}
Part *Multipart
SuccessStatus int
ResponseHeaders http.Header
AlwaysPaginate bool
}
func (*APIRequest) FilterResult ¶ added in v1.1.5
func (r *APIRequest) FilterResult(items interface{}, res *FilterResult, err error) (interface{}, error)
Encourage consideration for new APIs of using ItemsResult() - generic and documented, and always returns the same output for all queries FilterResult is a helper to transform a filter result into a REST API standard payload
type APIServer ¶ added in v1.2.8
type APIServer interface {
Serve(ctx context.Context) error
Started() <-chan struct{}
MuxRouter(ctx context.Context) (*mux.Router, error)
APIPublicURL() string // valid to call after server is successfully started
}
APIServer is an opinionated use of the HTTP Server facilities in common, to provide an API server with: - a set of routes defining API endpoints - a swagger endpoint on /api - optional metrics endpoint on /metrics (configurable)
func NewAPIServer ¶ added in v1.2.8
func NewAPIServer[T any](ctx context.Context, options APIServerOptions[T]) APIServer
NewAPIServer makes a new server, with the specified configuration, and the supplied wrapper function - which will inject
type APIServerOptions ¶ added in v1.2.8
type APIServerOptions[T any] struct { MetricsRegistry metric.MetricsRegistry MetricsSubsystemName string Routes []*Route // move to use VersionedAPIs for support of Tags and ExternalDocs VersionedAPIs *VersionedAPIs MonitoringRoutes []*Route EnrichRequest func(r *APIRequest) (T, error) Description string APIConfig config.Section MonitoringConfig config.Section CORSConfig config.Section FavIcon16 []byte FavIcon32 []byte PanicOnMissingDescription bool SupportFieldRedaction bool HandleYAML bool }
type APIServerRouteExt ¶ added in v1.2.8
type APIServerRouteExt[T any] struct { JSONHandler func(*APIRequest, T) (output interface{}, err error) UploadHandler func(*APIRequest, T) (output interface{}, err error) StreamHandler func(*APIRequest, T) (output io.ReadCloser, err error) }
type APIVersion ¶ added in v1.5.2
type APIVersion struct {
Routes []*Route // the routes
Tags openapi3.Tags // (OPTIONAL) description and external documentation of tags used in the routes, all tags in this array will need to be used by at least one of routes
ExternalDocs *openapi3.ExternalDocs // (OPTIONAL) external documentation of this API version
}
APIVersion defines a version of the API it contains a list of routes and associated metadata for the OpenAPI spec generation
type AndFilter ¶ added in v1.1.5
type AndFilter interface{ MultiConditionFilter }
type BaseURLVariable ¶ added in v1.3.0
type BigIntField ¶ added in v1.2.8
type BigIntField struct{}
func (*BigIntField) Description ¶ added in v1.2.8
func (f *BigIntField) Description() string
func (*BigIntField) FilterAsString ¶ added in v1.2.8
func (f *BigIntField) FilterAsString() bool
func (*BigIntField) GetSerialization ¶ added in v1.2.8
func (f *BigIntField) GetSerialization() FieldSerialization
type BoolField ¶ added in v1.1.5
type BoolField struct{}
func (*BoolField) Description ¶ added in v1.1.5
func (*BoolField) FilterAsString ¶ added in v1.1.5
func (*BoolField) GetSerialization ¶ added in v1.1.5
func (f *BoolField) GetSerialization() FieldSerialization
type Bytes32Field ¶ added in v1.1.5
type Bytes32Field struct{}
func (*Bytes32Field) Description ¶ added in v1.1.5
func (f *Bytes32Field) Description() string
func (*Bytes32Field) FilterAsString ¶ added in v1.1.5
func (f *Bytes32Field) FilterAsString() bool
func (*Bytes32Field) GetSerialization ¶ added in v1.1.5
func (f *Bytes32Field) GetSerialization() FieldSerialization
type CtxFFRequestIDKey ¶ added in v1.2.0
type CtxFFRequestIDKey struct{}
type CtxHeadersKey ¶ added in v1.2.0
type CtxHeadersKey struct{}
type FFStringArrayField ¶ added in v1.1.5
type FFStringArrayField struct{}
func (*FFStringArrayField) Description ¶ added in v1.1.5
func (f *FFStringArrayField) Description() string
func (*FFStringArrayField) FilterAsString ¶ added in v1.1.5
func (f *FFStringArrayField) FilterAsString() bool
func (*FFStringArrayField) GetSerialization ¶ added in v1.1.5
func (f *FFStringArrayField) GetSerialization() FieldSerialization
type Field ¶ added in v1.1.5
type Field interface {
GetSerialization() FieldSerialization
Description() string
FilterAsString() bool
}
type FieldResolverFn ¶ added in v1.5.6
type FieldSerialization ¶ added in v1.1.5
type FieldSerialization interface {
driver.Valuer
sql.Scanner // Implementations can assume the value is ALWAYS a string
}
FieldSerialization - we stand on the shoulders of the well adopted SQL serialization interface here to help us define what string<->value looks like, even though this plugin interface is not tightly coupled to SQL.
type Filter ¶ added in v1.1.5
type Filter interface {
FilterModifiers[Filter]
// Finalize completes the filter, and for the plugin to validated output structure to convert
Finalize() (*FilterInfo, error)
// Builder returns the builder that made it
Builder() FilterBuilder
// Assert that this is a value filter, not an and/or
ValueFilter() ValueFilter
}
Filter is the output of the builder
func ParseFilterParam ¶ added in v1.4.0
type FilterBuilder ¶ added in v1.1.5
type FilterBuilder interface {
FilterModifiers[FilterBuilder]
// Fields is the list of available fields
Fields() []string
// And requires all sub-filters to match
And(and ...Filter) AndFilter
// Or requires any of the sub-filters to match
Or(and ...Filter) OrFilter
// Eq equal - case sensitive
Eq(name string, value driver.Value) Filter
// Neq not equal - case sensitive
Neq(name string, value driver.Value) Filter
// IEq equal - case insensitive
IEq(name string, value driver.Value) Filter
// INeq not equal - case insensitive
NIeq(name string, value driver.Value) Filter
// In one of an array of values
In(name string, value []driver.Value) Filter
// NotIn not one of an array of values
NotIn(name string, value []driver.Value) Filter
// Lt less than
Lt(name string, value driver.Value) Filter
// Gt greater than
Gt(name string, value driver.Value) Filter
// Gte greater than or equal
Gte(name string, value driver.Value) Filter
// Lte less than or equal
Lte(name string, value driver.Value) Filter
// Contains allows the string anywhere - case sensitive
Contains(name string, value driver.Value) Filter
// NotContains disallows the string anywhere - case sensitive
NotContains(name string, value driver.Value) Filter
// IContains allows the string anywhere - case insensitive
IContains(name string, value driver.Value) Filter
// INotContains disallows the string anywhere - case insensitive
NotIContains(name string, value driver.Value) Filter
// StartsWith allows the string at the start - case sensitive
StartsWith(name string, value driver.Value) Filter
// NotStartsWith disallows the string at the start - case sensitive
NotStartsWith(name string, value driver.Value) Filter
// IStartsWith allows the string at the start - case insensitive
IStartsWith(name string, value driver.Value) Filter
// NotIStartsWith disallows the string att the start - case insensitive
NotIStartsWith(name string, value driver.Value) Filter
// EndsWith allows the string at the end - case sensitive
EndsWith(name string, value driver.Value) Filter
// NotEndsWith disallows the string at the end - case sensitive
NotEndsWith(name string, value driver.Value) Filter
// IEndsWith allows the string at the end - case insensitive
IEndsWith(name string, value driver.Value) Filter
// NotIEndsWith disallows the string att the end - case insensitive
NotIEndsWith(name string, value driver.Value) Filter
}
FilterBuilder is the syntax used to build the filter, where And() and Or() can be nested
type FilterInfo ¶ added in v1.1.5
type FilterInfo struct {
GroupBy []string
RequiredFields []string
Sort []*SortField
Skip uint64
Limit uint64
Count bool
CountExpr string
Field string
FieldMods []FieldMod
Op FilterOp
Values []FieldSerialization
Value FieldSerialization
Children []*FilterInfo
}
FilterInfo is the structure returned by Finalize to the plugin, to serialize this filter into the underlying database mechanism's filter language
func (*FilterInfo) String ¶ added in v1.1.5
func (f *FilterInfo) String() string
type FilterJSON ¶ added in v1.4.1
type FilterJSON struct {
Or []*FilterJSON `ffstruct:"FilterJSON" json:"or,omitempty"`
FilterJSONOps
}
func (*FilterJSON) BuildAndFilter ¶ added in v1.4.6
func (jf *FilterJSON) BuildAndFilter(ctx context.Context, fb FilterBuilder, options ...*JSONBuildFilterOpt) (AndFilter, error)
func (*FilterJSON) BuildSubFilter ¶ added in v1.4.6
func (jf *FilterJSON) BuildSubFilter(ctx context.Context, fb FilterBuilder, options ...*JSONBuildFilterOpt) (Filter, error)
type FilterJSONBase ¶ added in v1.4.1
type FilterJSONKeyValue ¶ added in v1.4.1
type FilterJSONKeyValue struct {
FilterJSONBase
Value SimpleFilterValue `ffstruct:"FilterJSON" json:"value,omitempty"`
}
type FilterJSONKeyValues ¶ added in v1.4.1
type FilterJSONKeyValues struct {
FilterJSONBase
Values []SimpleFilterValue `ffstruct:"FilterJSON" json:"values,omitempty"`
}
type FilterJSONOps ¶ added in v1.4.6
type FilterJSONOps struct {
Equal []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"equal,omitempty"`
Eq []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"eq,omitempty"` // short name
NEq []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"neq,omitempty"` // negated short name
Contains []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"contains,omitempty"`
StartsWith []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"startsWith,omitempty"`
EndsWith []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"endsWith,omitempty"`
LessThan []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"lessThan,omitempty"`
LT []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"lt,omitempty"` // short name
LessThanOrEqual []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"lessThanOrEqual,omitempty"`
LTE []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"lte,omitempty"` // short name
GreaterThan []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"greaterThan,omitempty"`
GT []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"gt,omitempty"` // short name
GreaterThanOrEqual []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"greaterThanOrEqual,omitempty"`
GTE []*FilterJSONKeyValue `ffstruct:"FilterJSON" json:"gte,omitempty"` // short name
In []*FilterJSONKeyValues `ffstruct:"FilterJSON" json:"in,omitempty"`
NIn []*FilterJSONKeyValues `ffstruct:"FilterJSON" json:"nin,omitempty"` // negated short name
Null []*FilterJSONBase `ffstruct:"FilterJSON" json:"null,omitempty"`
}
type FilterModifiers ¶ added in v1.2.19
type FilterModifiers[T any] interface { // Sort adds a set of sort conditions (all in a single sort order) Sort(...string) T // GroupBy adds a set of fields to group rows that have the same values into summary rows. Not assured every persistence implementation will support this (doc DBs cannot) GroupBy(...string) T // Ascending sort order Ascending() T // Descending sort order Descending() T // Skip for pagination Skip(uint64) T // Limit for pagination Limit(uint64) T // Request a count to be returned on the total number that match the query Count(c bool) T // Which fields we require to be returned. Only supported when using CRUD layer on top of underlying DB. // Might allow optimization of the query (in the case of SQL DBs, where it can be combined with GroupBy), or request post-query redaction (in the case of document DBs). RequiredFields(...string) T }
type FilterOp ¶ added in v1.1.5
type FilterOp string
FilterOp enum of filter operations that must be implemented by plugins - the string value is used in the core string formatting method (for logging etc.)
const ( // FilterOpAnd and FilterOpAnd FilterOp = "&&" // FilterOpOr or FilterOpOr FilterOp = "||" // FilterOpEq equal FilterOpEq FilterOp = "==" // FilterOpIEq equal FilterOpIEq FilterOp = ":=" // FilterOpNe not equal FilterOpNeq FilterOp = "!=" // FilterOpNIeq not equal FilterOpNIeq FilterOp = ";=" // FilterOpIn in list of values FilterOpIn FilterOp = "IN" // FilterOpNotIn not in list of values FilterOpNotIn FilterOp = "NI" // FilterOpGt greater than FilterOpGt FilterOp = ">>" // FilterOpLt less than FilterOpLt FilterOp = "<<" // FilterOpGte greater than or equal FilterOpGte FilterOp = ">=" // FilterOpLte less than or equal FilterOpLte FilterOp = "<=" // FilterOpCont contains the specified text, case sensitive FilterOpCont FilterOp = "%=" // FilterOpNotCont does not contain the specified text, case sensitive FilterOpNotCont FilterOp = "!%" // FilterOpICont contains the specified text, case insensitive FilterOpICont FilterOp = ":%" // FilterOpNotICont does not contain the specified text, case insensitive FilterOpNotICont FilterOp = ";%" // FilterOpStartsWith contains the specified text, case sensitive FilterOpStartsWith FilterOp = "^=" // FilterOpNotCont does not contain the specified text, case sensitive FilterOpNotStartsWith FilterOp = "!^" // FilterOpICont contains the specified text, case insensitive FilterOpIStartsWith FilterOp = ":^" // FilterOpNotICont does not contain the specified text, case insensitive FilterOpNotIStartsWith FilterOp = ";^" // FilterOpEndsWith contains the specified text, case sensitive FilterOpEndsWith FilterOp = "$=" // FilterOpNotCont does not contain the specified text, case sensitive FilterOpNotEndsWith FilterOp = "!$" // FilterOpICont contains the specified text, case insensitive FilterOpIEndsWith FilterOp = ":$" // FilterOpNotICont does not contain the specified text, case insensitive FilterOpNotIEndsWith FilterOp = ";$" )
The character pairs in this are not used anywhere externally, just in a to-string representation of queries
type FilterResult ¶ added in v1.1.5
type FilterResult struct {
TotalCount *int64
}
FilterResult is has additional info if requested on the query - currently only the total count
type FilterResultsWithCount ¶ added in v1.1.5
type FilterResultsWithCount struct {
Count int64 `json:"count"`
Total *int64 `json:"total,omitempty"` // omitted if a count was not calculated (AlwaysPaginate enabled, and count not specified)
Items interface{} `json:"items"`
}
Note if ItemsResultTyped below might be preferred for new APIs (if you are able to adopt always-return {items:[]} style)
type FormParam ¶
type FormParam struct {
// Name is the name of the parameter, from the Gorilla path mux
Name string
// Description is a message key to a translatable description of the parameter
Description i18n.MessageKey
}
FormParam is a description of a multi-part form parameter
type HandlerFactory ¶
type HandlerFactory struct {
DefaultRequestTimeout time.Duration
MaxTimeout time.Duration
DefaultFilterLimit uint64
MaxFilterSkip uint64
MaxFilterLimit uint64
HandleYAML bool
PassthroughHeaders []string
AlwaysPaginate bool
SupportFieldRedaction bool
BasePath string
BasePathParams []*PathParam
}
func (*HandlerFactory) APIWrapper ¶
func (hs *HandlerFactory) APIWrapper(handler HandlerFunction) http.HandlerFunc
func (*HandlerFactory) RouteHandler ¶
func (hs *HandlerFactory) RouteHandler(route *Route) http.HandlerFunc
func (*HandlerFactory) RoutePath ¶ added in v1.3.0
func (hs *HandlerFactory) RoutePath(route *Route) string
type HandlerFunction ¶ added in v1.4.0
type HasFieldMods ¶ added in v1.3.0
type HasFieldMods interface {
FieldMods() []FieldMod
}
HasFieldMods can be set on a QueryField to do special things that a DB might support - like lowercase index filtering
type Int64Field ¶ added in v1.1.5
type Int64Field struct{}
func (*Int64Field) Description ¶ added in v1.1.5
func (f *Int64Field) Description() string
func (*Int64Field) FilterAsString ¶ added in v1.1.5
func (f *Int64Field) FilterAsString() bool
func (*Int64Field) GetSerialization ¶ added in v1.1.5
func (f *Int64Field) GetSerialization() FieldSerialization
type ItemsResultTyped ¶ added in v1.4.3
type ItemsResultTyped[T any] struct { Count int `ffstruct:"CollectionResults" json:"count"` Total *int64 `ffstruct:"CollectionResults" json:"total,omitempty"` // omitted if a count was not calculated (AlwaysPaginate enabled, and count not specified) Items []T `ffstruct:"CollectionResults" json:"items"` }
func ItemsResult ¶ added in v1.4.3
func ItemsResult[T any](items []T, res *FilterResult, err error) (*ItemsResultTyped[T], error)
ItemsResult is a helper to transform a filter result into a REST API standard payload
type JSONBuildFilterOpt ¶ added in v1.4.6
type JSONBuildFilterOpt struct {
// contains filtered or unexported fields
}
func FieldResolver ¶ added in v1.5.6
func FieldResolver(fn FieldResolverFn) *JSONBuildFilterOpt
If you want to know the full set of fields used in the field, and build a dynamic map of fields that might need JOIN relationships (such as labels)
func SkipFieldValidation ¶ added in v1.4.6
func SkipFieldValidation() *JSONBuildFilterOpt
func ValueResolver ¶ added in v1.4.6
func ValueResolver(fn ValueResolverFn) *JSONBuildFilterOpt
Option to add a handler that will be called at each OR level, before performing the normal processing on each
type JSONField ¶ added in v1.1.5
type JSONField struct{}
func (*JSONField) Description ¶ added in v1.1.5
func (*JSONField) FilterAsString ¶ added in v1.1.5
func (*JSONField) GetSerialization ¶ added in v1.1.5
func (f *JSONField) GetSerialization() FieldSerialization
type MultiConditionFilter ¶ added in v1.1.5
type MultiConditionFilter interface {
Filter
// Add adds filters to the condition
Condition(...Filter) MultiConditionFilter
GetConditions() []Filter
}
MultiConditionFilter gives convenience methods to add conditions
type NullBehavior ¶ added in v1.1.5
type NullBehavior int
NullBehavior specifies whether to sort nulls first or last in a query
const ( NullsDefault NullBehavior = iota NullsFirst NullsLast )
type OpenAPIFormat ¶ added in v1.4.0
type OpenAPIFormat int
const ( OpenAPIFormatJSON OpenAPIFormat = iota OpenAPIFormatYAML )
type OpenAPIHandlerFactory ¶ added in v1.4.0
type OpenAPIHandlerFactory struct {
BaseSwaggerGenOptions SwaggerGenOptions
StaticPublicURL string
DynamicPublicURLHeader string
DynamicPublicURLBuilder func(req *http.Request) string
}
func (*OpenAPIHandlerFactory) OpenAPIHandler ¶ added in v1.4.0
func (ohf *OpenAPIHandlerFactory) OpenAPIHandler(apiPath string, format OpenAPIFormat, routes []*Route) HandlerFunction
func (*OpenAPIHandlerFactory) OpenAPIHandlerVersioned ¶ added in v1.5.4
func (ohf *OpenAPIHandlerFactory) OpenAPIHandlerVersioned(apiPath string, format OpenAPIFormat, apiVersionObject *APIVersion) HandlerFunction
func (*OpenAPIHandlerFactory) SwaggerUIHandler ¶ added in v1.4.0
func (ohf *OpenAPIHandlerFactory) SwaggerUIHandler(openAPIPath string) HandlerFunction
type OrFilter ¶ added in v1.1.5
type OrFilter interface{ MultiConditionFilter }
type PathParam ¶
type PathParam struct {
// Name is the name of the parameter, from the Gorilla path mux
Name string
// Default is the value that will be used in the case no value is supplied
Default string
// Example is a field to fill in, in the helper UI
Example string
// ExampleFromConf is a field to fill in, in the helper UI, from the runtime configuration
ExampleFromConf config.RootKey
// Description is a message key to a translatable description of the parameter
Description i18n.MessageKey
}
PathParam is a description of a path parameter
type QueryBuilder ¶ added in v1.5.7
type QueryBuilder interface {
// Limit sets the limit of the query
Limit(limit uint64) QueryBuilder
// Sort adds a sort filter to the query
Sort(fields ...string) QueryBuilder
// Equal adds an equal filter to the query
Equal(field string, value any, adds ...addOns) QueryBuilder
// NotEqual adds a not equal filter to the query
NotEqual(field string, value any, adds ...addOns) QueryBuilder
// GreaterThan adds a greater than filter to the query
GreaterThan(field string, value any) QueryBuilder
// GreaterThanOrEqual adds a greater than or equal filter to the query
GreaterThanOrEqual(field string, value any) QueryBuilder
// LessThan adds a less than filter to the query
LessThan(field string, value any) QueryBuilder
// LessThanOrEqual adds a less than or equal filter to the query
LessThanOrEqual(field string, value any) QueryBuilder
// In adds an in filter to the query
In(field string, values []any, adds ...addOns) QueryBuilder
// NotIn adds a not in filter to the query
NotIn(field string, values []any, adds ...addOns) QueryBuilder
// Null adds an is null filter to the query
Null(field string) QueryBuilder
// NotNull adds an is not null filter to the query
NotNull(field string) QueryBuilder
// Or creates an OR condition between multiple queries
Or(...QueryBuilder) QueryBuilder
// Query returns the query
Query() *QueryJSON
}
QueryBuilder defines an interface for building queries
func NewQueryBuilder ¶ added in v1.5.7
func NewQueryBuilder() QueryBuilder
type QueryFactory ¶ added in v1.1.5
type QueryFactory interface {
NewFilter(ctx context.Context) FilterBuilder
NewFilterLimit(ctx context.Context, defLimit uint64) FilterBuilder
NewUpdate(ctx context.Context) UpdateBuilder
}
QueryFactory creates a filter builder in the given context, and contains the rules on which fields can be used by the builder (and how they are serialized)
type QueryFields ¶ added in v1.1.5
func (QueryFields) Clone ¶ added in v1.5.6
func (qf QueryFields) Clone() QueryFields
func (QueryFields) NewFilter ¶ added in v1.1.5
func (qf QueryFields) NewFilter(ctx context.Context) FilterBuilder
func (QueryFields) NewFilterLimit ¶ added in v1.1.5
func (qf QueryFields) NewFilterLimit(ctx context.Context, defLimit uint64) FilterBuilder
func (QueryFields) NewUpdate ¶ added in v1.1.5
func (qf QueryFields) NewUpdate(ctx context.Context) UpdateBuilder
type QueryJSON ¶ added in v1.4.1
type QueryJSON struct {
FilterJSON
Skip *uint64 `ffstruct:"FilterJSON" json:"skip,omitempty"`
Limit *uint64 `ffstruct:"FilterJSON" json:"limit,omitempty"`
Sort []string `ffstruct:"FilterJSON" json:"sort,omitempty"`
Count *bool `ffstruct:"FilterJSON" json:"count,omitempty"`
Fields []string `ffstruct:"FilterJSON" json:"fields,omitempty"`
}
func (*QueryJSON) BuildFilter ¶ added in v1.4.1
func (jq *QueryJSON) BuildFilter(ctx context.Context, qf QueryFactory, options ...*JSONBuildFilterOpt) (Filter, error)
func (*QueryJSON) ToBuilder ¶ added in v1.5.7
func (jq *QueryJSON) ToBuilder() QueryBuilder
Converts to a builder - which will add to the underlying query structure (cannot remove existing elements)
type QueryParam ¶
type QueryParam struct {
// Name is the name of the parameter, from the Gorilla path mux
Name string
// IsBool if this is a boolean query
IsBool bool
// IsArray if this is an array parameter (can be specified multiple times)
IsArray bool
// Default is the value that will be used in the case no value is supplied
Default string
// Example is a field to fill in, in the helper UI
Example string
// ExampleFromConf is a field to fill in, in the helper UI, from the runtime configuration
ExampleFromConf config.RootKey
// Description is a message key to a translatable description of the parameter
Description i18n.MessageKey
// Deprecated whether this param is deprecated
Deprecated bool
}
QueryParam is a description of a path parameter
type Route ¶
type Route struct {
// Name is the operation name that will go into the Swagger definition, and prefix input/output schema
Name string
// Path is a Gorilla mux path spec
Path string
// PathParams is a list of documented path parameters
PathParams []*PathParam
// QueryParams is a list of documented query parameters
QueryParams []*QueryParam
// FormParams is a list of documented multi-part form parameters - combine with FormUploadHandler
FormParams []*FormParam
// Method is the HTTP method
Method string
// Description is a message key to a translatable description of the operation
Description i18n.MessageKey
// PreTranslatedDescription is a string describing the operation - used for programmatically generated routes where a built-in string translation is not available
PreTranslatedDescription string
// FilterFactory models the filter fields that can be specified on the API, and will automatically be parsed
FilterFactory QueryFactory
// JSONInputDecoder is a function that does the decoding completely - needed (as this was written pre-generics) for handling arrays
JSONInputDecoder func(req *http.Request, body io.Reader) (interface{}, error)
// JSONInputValue is a function that returns a pointer to a structure to take JSON input
JSONInputValue func() interface{}
// JSONInputMask are fields that aren't available for users to supply on input
JSONInputMask []string
// JSONInputSchema is a custom schema definition, for the case where the auto-gen + mask isn't good enough
JSONInputSchema func(ctx context.Context, schemaGen SchemaGenerator) (*openapi3.SchemaRef, error)
// JSONOutputSchema is a custom schema definition, for the case where the auto-gen + mask isn't good enough
JSONOutputSchema func(ctx context.Context, schemaGen SchemaGenerator) (*openapi3.SchemaRef, error)
// JSONOutputValue is a function that returns a pointer to a structure to take JSON output
JSONOutputValue func() interface{}
// JSONOutputCodes is the success response codes that could be returned by the API. Error codes are explicitly not supported by the framework since they could be subject to change by the errors thrown or how errors are handled.
JSONOutputCodes []int
// JSONHandler is a function for handling JSON content type input. Input/Output objects are returned by JSONInputValue/JSONOutputValue funcs
JSONHandler func(r *APIRequest) (output interface{}, err error)
// FormUploadHandler takes a single file upload, and returns a JSON object
FormUploadHandler func(r *APIRequest) (output interface{}, err error)
// StreamHandler allows for custom request handling with explicit stream (io.ReadCloser) responses
StreamHandler func(r *APIRequest) (output io.ReadCloser, err error)
// CustomResponseRefs allows for specifying custom responses for a route
CustomResponseRefs map[string]*openapi3.ResponseRef
// Deprecated whether this route is deprecated
Deprecated bool
// Tag a category identifier for this route in the generated OpenAPI spec
Tag string
// Extensions allows extension of the route struct by individual microservices
Extensions interface{}
}
Route defines each API operation on the REST API of Firefly Having a standard pluggable layer here on top of Gorilla allows us to autmoatically maintain the OpenAPI specification in-line with the code, while retaining the power of the Gorilla mux without a deep abstraction layer.
type SchemaGenerator ¶ added in v0.1.11
SchemaGenerator is passed into the JSONInputSchema advanced customization function, to give access to tools like object schema generation, for an anyOf schema for example
type SetOperation ¶ added in v1.1.5
type SetOperation struct {
Field string
Value FieldSerialization
}
SetOperation is an individual update action to perform
type SimpleFilterValue ¶ added in v1.4.1
type SimpleFilterValue string
func (SimpleFilterValue) String ¶ added in v1.4.1
func (js SimpleFilterValue) String() string
func (*SimpleFilterValue) UnmarshalJSON ¶ added in v1.4.1
func (js *SimpleFilterValue) UnmarshalJSON(b []byte) error
type SortField ¶ added in v1.1.5
type SortField struct {
Field string
Descending bool
Nulls NullBehavior
}
SortField is field+direction for sorting
type StringField ¶ added in v1.1.5
type StringField struct{}
func (*StringField) Description ¶ added in v1.1.5
func (f *StringField) Description() string
func (*StringField) FilterAsString ¶ added in v1.1.5
func (f *StringField) FilterAsString() bool
func (*StringField) GetSerialization ¶ added in v1.1.5
func (f *StringField) GetSerialization() FieldSerialization
type StringFieldLower ¶ added in v1.3.0
type StringFieldLower struct {
StringField
}
func (*StringFieldLower) FieldMods ¶ added in v1.3.0
func (f *StringFieldLower) FieldMods() []FieldMod
func (*StringFieldLower) FilterAsString ¶ added in v1.3.0
func (f *StringFieldLower) FilterAsString() bool
func (*StringFieldLower) GetSerialization ¶ added in v1.3.0
func (f *StringFieldLower) GetSerialization() FieldSerialization
type SwaggerGen ¶
type SwaggerGen struct {
// contains filtered or unexported fields
}
func NewSwaggerGen ¶
func NewSwaggerGen(options *SwaggerGenOptions) *SwaggerGen
type SwaggerGenOptions ¶ added in v1.4.0
type SwaggerGenOptions struct {
// attributes of openapi3.Info
Title string
Version string
Description string
// descriptions for the route parameters are parsed from the ffstruct tags
// when set this flag to true, if a description is not found, the generator will panic
// this is useful to ensure that all fields are documented
PanicOnMissingDescription bool
SupportFieldRedaction bool
DefaultRequestTimeout time.Duration
// ----------- API version specific options ------------
// options to generate the base URL
BaseURL string
BaseURLVariables map[string]BaseURLVariable
// options of controlling query parameters values
APIMaxFilterSkip uint
APIDefaultFilterLimit string
APIMaxFilterLimit uint
// a custom function to modify the generated OpenAPI spec
RouteCustomizations func(ctx context.Context, sg *SwaggerGen, route *Route, op *openapi3.Operation)
// OpenAPI 3.0.x specific options
Tags openapi3.Tags
ExternalDocs *openapi3.ExternalDocs
}
type TimeField ¶ added in v1.1.5
type TimeField struct{}
func (*TimeField) Description ¶ added in v1.1.5
func (*TimeField) FilterAsString ¶ added in v1.1.5
func (*TimeField) GetSerialization ¶ added in v1.1.5
func (f *TimeField) GetSerialization() FieldSerialization
type UUIDField ¶ added in v1.1.5
type UUIDField struct{}
func (*UUIDField) Description ¶ added in v1.1.5
func (*UUIDField) FilterAsString ¶ added in v1.1.5
func (*UUIDField) GetSerialization ¶ added in v1.1.5
func (f *UUIDField) GetSerialization() FieldSerialization
type Update ¶ added in v1.1.5
type Update interface {
UpdateOps
// IsEmpty
IsEmpty() bool
// Finalize completes the update, and for the plugin to validated output structure to convert
Finalize() (*UpdateInfo, error)
}
type UpdateBuilder ¶ added in v1.1.5
type UpdateBuilder interface {
UpdateOps
// S starts an update that doesn't have any fields
S() Update
// Fields returns the available fields on the update
Fields() []string
}
UpdateBuilder is the output of the builder
type UpdateFactory ¶ added in v1.1.5
type UpdateFactory interface {
New(ctx context.Context) UpdateBuilder
}
UpdateFactory creates a update builder in the given context, and contains the rules on which fields can be used by the builder (and how they are serialized)
type UpdateInfo ¶ added in v1.1.5
type UpdateInfo struct {
SetOperations []*SetOperation
}
UpdateInfo is the structure returned by Finalize to the plugin, to serialize this uilter into the underlying database mechanism's uilter language
func (*UpdateInfo) String ¶ added in v1.1.5
func (u *UpdateInfo) String() string
type ValueFilter ¶ added in v1.4.6
type ValueFilter interface {
// The operation for this filter
Op() FilterOp
// The field name
Field() string
// The value
Value() interface{}
// Set the operation for this filter
SetOp(op FilterOp)
// Set the field name
SetField(f string)
// Set the value
SetValue(v interface{})
}
ValueFilter is accessor functions for non-Or/And filters - for advanced traversal of the un-finalized tree
type ValueResolverFn ¶ added in v1.4.6
type VersionedAPIs ¶ added in v1.5.2
type VersionedAPIs struct {
DefaultVersion string // must be set to a version string if there are more than 1 API versions provided
APIVersions map[string]*APIVersion // a list of APIVersions, with the key being the version string
}