rest-in-contract
Version:
Rest API Contract. This module is the Contract Server nodejs module for `rest-in-contract` project.
934 lines (933 loc) • 26.9 kB
YAML
swagger: "2.0"
info:
description: >
Rest-in-contract Project is a product to let you embrace [Consumer-driven contracts](https://martinfowler.com/articles/consumerDrivenContracts.html).
It is REST in nature so that it fits for integrating with all kind of programming languages.
For more detail about [Project rest-in-contract](http://blog.airic-yu.com/2062/project-rest-in-contracts), you may have a look in our Project rest-in-contract's Homepage for detail introduction.
This rest-in-contract node module is a module for the Local Contract Server which is the core part of the Rest-in-contract project.
version: "1.0"
title: "rest-in-contract"
contact:
email: "airic.yu@gmail.com"
license:
name: "Apache 2.0"
url: "http://www.apache.org/licenses/LICENSE-2.0.html"
externalDocs:
description: "Find out more in Github page"
url: "https://github.com/airicyu/rest-in-contract"
host: "localhost:8000"
basePath: "/api/v1"
tags:
- name: "server"
description: "Contract Server APIs"
- name: "app"
description: "Apps"
- name: "app version"
description: "App Versions"
- name: "contract"
description: "API Contracts"
schemes:
- "http"
paths:
/apps:
post:
tags:
- "app"
summary: "Add an App"
description: ""
operationId: "addApp"
consumes:
- "application/json"
parameters:
- in: body
name: body
description: "An App object that needs to be added"
required: true
schema:
$ref: "#/definitions/App"
responses:
201:
description: "App created"
get:
tags:
- "app"
summary: "Get all Apps"
description: ""
operationId: "getAllAppsId"
responses:
200:
description: "OK"
schema:
type: array
items:
type: string
/apps/{appId}:
get:
tags:
- "app"
summary: "Get an App"
description: ""
operationId: "getApp"
produces:
- application/json
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
responses:
200:
description: "OK"
schema:
$ref: '#/definitions/AppHal'
examples:
application/json+hal:
_links:
self:
href: "/api/v1/apps/80a69a44-3f3b-48c1-a7d1-b34b89117e75"
versions:
href: "/api/v1/apps/80a69a44-3f3b-48c1-a7d1-b34b89117e75/versions"
id: "80a69a44-3f3b-48c1-a7d1-b34b89117e75"
name: "test"
servers:
- "http://example.com:8001"
basepath: "/api"
versionNumbers:
- "0.0.1"
404:
description: "App not found"
put:
tags:
- "app"
summary: "Update an existing App"
description: ""
operationId: "updateApp"
consumes:
- application/json
parameters:
- in: body
name: body
description: "An App object that needs to be updated"
required: true
schema:
$ref: '#/definitions/App'
- in: path
name: appId
description: "App ID"
required: true
type: string
responses:
204:
description: "Update success"
404:
description: "App not found"
delete:
tags:
- "app"
summary: "Delete an App"
description: ""
operationId: "deleteApp"
produces:
- application/json
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
responses:
204:
description: "Delete success"
404:
description: "App not found"
/apps/{appId}/versions:
post:
tags:
- "app"
summary: "Add an App Version"
description: ""
operationId: "addAppVersion"
consumes:
- "application/json"
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
- in: body
name: body
description: "An App Version object that needs to be added"
required: true
schema:
$ref: "#/definitions/AppVersion"
responses:
201:
description: "App Version created"
get:
tags:
- "app"
summary: "Get all App Version Numbers"
description: ""
operationId: "getAllAppVersions"
responses:
200:
description: "OK"
schema:
type: array
items:
type: string
404:
description: "App not found"
/apps/{appId}/versions/{versionNo}:
get:
tags:
- "app"
summary: "Get an App Version"
description: ""
operationId: "getAppVersion"
produces:
- application/json
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
- in: path
name: versionNo
description: "Version number"
required: true
type: string
responses:
200:
description: "OK"
schema:
$ref: '#/definitions/AppVersionHal'
examples:
application/json+hal:
_links:
self:
href: "/api/v1/apps/80a69a44-3f3b-48c1-a7d1-b34b89117e75/versions/0.0.1"
parent:
href: "/api/v1/apps/80a69a44-3f3b-48c1-a7d1-b34b89117e75"
contracts:
href: "/api/v1/apps/80a69a44-3f3b-48c1-a7d1-b34b89117e75/versions/0.0.1/contracts"
v: "80a69a44-3f3b-48c1-a7d1-b34b89117e75"
path: "{{app.basePath}}/v{{version.v}}"
contracts:
- "94923fbd-9092-4a46-ad65-0d8a2e2f551e"
404:
description: "App not found or App Version not found"
put:
tags:
- "app"
summary: "Update an existing App Version"
description: ""
operationId: "updateAppVersion"
consumes:
- application/json
parameters:
- in: body
name: body
description: "App Version object that needs to be updated"
required: true
schema:
$ref: '#/definitions/AppVersion'
- in: path
name: appId
description: "App ID"
required: true
type: string
- in: path
name: versionNo
description: "Version number"
required: true
type: string
responses:
204:
description: "Update success"
404:
description: "App not found or App Version not found"
delete:
tags:
- "app"
summary: "Delete an App Version"
description: ""
operationId: "deleteAppVersion"
produces:
- application/json
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
- in: path
name: versionNo
description: "Version number"
required: true
type: string
responses:
204:
description: "Delete success"
404:
description: "App not found or App Version not found"
/contracts:
post:
tags:
- "contract"
summary: "Add an Contract"
description: ""
operationId: "addContract"
consumes:
- "application/vnd.js.contract"
parameters:
- in: body
name: body
description: "An Contract object as JS script that needs to be added"
required: true
schema:
type: string
example: |-
module.exports = {
"name": "testing for hello contract",
"request": {
"method": "POST",
"urlPath": "/hello/apple",
"queryParameters": [{
"name": "a",
"value": "b"
}],
"body": {
"a": "b"
},
"headers": {}
},
"response": {
"status": 200,
"body": {
"ok"
},
"headers": {}
}
}
responses:
201:
description: "Contract created"
get:
tags:
- "contract"
summary: "Get all Contracts"
description: ""
operationId: "getAllContracts"
responses:
200:
description: "OK"
schema:
type: array
items:
type: string
/contracts/{contractId}:
get:
tags:
- "contract"
summary: "Get an Contract"
description: ""
operationId: "getContract"
produces:
- application/json
parameters:
- in: path
name: contractId
description: "Contract ID"
required: true
type: string
responses:
200:
description: "OK"
schema:
$ref: '#/definitions/ContractHal'
examples:
application/json+hal:
_links:
self:
href: "/api/v1/contracts/94923fbd-9092-4a46-ad65-0d8a2e2f551e"
id: "94923fbd-9092-4a46-ad65-0d8a2e2f551e"
name: "testing for hello contract"
contractScript: "module.exports = { \"id\": \"94923fbd-9092-4a46-ad65-0d8a2e2f551e\", \"name\": \"testing for hello contract\", \"request\": { \"method\": \"POST\", \"urlPath\": \"/hello/apple\", \"queryParameters\": [{\"name\":\"a\",\"value\":\"b\"}], \"body\": { \"a\": \"b\" }, \"headers\": { } }, \"response\": { \"status\": 200, \"body\": \"ok\", \"headers\": {} } }"
application/vnd.js.contract: |-
module.exports = {
"name": "testing for hello contract",
"request": {
"method": "POST",
"urlPath": "/hello/apple",
"queryParameters": [{
"name": "a",
"value": "b"
}],
"body": {
"a": "b"
},
"headers": {}
},
"response": {
"status": 200,
"body": {
"ok"
},
"headers": {}
}
}
404:
description: "App not found"
put:
tags:
- "contract"
summary: "Update an existing Contract"
description: ""
operationId: "updateContract"
consumes:
- "application/vnd.js.contract"
parameters:
- in: path
name: contractId
description: "Contract ID"
required: true
type: string
- in: body
name: body
description: "An Contract object as JS script that needs to be added"
required: true
schema:
type: string
example: |-
module.exports = {
"name": "testing for hello contract",
"request": {
"method": "POST",
"urlPath": "/hello/apple",
"queryParameters": [{
"name": "a",
"value": "b"
}],
"body": {
"a": "b"
},
"headers": {}
},
"response": {
"status": 200,
"body": {
"ok"
},
"headers": {}
}
}
responses:
204:
description: "Update success"
404:
description: "Contract not found"
delete:
tags:
- "contract"
summary: "Delete an Contract"
description: ""
operationId: "deleteContract"
produces:
- application/json
parameters:
- in: path
name: contractId
description: "Contract ID"
required: true
type: string
responses:
204:
description: "Delete success"
404:
description: "Contract not found"
/apps/{appId}/wirestubs:
post:
tags:
- "wirestub"
summary: "Wiring an App's' wirestub"
description: ""
operationId: "wireAppWirestub"
consumes:
- "application/json"
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
- in: body
name: body
description: "An App object that needs to be added"
required: true
schema:
$ref: '#/definitions/Wirestub'
responses:
201:
description: "Wirestub success"
500:
description: "Wirestub fail"
get:
tags:
- "wirestub"
summary: "Get the wirestub metadata"
description: ""
operationId: "getAppWirestub"
consumes:
- "application/json"
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
responses:
200:
description: "OK"
schema:
$ref: '#/definitions/Wirestub'
404:
description: "Wirestub not found"
delete:
tags:
- "wirestub"
summary: "Unwire the wirestub"
description: ""
operationId: "unwireAppWirestub"
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
responses:
201:
description: "Wire wirestub success"
schema:
$ref: '#/definitions/Wirestub'
204:
description: "Unwire wirestub success"
404:
description: "Wirestub not found"
/apps/{appId}/wiretests:
post:
tags:
- "wiretest"
summary: "Testing App's contracts"
description: ""
operationId: "verifyAppContracts"
consumes:
- "application/json"
parameters:
- in: path
name: appId
description: "App ID"
required: true
type: string
- in: body
name: body
description: "An App object that needs to be added"
required: true
schema:
$ref: '#/definitions/Wiretest'
responses:
200:
description: "Test finished"
schema:
$ref: '#/definitions/WiretestResult'
example:
application/json: |-
{
"app": {
"id": "80a69a44-3f3b-48c1-a7d1-b34b89117e75",
"name": "test"
},
"testInfo": {
"timeMS": 76.2579990029335,
"success": true
},
"results": [
{
"versionNo": "0.0.1",
"testInfo": {
"timeMS": 75.7432410120964,
"success": true
},
"results": [
{
"testInfo": {
"timeMS": 51.209954023361206,
"success": true,
"errors": [],
"appId": "80a69a44-3f3b-48c1-a7d1-b34b89117e75",
"version": "0.0.1",
"contract": {
"id": "b9135ab0-20d2-43f3-b947-3bac5b061f61",
"name": "function examples"
}
},
"request": {
"method": "POST",
"urlPath": "http://localhost:8001/api/v0.0.1/function_examples",
"queryParams": {},
"headers": {
"authorization": "Bearer 0a4b6c5d",
"Content-type": "application/json"
},
"body": {
"test": {
"numberString": "13579",
"number": 24680,
"arrayOfValues": [
"apple",
"orange",
"banana"
],
"regular expression": "acp-113520",
"name": "Cristina Hayes",
"email": "Cristina.Hayes82@yahoo.com",
"phone": "1-454-765-8135",
"date": "2017-05-07",
"words": "reiciendis est minima",
"uuid4": "510552bc-c017-452a-bd51-7b1b3d3a5f13",
"multipleChoices": "class A",
"notAnyOf": "c"
}
}
},
"expectedResponseScript": "{ \"status\": 200, \"body\": { \"num\": integer({\"gt\":0,\"lt\":60000}), \"reqBodyJsonParams\": jsonpath(\"$.req.body.test\") }, \"headers\": { \"test-header\": \"dummy\", \"test-regex-header\": regex(\"\\\"/hello/[a-z]{3,5}\\\"\") } }",
"response": {
"status": 200,
"headers": {
"x-powered-by": "Express",
"test-header": "dummy",
"test-regex-header": "\"/hello/njm\"",
"content-type": "application/json; charset=utf-8",
"content-length": "381",
"etag": "W/\"17d-j5SCn3LsQSGqO0vZ5zj/AHLJ8qg\"",
"date": "Tue, 07 May 2017 09:11:28 GMT",
"connection": "close"
},
"body": "{\"num\":56789,\"reqBodyJsonParams\":[{\"numberString\":\"13579\",\"number\":24680,\"arrayOfValues\":[\"apple\",\"orange\",\"banana\"],\"regular expression\":\"acp-113520\",\"name\":\"Cristina Hayes\",\"email\":\"Cristina.Hayes82@yahoo.com\",\"phone\":\"1-454-765-8135\",\"date\":\"2017-05-07\",\"words\":\"reiciendis est minima\",\"uuid4\":\"510552bc-c017-452a-bd51-7b1b3d3a5f13\",\"multipleChoices\":\"class A\",\"notAnyOf\":\"c\"}]}"
}
},
{
"testInfo": {
"timeMS": 22.899529993534088,
"success": true,
"errors": [],
"appId": "80a69a44-3f3b-48c1-a7d1-b34b89117e75",
"version": "0.0.1",
"contract": {
"id": "94923fbd-9092-4a46-ad65-0d8a2e2f551e",
"name": "testing for hello contract"
}
},
"request": {
"method": "POST",
"urlPath": "http://localhost:8001/api/v0.0.1/hello/apple",
"queryParams": {
"a": "b"
},
"headers": {
"Content-type": "application/json"
},
"body": {
"test": {
"a": "13579",
"b": 24680,
"c": [
"apple",
"orange",
"banana"
]
}
}
},
"expectedResponseScript": "{ \"status\": 200, \"body\": { \"num\": integer({\"gt\":0,\"lt\":60000}) }, \"headers\": { \"test-header\": \"dummy\", \"test-regex-header\": regex(\"\\\"/hello/[a-z]{3,5}\\\"\") } }",
"response": {
"status": 200,
"headers": {
"x-powered-by": "Express",
"test-header": "dummy",
"test-regex-header": "\"/hello/hsxuj\"",
"content-type": "application/json; charset=utf-8",
"content-length": "13",
"etag": "W/\"d-X7zzcBORmHVzBfO4n/4UzEkpfkY\"",
"date": "Tue, 07 May 2017 09:11:28 GMT",
"connection": "close"
},
"body": "{\"num\":56789}"
}
}
]
}
]
}
/importAppsFiles:
post:
tags:
- "utils"
summary: "Import Apps Files"
description: ""
operationId: "importAppsFiles"
consumes:
- "application/json"
parameters:
- in: body
name: body
description: "An App object that needs to be added"
required: true
schema:
type: object
required:
- port
- appFolder
properties:
port:
type: integer
appFolder:
type: string
example:
port: 8081
appFolder: "C:/apps_root_import_folder"
responses:
201:
description: "Import success"
definitions:
App:
type: object
required:
- "name"
- "servers"
- "basePath"
properties:
id:
type: string
name:
type: string
servers:
type: array
items:
type: string
basePath:
type: string
AppHal:
type: object
required:
- id
- name
- servers
- basePath
- versionNumbers
- _links
properties:
id:
type: string
name:
type: string
servers:
type: array
items:
type: string
basePath:
type: string
versionNumbers:
type: array
items:
type: string
_links:
type: object
properties:
self:
type: object
properties:
href:
type: string
versions:
type: object
properties:
href:
type: string
AppVersion:
type: object
required:
- "v"
- "path"
- "contracts"
properties:
v:
type: string
path:
type: string
contracts:
type: array
items:
type: string
AppVersionHal:
type: object
required:
- v
- path
- contracts
- _links
properties:
v:
type: string
path:
type: string
contracts:
type: array
items:
type: string
_links:
type: object
properties:
self:
type: object
properties:
href:
type: string
parent:
type: object
properties:
href:
type: string
contracts:
type: object
properties:
href:
type: string
ContractHal:
type: object
required:
- id
- name
- contractScript
- _links
properties:
id:
type: string
name:
type: string
contractScript:
type: string
_links:
type: object
properties:
self:
type: object
properties:
href:
type: string
Wirestub:
type: object
required:
- port
properties:
port:
type: integer
example:
port: 8081
Wiretest:
type: object
required:
- server
properties:
server:
type: string
example:
port: "http://localhost:8001"
WiretestResult:
type: object
properties:
app:
type: object
properties:
id:
type: string
name:
type: string
testInfo:
type: object
properties:
timeMs:
type: number
format: float
success:
type: boolean
results:
type: array
items:
type: object
properties:
versionNo:
type: string
testInfo:
type: object
properties:
timeMs:
type: number
format: float
success:
type: boolean
results:
type: array
items:
type: object
properties:
testInfo:
type: object
properties:
timeMs:
type: number
format: float
success:
type: boolean
errors:
type: array
items:
type: string
appId:
type: string
version:
type: string
contract:
type: object
properties:
id:
type: string
name:
type: string
request:
type: object
properties:
method:
type: string
urlPath:
type: string
queryParams:
type: object
headers:
type: object
body:
type: object
expectedResponseScript:
type: string
response:
type: object
properties:
status:
type: integer
headers:
type: object
body:
type: string