diff --git a/pkg/handler/crud.go b/pkg/handler/crud.go index fb98b389..d47d2881 100644 --- a/pkg/handler/crud.go +++ b/pkg/handler/crud.go @@ -13,6 +13,7 @@ import ( type CRUD interface { FindFlags(flag.FindFlagsParams) middleware.Responder CreateFlag(flag.CreateFlagParams) middleware.Responder + GetFlag(flag.GetFlagParams) middleware.Responder } // NewCRUD creates a new CRUD instance @@ -48,3 +49,15 @@ func (c *crud) CreateFlag(params flag.CreateFlagParams) middleware.Responder { resp.SetPayload(e2r.MapFlag(f)) return resp } + +func (c *crud) GetFlag(params flag.GetFlagParams) middleware.Responder { + f := &entity.Flag{} + q := entity.NewFlagQuerySet(repo.GetDB()) + err := q.IDEq(uint(params.FlagID)).One(f) + if err != nil { + return flag.NewGetFlagDefault(500) + } + resp := flag.NewGetFlagOK() + resp.SetPayload(e2r.MapFlag(f)) + return resp +} diff --git a/pkg/handler/handler.go b/pkg/handler/handler.go index 8e6a78bf..a72fb7c0 100644 --- a/pkg/handler/handler.go +++ b/pkg/handler/handler.go @@ -18,6 +18,7 @@ func Setup(api *operations.FlagrAPI) { c := NewCRUD() api.FlagFindFlagsHandler = flag.FindFlagsHandlerFunc(c.FindFlags) api.FlagCreateFlagHandler = flag.CreateFlagHandlerFunc(c.CreateFlag) + api.FlagGetFlagHandler = flag.GetFlagHandlerFunc(c.GetFlag) e := NewEval() api.EvaluationPostEvaluationHandler = evaluation.PostEvaluationHandlerFunc(e.PostEvaluation) diff --git a/swagger.yml b/swagger.yml index 34c45e62..e4c34e17 100644 --- a/swagger.yml +++ b/swagger.yml @@ -48,7 +48,28 @@ paths: description: generic error response schema: $ref: "#/definitions/error" - + /flags/{flagID}: + get: + tags: + - flag + operationId: getFlag + parameters: + - in: path + name: flagID + description: numeric ID of the flag to get + required: true + type: integer + format: int32 + minimum: 1 + responses: + 200: + description: returns the flag + schema: + $ref: "#/definitions/flag" + default: + description: generic error response + schema: + $ref: "#/definitions/error" /evaluation: post: tags: diff --git a/swagger_gen/restapi/embedded_spec.go b/swagger_gen/restapi/embedded_spec.go index ac22a716..019936b7 100644 --- a/swagger_gen/restapi/embedded_spec.go +++ b/swagger_gen/restapi/embedded_spec.go @@ -116,6 +116,39 @@ func init() { } } } + }, + "/flags/{flagID}": { + "get": { + "tags": [ + "flag" + ], + "operationId": "getFlag", + "parameters": [ + { + "minimum": 1, + "type": "integer", + "format": "int32", + "description": "numeric ID of the flag to get", + "name": "flagID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "returns the flag", + "schema": { + "$ref": "#/definitions/flag" + } + }, + "default": { + "description": "generic error response", + "schema": { + "$ref": "#/definitions/error" + } + } + } + } } }, "definitions": { diff --git a/swagger_gen/restapi/operations/flag/get_flag.go b/swagger_gen/restapi/operations/flag/get_flag.go new file mode 100644 index 00000000..1036b0b0 --- /dev/null +++ b/swagger_gen/restapi/operations/flag/get_flag.go @@ -0,0 +1,58 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package flag + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "net/http" + + middleware "github.com/go-openapi/runtime/middleware" +) + +// GetFlagHandlerFunc turns a function with the right signature into a get flag handler +type GetFlagHandlerFunc func(GetFlagParams) middleware.Responder + +// Handle executing the request and returning a response +func (fn GetFlagHandlerFunc) Handle(params GetFlagParams) middleware.Responder { + return fn(params) +} + +// GetFlagHandler interface for that can handle valid get flag params +type GetFlagHandler interface { + Handle(GetFlagParams) middleware.Responder +} + +// NewGetFlag creates a new http.Handler for the get flag operation +func NewGetFlag(ctx *middleware.Context, handler GetFlagHandler) *GetFlag { + return &GetFlag{Context: ctx, Handler: handler} +} + +/*GetFlag swagger:route GET /flags/{flagID} flag getFlag + +GetFlag get flag API + +*/ +type GetFlag struct { + Context *middleware.Context + Handler GetFlagHandler +} + +func (o *GetFlag) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + r = rCtx + } + var Params = NewGetFlagParams() + + if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params + o.Context.Respond(rw, r, route.Produces, route, err) + return + } + + res := o.Handler.Handle(Params) // actually handle the request + + o.Context.Respond(rw, r, route.Produces, route, res) + +} diff --git a/swagger_gen/restapi/operations/flag/get_flag_parameters.go b/swagger_gen/restapi/operations/flag/get_flag_parameters.go new file mode 100644 index 00000000..d6d8fe8f --- /dev/null +++ b/swagger_gen/restapi/operations/flag/get_flag_parameters.go @@ -0,0 +1,86 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package flag + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/swag" + "github.com/go-openapi/validate" + + strfmt "github.com/go-openapi/strfmt" +) + +// NewGetFlagParams creates a new GetFlagParams object +// with the default values initialized. +func NewGetFlagParams() GetFlagParams { + var () + return GetFlagParams{} +} + +// GetFlagParams contains all the bound params for the get flag operation +// typically these are obtained from a http.Request +// +// swagger:parameters getFlag +type GetFlagParams struct { + + // HTTP Request Object + HTTPRequest *http.Request + + /*numeric ID of the flag to get + Required: true + Minimum: 1 + In: path + */ + FlagID int32 +} + +// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetFlagParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + o.HTTPRequest = r + + rFlagID, rhkFlagID, _ := route.Params.GetOK("flagID") + if err := o.bindFlagID(rFlagID, rhkFlagID, route.Formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetFlagParams) bindFlagID(rawData []string, hasKey bool, formats strfmt.Registry) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt32(raw) + if err != nil { + return errors.InvalidType("flagID", "path", "int32", raw) + } + o.FlagID = value + + if err := o.validateFlagID(formats); err != nil { + return err + } + + return nil +} + +func (o *GetFlagParams) validateFlagID(formats strfmt.Registry) error { + + if err := validate.MinimumInt("flagID", "path", int64(o.FlagID), 1, false); err != nil { + return err + } + + return nil +} diff --git a/swagger_gen/restapi/operations/flag/get_flag_responses.go b/swagger_gen/restapi/operations/flag/get_flag_responses.go new file mode 100644 index 00000000..31b72a07 --- /dev/null +++ b/swagger_gen/restapi/operations/flag/get_flag_responses.go @@ -0,0 +1,115 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package flag + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/runtime" + + "github.com/checkr/flagr/swagger_gen/models" +) + +// GetFlagOKCode is the HTTP code returned for type GetFlagOK +const GetFlagOKCode int = 200 + +/*GetFlagOK returns the flag + +swagger:response getFlagOK +*/ +type GetFlagOK struct { + + /* + In: Body + */ + Payload *models.Flag `json:"body,omitempty"` +} + +// NewGetFlagOK creates GetFlagOK with default headers values +func NewGetFlagOK() *GetFlagOK { + return &GetFlagOK{} +} + +// WithPayload adds the payload to the get flag o k response +func (o *GetFlagOK) WithPayload(payload *models.Flag) *GetFlagOK { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get flag o k response +func (o *GetFlagOK) SetPayload(payload *models.Flag) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetFlagOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(200) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} + +/*GetFlagDefault generic error response + +swagger:response getFlagDefault +*/ +type GetFlagDefault struct { + _statusCode int + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewGetFlagDefault creates GetFlagDefault with default headers values +func NewGetFlagDefault(code int) *GetFlagDefault { + if code <= 0 { + code = 500 + } + + return &GetFlagDefault{ + _statusCode: code, + } +} + +// WithStatusCode adds the status to the get flag default response +func (o *GetFlagDefault) WithStatusCode(code int) *GetFlagDefault { + o._statusCode = code + return o +} + +// SetStatusCode sets the status to the get flag default response +func (o *GetFlagDefault) SetStatusCode(code int) { + o._statusCode = code +} + +// WithPayload adds the payload to the get flag default response +func (o *GetFlagDefault) WithPayload(payload *models.Error) *GetFlagDefault { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get flag default response +func (o *GetFlagDefault) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetFlagDefault) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(o._statusCode) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} diff --git a/swagger_gen/restapi/operations/flag/get_flag_urlbuilder.go b/swagger_gen/restapi/operations/flag/get_flag_urlbuilder.go new file mode 100644 index 00000000..5788fda4 --- /dev/null +++ b/swagger_gen/restapi/operations/flag/get_flag_urlbuilder.go @@ -0,0 +1,100 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package flag + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "errors" + "net/url" + golangswaggerpaths "path" + "strings" + + "github.com/go-openapi/swag" +) + +// GetFlagURL generates an URL for the get flag operation +type GetFlagURL struct { + FlagID int32 + + _basePath string + // avoid unkeyed usage + _ struct{} +} + +// WithBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *GetFlagURL) WithBasePath(bp string) *GetFlagURL { + o.SetBasePath(bp) + return o +} + +// SetBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *GetFlagURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *GetFlagURL) Build() (*url.URL, error) { + var result url.URL + + var _path = "/flags/{flagID}" + + flagID := swag.FormatInt32(o.FlagID) + if flagID != "" { + _path = strings.Replace(_path, "{flagID}", flagID, -1) + } else { + return nil, errors.New("FlagID is required on GetFlagURL") + } + _basePath := o._basePath + if _basePath == "" { + _basePath = "/api" + } + result.Path = golangswaggerpaths.Join(_basePath, _path) + + return &result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *GetFlagURL) Must(u *url.URL, err error) *url.URL { + if err != nil { + panic(err) + } + if u == nil { + panic("url can't be nil") + } + return u +} + +// String returns the string representation of the path with query string +func (o *GetFlagURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *GetFlagURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on GetFlagURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on GetFlagURL") + } + + base, err := o.Build() + if err != nil { + return nil, err + } + + base.Scheme = scheme + base.Host = host + return base, nil +} + +// StringFull returns the string representation of a complete url +func (o *GetFlagURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/swagger_gen/restapi/operations/flagr_api.go b/swagger_gen/restapi/operations/flagr_api.go index 42e34ef9..32a5b9de 100644 --- a/swagger_gen/restapi/operations/flagr_api.go +++ b/swagger_gen/restapi/operations/flagr_api.go @@ -44,6 +44,9 @@ func NewFlagrAPI(spec *loads.Document) *FlagrAPI { FlagFindFlagsHandler: flag.FindFlagsHandlerFunc(func(params flag.FindFlagsParams) middleware.Responder { return middleware.NotImplemented("operation FlagFindFlags has not yet been implemented") }), + FlagGetFlagHandler: flag.GetFlagHandlerFunc(func(params flag.GetFlagParams) middleware.Responder { + return middleware.NotImplemented("operation FlagGetFlag has not yet been implemented") + }), EvaluationPostEvaluationHandler: evaluation.PostEvaluationHandlerFunc(func(params evaluation.PostEvaluationParams) middleware.Responder { return middleware.NotImplemented("operation EvaluationPostEvaluation has not yet been implemented") }), @@ -80,6 +83,8 @@ type FlagrAPI struct { FlagCreateFlagHandler flag.CreateFlagHandler // FlagFindFlagsHandler sets the operation handler for the find flags operation FlagFindFlagsHandler flag.FindFlagsHandler + // FlagGetFlagHandler sets the operation handler for the get flag operation + FlagGetFlagHandler flag.GetFlagHandler // EvaluationPostEvaluationHandler sets the operation handler for the post evaluation operation EvaluationPostEvaluationHandler evaluation.PostEvaluationHandler @@ -153,6 +158,10 @@ func (o *FlagrAPI) Validate() error { unregistered = append(unregistered, "flag.FindFlagsHandler") } + if o.FlagGetFlagHandler == nil { + unregistered = append(unregistered, "flag.GetFlagHandler") + } + if o.EvaluationPostEvaluationHandler == nil { unregistered = append(unregistered, "evaluation.PostEvaluationHandler") } @@ -257,6 +266,11 @@ func (o *FlagrAPI) initHandlerCache() { } o.handlers["GET"]["/flags"] = flag.NewFindFlags(o.context, o.FlagFindFlagsHandler) + if o.handlers["GET"] == nil { + o.handlers["GET"] = make(map[string]http.Handler) + } + o.handlers["GET"]["/flags/{flagID}"] = flag.NewGetFlag(o.context, o.FlagGetFlagHandler) + if o.handlers["POST"] == nil { o.handlers["POST"] = make(map[string]http.Handler) }