From c6422b49b8b946386ca1068ec6887bbf07a8b166 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Thu, 10 May 2018 17:10:19 -0700 Subject: 404 example --- golang/api/handlers/entities.go | 56 ++++++++++++++++++++-- golang/cmd/fatcatd/serve.go | 2 +- golang/fatcat-openapi2.yml | 6 ++- golang/gen/models/creator_entity.go | 43 +++++++++++++++++ golang/gen/restapi/embedded_spec.go | 28 ++++++++++- .../restapi/operations/get_creator_id_responses.go | 44 +++++++++++++++++ 6 files changed, 172 insertions(+), 7 deletions(-) diff --git a/golang/api/handlers/entities.go b/golang/api/handlers/entities.go index 61104553..9331a588 100644 --- a/golang/api/handlers/entities.go +++ b/golang/api/handlers/entities.go @@ -3,12 +3,46 @@ package handlers import ( "github.com/go-pg/pg" + "github.com/go-openapi/swag" "github.com/go-openapi/runtime/middleware" + log "github.com/sirupsen/logrus" - //"git.archive.org/bnewbold/fatcat/golang/gen/models" + "git.archive.org/bnewbold/fatcat/golang/gen/models" "git.archive.org/bnewbold/fatcat/golang/gen/restapi/operations" ) +type CreatorRev struct { + tableName struct{} `sql:"creator_rev"` + Id string + ExtraJson string + Name string + Orcid string +} + +type CreatorIdent struct { + tableName struct{} `sql:"creator_ident"` + Id string + IsLive bool + RevId int64 + //Rev *CreatorRev + RedirectId int64 +} + +func (ci *CreatorIdent) State() string { + if ci.IsLive && (ci.RedirectId == 0) && (ci.RevId == 0) { + return "deleted" + } else if ci.IsLive && (ci.RedirectId != 0) { + return "redirect" + } else if ci.IsLive && (ci.RedirectId == 0) && (ci.RevId != 0) { + return "active" + } else if !ci.IsLive && (ci.RedirectId == 0) && (ci.RevId != 0) { + return "wip" + } else { + log.Fatalf("Invalid CreatorIdent state: %v", ci) + panic("fail") + } +} + func NewGetCreatorIDHandler(db *pg.DB) operations.GetCreatorIDHandler { return &getCreatorID{db: db} } @@ -21,9 +55,25 @@ func (d *getCreatorID) Handle(params operations.GetCreatorIDParams) middleware.R // "get or 404" using params.ID. join creator_ident and creator_rev. // populate result data // return that - return middleware.NotImplemented("operation .GetCreatorID has not yet been implemented. Coming soon!") -} + db_entity_ident := &CreatorIdent{Id: swag.StringValue(¶ms.ID)} + err := d.db.Select(db_entity_ident) + //err := d.db.Model(db_entity_ident).Select() + // Relation("Rev"). + // Select() + if err == pg.ErrNoRows { + return operations.NewGetCreatorIDNotFound().WithPayload(&models.Error{Message: swag.String("no such entity")}) + } else if err != nil { + log.Fatal(err) + } + api_entity := &models.CreatorEntity{ + Ident: &db_entity_ident.Id, + State: swag.String(db_entity_ident.State()), + //Name: db_entity_ident.Rev.Name, + //Orcid: db_entity_ident.Rev.Orcid, + } + return operations.NewGetCreatorIDOK().WithPayload(api_entity) +} func NewPostCreatorHandler(db *pg.DB) operations.PostCreatorHandler { diff --git a/golang/cmd/fatcatd/serve.go b/golang/cmd/fatcatd/serve.go index f1eeb995..638fe6ce 100644 --- a/golang/cmd/fatcatd/serve.go +++ b/golang/cmd/fatcatd/serve.go @@ -49,7 +49,7 @@ func main_serve() { db_options, err := pg.ParseURL(viper.GetString("db_url")) if err != nil { - log.Panicf("parsing DB string: {}", err) + log.Panicf("parsing DB string: %v", err) } db := pg.Connect(db_options) defer db.Close() diff --git a/golang/fatcat-openapi2.yml b/golang/fatcat-openapi2.yml index 85d3b4fc..8f2feec9 100644 --- a/golang/fatcat-openapi2.yml +++ b/golang/fatcat-openapi2.yml @@ -34,7 +34,7 @@ definitions: properties: state: type: string - # actually enum of: (wip, active, redirect, deleted) + enum: ["wip", "active", "redirect", "deleted"] ident: type: string # format: uuid @@ -79,6 +79,10 @@ paths: description: fetch a single creator by id schema: $ref: "#/definitions/creator_entity" + 404: + description: no such creator + schema: + $ref: "#/definitions/error" default: description: generic error response schema: diff --git a/golang/gen/models/creator_entity.go b/golang/gen/models/creator_entity.go index d094376a..be3bb6d1 100644 --- a/golang/gen/models/creator_entity.go +++ b/golang/gen/models/creator_entity.go @@ -6,6 +6,8 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "encoding/json" + strfmt "github.com/go-openapi/strfmt" "github.com/go-openapi/errors" @@ -35,6 +37,7 @@ type CreatorEntity struct { // state // Required: true + // Enum: [wip active redirect deleted] State *string `json:"state"` } @@ -65,12 +68,52 @@ func (m *CreatorEntity) validateIdent(formats strfmt.Registry) error { return nil } +var creatorEntityTypeStatePropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["wip","active","redirect","deleted"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + creatorEntityTypeStatePropEnum = append(creatorEntityTypeStatePropEnum, v) + } +} + +const ( + + // CreatorEntityStateWip captures enum value "wip" + CreatorEntityStateWip string = "wip" + + // CreatorEntityStateActive captures enum value "active" + CreatorEntityStateActive string = "active" + + // CreatorEntityStateRedirect captures enum value "redirect" + CreatorEntityStateRedirect string = "redirect" + + // CreatorEntityStateDeleted captures enum value "deleted" + CreatorEntityStateDeleted string = "deleted" +) + +// prop value enum +func (m *CreatorEntity) validateStateEnum(path, location string, value string) error { + if err := validate.Enum(path, location, value, creatorEntityTypeStatePropEnum); err != nil { + return err + } + return nil +} + func (m *CreatorEntity) validateState(formats strfmt.Registry) error { if err := validate.Required("state", "body", m.State); err != nil { return err } + // value enum + if err := m.validateStateEnum("state", "body", *m.State); err != nil { + return err + } + return nil } diff --git a/golang/gen/restapi/embedded_spec.go b/golang/gen/restapi/embedded_spec.go index 6a6cf356..4e08594f 100644 --- a/golang/gen/restapi/embedded_spec.go +++ b/golang/gen/restapi/embedded_spec.go @@ -72,6 +72,12 @@ func init() { "$ref": "#/definitions/creator_entity" } }, + "404": { + "description": "no such creator", + "schema": { + "$ref": "#/definitions/error" + } + }, "default": { "description": "generic error response", "schema": { @@ -114,7 +120,13 @@ func init() { "type": "string" }, "state": { - "type": "string" + "type": "string", + "enum": [ + "wip", + "active", + "redirect", + "deleted" + ] } } }, @@ -186,6 +198,12 @@ func init() { "$ref": "#/definitions/creator_entity" } }, + "404": { + "description": "no such creator", + "schema": { + "$ref": "#/definitions/error" + } + }, "default": { "description": "generic error response", "schema": { @@ -228,7 +246,13 @@ func init() { "type": "string" }, "state": { - "type": "string" + "type": "string", + "enum": [ + "wip", + "active", + "redirect", + "deleted" + ] } } }, diff --git a/golang/gen/restapi/operations/get_creator_id_responses.go b/golang/gen/restapi/operations/get_creator_id_responses.go index 4c1cee1b..58dcb687 100644 --- a/golang/gen/restapi/operations/get_creator_id_responses.go +++ b/golang/gen/restapi/operations/get_creator_id_responses.go @@ -57,6 +57,50 @@ func (o *GetCreatorIDOK) WriteResponse(rw http.ResponseWriter, producer runtime. } } +// GetCreatorIDNotFoundCode is the HTTP code returned for type GetCreatorIDNotFound +const GetCreatorIDNotFoundCode int = 404 + +/*GetCreatorIDNotFound no such creator + +swagger:response getCreatorIdNotFound +*/ +type GetCreatorIDNotFound struct { + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewGetCreatorIDNotFound creates GetCreatorIDNotFound with default headers values +func NewGetCreatorIDNotFound() *GetCreatorIDNotFound { + + return &GetCreatorIDNotFound{} +} + +// WithPayload adds the payload to the get creator Id not found response +func (o *GetCreatorIDNotFound) WithPayload(payload *models.Error) *GetCreatorIDNotFound { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get creator Id not found response +func (o *GetCreatorIDNotFound) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetCreatorIDNotFound) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(404) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} + /*GetCreatorIDDefault generic error response swagger:response getCreatorIdDefault -- cgit v1.2.3