apischema

package module
v0.7.1 Latest Latest
Warning

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

Go to latest
Published: Apr 14, 2020 License: Apache-2.0 Imports: 7 Imported by: 2

README

api-schema

This repo contains types, constructors, and other functions that help in creating and parsing Giant Swarm API responses. It is the source of truth for what our status codes mean, and is useful as a dependency in go programs that wish to talk to or otherwise implement the Giant Swarm API.

docs

For detailed information and responder as well as receiver implementations, see http://godoc.org/github.com/giantswarm/api-schema.

facts
  • HTTP status codes not always meet the required business logic
  • status codes will be tried to match against behaviour
  • error messages conflict with user information
  • thus error handling is pain
  • one wants to use a consistent schema communicating through network
schema
POST /app/

> Content-Type: application/json
{ ... data ... }

< 200
{"status_code": 2000, "status_text": "ok", "data": { ... }}
{"status_code": 2001, "status_text": "created"}

< 500
{"status_code": 4000, "status_text": "bad request"}
{"status_code": 4004, "status_text": "not found"}
{"status_code": 5000, "status_text": "internal server error"}
summary
  • the client makes a request to a well defined URL
  • the URL points to a resource or a colection
  • there are always two respond codes, 200 and 500
  • response code 200 means kind of success
  • response code 500 means kind of failure
  • request and response bodies are always valid JSON
  • there is always a "status_code" field describing internal status using an integer
  • there is always a "status_text" field describing internal status using an string
  • there is optionally a "data" field describing additionally sent data of any type
  • the client defines external user information regarding server responses
usage

Using the middleware-server package a middleware implementation could look like the following.

package v1

import (
	"net/http"

	apiSchemaPkg "github.com/giantswarm/api-schema"
	srvPkg "github.com/giantswarm/middleware-server"
)

// Reply with status "ressource created".
func (this *V1) CreateApp(res http.ResponseWriter, req *http.Request, ctx *srvPkg.Context) error {
	return ctx.Response.Json(apiSchemaPkg.StatusRessourceCreated(), http.StatusOK)
}

// Reply with data.
func (this *V1) StatusApp(res http.ResponseWriter, req *http.Request, ctx *srvPkg.Context) error {
	return ctx.Response.Json(apiSchemaPkg.StatusData("status"), http.StatusOK)
}

Documentation

Index

Constants

View Source
const (
	STATUS_CODE_DATA = 10000

	STATUS_CODE_RESOURCE_UP   = 10001
	STATUS_CODE_RESOURCE_DOWN = 10002

	STATUS_CODE_RESOURCE_CREATED = 10003
	STATUS_CODE_RESOURCE_STARTED = 10004
	STATUS_CODE_RESOURCE_STOPPED = 10005
	STATUS_CODE_RESOURCE_UPDATED = 10006
	STATUS_CODE_RESOURCE_DELETED = 10007

	STATUS_CODE_RESOURCE_NOT_FOUND           = 10008
	STATUS_CODE_RESOURCE_ALREADY_EXISTS      = 10009
	STATUS_CODE_RESOURCE_INVALID_CREDENTIALS = 10010

	STATUS_CODE_CONDITION_TRUE  = 10011
	STATUS_CODE_CONDITION_FALSE = 10012
	STATUS_CODE_WRONG_INPUT     = 10013

	STATUS_CODE_USER_ERROR   = 10014
	STATUS_CODE_SERVER_ERROR = 10015

	STATUS_CODE_INVALID_VERSION_ERROR = 10016

	STATUS_CODE_ACCOUNT_INACTIVE = 10017
)

Variables

This section is empty.

Functions

func IsFailureResponse

func IsFailureResponse(statusCode int) bool

func IsInvalidVersionError

func IsInvalidVersionError(err error) bool

func IsResourceAlreadyExistsError

func IsResourceAlreadyExistsError(err error) bool

func IsResourceDownError

func IsResourceDownError(err error) bool

func IsResourceInvalidCredentialsError

func IsResourceInvalidCredentialsError(err error) bool

func IsResourceNotFoundError

func IsResourceNotFoundError(err error) bool

func IsResourceUpError

func IsResourceUpError(err error) bool

func IsServerError

func IsServerError(err error) bool

func IsServerErrorWithReason

func IsServerErrorWithReason(err error, reason string) bool

func IsStatus

func IsStatus(statusCode int, responseBody string) (bool, error)

func IsStatusAndReason

func IsStatusAndReason(statusCode int, reason, responseBody string) (bool, error)

func IsStatusAndReasonWithRawBody

func IsStatusAndReasonWithRawBody(statusCode int, reason string, resBody *io.ReadCloser) (bool, error)

func IsStatusConditionFalse

func IsStatusConditionFalse(responseBody *io.ReadCloser) (bool, error)

func IsStatusConditionTrue

func IsStatusConditionTrue(responseBody *io.ReadCloser) (bool, error)

func IsStatusData

func IsStatusData(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceAlreadyExists

func IsStatusResourceAlreadyExists(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceCreated

func IsStatusResourceCreated(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceDeleted

func IsStatusResourceDeleted(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceDown

func IsStatusResourceDown(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceInvalidCredentials

func IsStatusResourceInvalidCredentials(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceNotFound

func IsStatusResourceNotFound(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceStarted

func IsStatusResourceStarted(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceStopped

func IsStatusResourceStopped(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceUp

func IsStatusResourceUp(responseBody *io.ReadCloser) (bool, error)

func IsStatusResourceUpdated

func IsStatusResourceUpdated(responseBody *io.ReadCloser) (bool, error)

func IsStatusWithRawBody

func IsStatusWithRawBody(statusCode int, resBody *io.ReadCloser) (bool, error)

func IsStatusWrongInput

func IsStatusWrongInput(responseBody *io.ReadCloser) (bool, error)

func IsStatusWrongInputWithReason

func IsStatusWrongInputWithReason(responseBody *io.ReadCloser, reason string) (bool, error)

func IsSuccessResponse

func IsSuccessResponse(statusCode int) bool

func IsUserError

func IsUserError(err error) bool

func IsWrongInputError

func IsWrongInputError(err error) bool

func IsWrongInputWithReasonError

func IsWrongInputWithReasonError(err error, reason string) bool

func NewResponseError

func NewResponseError(resp *Response) error

func ParseData

func ParseData(resBody *io.ReadCloser, v interface{}) error

Types

type Response

type Response struct {
	StatusCode int             `json:"status_code"`
	StatusText string          `json:"status_text"`
	Data       json.RawMessage `json:"data,omitempty"`
}

func FromHTTPResponse

func FromHTTPResponse(resp *http.Response, err error) (*Response, error)

func NewEmptyResponse

func NewEmptyResponse(statusCode int, statusText string) *Response

func NewResponse

func NewResponse(statusCode int, statusText string, data interface{}) (*Response, error)

func ParseResponse

func ParseResponse(resBody *io.ReadCloser) (*Response, error)

func StatusConditionFalse

func StatusConditionFalse() *Response

func StatusConditionTrue

func StatusConditionTrue() *Response

func StatusInvalidVersion

func StatusInvalidVersion() *Response

func StatusResourceAlreadyExists

func StatusResourceAlreadyExists() *Response

func StatusResourceCreated

func StatusResourceCreated() *Response

func StatusResourceDeleted

func StatusResourceDeleted() *Response

func StatusResourceDown

func StatusResourceDown() *Response

func StatusResourceInvalidCredentials

func StatusResourceInvalidCredentials() *Response

func StatusResourceNotFound

func StatusResourceNotFound() *Response

func StatusResourceStarted

func StatusResourceStarted() *Response

func StatusResourceStopped

func StatusResourceStopped() *Response

func StatusResourceUp

func StatusResourceUp() *Response

func StatusResourceUpdated

func StatusResourceUpdated() *Response

func StatusServerErrorWithReason

func StatusServerErrorWithReason(reason string) *Response

func StatusUserErrorWithReason

func StatusUserErrorWithReason(reason string) *Response

func StatusWrongInput

func StatusWrongInput() *Response

func StatusWrongInputWithReason

func StatusWrongInputWithReason(reason string) *Response

func (*Response) EnsureStatusCodes

func (resp *Response) EnsureStatusCodes(statusCodes ...int) error

func (*Response) UnmarshalData

func (resp *Response) UnmarshalData(v interface{}) error

type ResponseError

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

func (*ResponseError) Error

func (err *ResponseError) Error() string

func (*ResponseError) StatusCode

func (err *ResponseError) StatusCode() int

type ResponsePayload

type ResponsePayload struct {
	StatusCode int         `json:"status_code"`
	StatusText string      `json:"status_text"`
	Data       interface{} `json:"data,omitempty"`
}

func StatusData

func StatusData(data interface{}) ResponsePayload

type ServerResponse

type ServerResponse struct {
	StatusCode int         `json:"status_code"`
	StatusText string      `json:"status_text"`
	Data       interface{} `json:"data"`
}

Jump to

Keyboard shortcuts

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