Chore: Swagger Docs V1 (#546)
This commit is contained in:
parent
eea92bd0ac
commit
e2688d5176
25 changed files with 739 additions and 0 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -37,6 +37,10 @@ public/packs*
|
||||||
*.swo
|
*.swo
|
||||||
*.un~
|
*.un~
|
||||||
.jest-cache
|
.jest-cache
|
||||||
|
|
||||||
|
#VS Code files
|
||||||
|
.vscode
|
||||||
|
|
||||||
# ignore jetbrains IDE files
|
# ignore jetbrains IDE files
|
||||||
.idea
|
.idea
|
||||||
|
|
||||||
|
|
3
Gemfile
3
Gemfile
|
@ -83,6 +83,9 @@ group :development do
|
||||||
gem 'bullet'
|
gem 'bullet'
|
||||||
gem 'letter_opener'
|
gem 'letter_opener'
|
||||||
gem 'web-console'
|
gem 'web-console'
|
||||||
|
|
||||||
|
# used in swagger build
|
||||||
|
gem 'json_refs', git: 'https://github.com/sony-mathew/json_refs', ref: 'b6c142a'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
|
|
10
Gemfile.lock
10
Gemfile.lock
|
@ -5,6 +5,14 @@ GIT
|
||||||
twitty (0.1.0)
|
twitty (0.1.0)
|
||||||
oauth
|
oauth
|
||||||
|
|
||||||
|
GIT
|
||||||
|
remote: https://github.com/sony-mathew/json_refs
|
||||||
|
revision: b6c142ae486e399d00fbc758e21a7ed63a934f61
|
||||||
|
ref: b6c142a
|
||||||
|
specs:
|
||||||
|
json_refs (0.1.2)
|
||||||
|
hana
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
|
@ -201,6 +209,7 @@ GEM
|
||||||
os (>= 0.9, < 2.0)
|
os (>= 0.9, < 2.0)
|
||||||
signet (~> 0.12)
|
signet (~> 0.12)
|
||||||
haikunator (1.1.0)
|
haikunator (1.1.0)
|
||||||
|
hana (1.3.5)
|
||||||
hashie (4.1.0)
|
hashie (4.1.0)
|
||||||
http-accept (1.7.0)
|
http-accept (1.7.0)
|
||||||
http-cookie (1.0.3)
|
http-cookie (1.0.3)
|
||||||
|
@ -498,6 +507,7 @@ DEPENDENCIES
|
||||||
haikunator
|
haikunator
|
||||||
hashie
|
hashie
|
||||||
jbuilder
|
jbuilder
|
||||||
|
json_refs!
|
||||||
jwt
|
jwt
|
||||||
kaminari
|
kaminari
|
||||||
koala
|
koala
|
||||||
|
|
18
app/controllers/swagger_controller.rb
Normal file
18
app/controllers/swagger_controller.rb
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
class SwaggerController < ApplicationController
|
||||||
|
def respond
|
||||||
|
if Rails.env.development? || Rails.env.test?
|
||||||
|
render inline: File.read(Rails.root.join('swagger', derived_path))
|
||||||
|
else
|
||||||
|
head 404
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def derived_path
|
||||||
|
params[:path] ||= 'index.html'
|
||||||
|
path = params[:path]
|
||||||
|
path << ".#{params[:format]}" unless path.ends_with?(params[:format].to_s)
|
||||||
|
path
|
||||||
|
end
|
||||||
|
end
|
|
@ -144,4 +144,8 @@ Rails.application.routes.draw do
|
||||||
mount Sidekiq::Web, at: '/sidekiq'
|
mount Sidekiq::Web, at: '/sidekiq'
|
||||||
end
|
end
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Routes for swagger docs
|
||||||
|
get '/swagger/*path', to: 'swagger#respond'
|
||||||
|
get '/swagger', to: 'swagger#respond'
|
||||||
end
|
end
|
||||||
|
|
22
lib/tasks/swagger.rake
Normal file
22
lib/tasks/swagger.rake
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
namespace :swagger do
|
||||||
|
desc 'build combined swagger.json file from all the fragmented definitions and paths inside swagger folder'
|
||||||
|
task build: :environment do
|
||||||
|
require 'json_refs'
|
||||||
|
|
||||||
|
base_path = Rails.root.join('swagger')
|
||||||
|
Dir.chdir(base_path) do
|
||||||
|
swagger_index = YAML.safe_load(File.open('index.yml'))
|
||||||
|
|
||||||
|
final_build = JsonRefs.call(
|
||||||
|
swagger_index,
|
||||||
|
resolve_local_ref: false,
|
||||||
|
resolve_file_ref: true,
|
||||||
|
logging: true
|
||||||
|
)
|
||||||
|
File.write('swagger.json', JSON.pretty_generate(final_build))
|
||||||
|
puts 'Swagger build was succesful.'
|
||||||
|
puts "Generated #{base_path}/swagger.json"
|
||||||
|
puts 'Go to http://localhost:3000/swagger see the changes.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
12
spec/controllers/swagger_controller_spec.rb
Normal file
12
spec/controllers/swagger_controller_spec.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe '/swagger', type: :request do
|
||||||
|
describe 'GET /swagger' do
|
||||||
|
it 'renders swagger index.html' do
|
||||||
|
get '/swagger'
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
expect(response.body).to include('redoc')
|
||||||
|
expect(response.body).to include('/swagger.json')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
9
swagger/definitions/error/bad_request.yml
Normal file
9
swagger/definitions/error/bad_request.yml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
title: data
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
description:
|
||||||
|
type: string
|
||||||
|
errors:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/request_error'
|
8
swagger/definitions/error/request.yml
Normal file
8
swagger/definitions/error/request.yml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
field:
|
||||||
|
type: string
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
code:
|
||||||
|
type: string
|
39
swagger/definitions/index.yml
Normal file
39
swagger/definitions/index.yml
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# ERROR
|
||||||
|
bad_request_error:
|
||||||
|
$ref: ./error/bad_request.yml
|
||||||
|
request_error:
|
||||||
|
$ref: ./error/request.yml
|
||||||
|
|
||||||
|
# RESOURCE
|
||||||
|
contact:
|
||||||
|
$ref: ./resource/contact.yml
|
||||||
|
conversation:
|
||||||
|
$ref: ./resource/conversation.yml
|
||||||
|
|
||||||
|
# RESPONSE
|
||||||
|
extended_contact:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/contact'
|
||||||
|
- $ref: ./resource/extension/contact/show.yml
|
||||||
|
contact_base:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/contact'
|
||||||
|
- $ref: ./resource/extension/generic.yml
|
||||||
|
contact_list:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/contact'
|
||||||
|
- $ref: ./resource/extension/generic.yml
|
||||||
|
contact_conversations:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/conversation'
|
||||||
|
- $ref: ./resource/extension/contact/conversation.yml
|
||||||
|
|
||||||
|
# REQUEST
|
||||||
|
contact_create:
|
||||||
|
$ref: ./request/contact/create.yml
|
||||||
|
contact_update:
|
||||||
|
$ref: ./request/contact/update.yml
|
6
swagger/definitions/request/contact/create.yml
Normal file
6
swagger/definitions/request/contact/create.yml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
account_id:
|
||||||
|
type: number
|
||||||
|
inbox_id:
|
||||||
|
type: number
|
8
swagger/definitions/request/contact/update.yml
Normal file
8
swagger/definitions/request/contact/update.yml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
phone_number:
|
||||||
|
type: string
|
12
swagger/definitions/resource/contact.yml
Normal file
12
swagger/definitions/resource/contact.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
phone_number:
|
||||||
|
type: string
|
||||||
|
thumbnail:
|
||||||
|
type: string
|
||||||
|
additional_attributes:
|
||||||
|
type: object
|
21
swagger/definitions/resource/conversation.yml
Normal file
21
swagger/definitions/resource/conversation.yml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
display_id:
|
||||||
|
type: number
|
||||||
|
messages:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
inbox_id:
|
||||||
|
type: number
|
||||||
|
status:
|
||||||
|
type: string
|
||||||
|
enum: ['open', 'resolved']
|
||||||
|
timestamp:
|
||||||
|
type: string
|
||||||
|
user_last_seen_at:
|
||||||
|
type: string
|
||||||
|
agent_last_seen_at:
|
||||||
|
type: agent_last_seen_at
|
||||||
|
unread_count:
|
||||||
|
type: number
|
|
@ -0,0 +1,18 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
meta:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
sender:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: number
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
thumbnail:
|
||||||
|
type: string
|
||||||
|
channel:
|
||||||
|
type: string
|
||||||
|
assignee:
|
||||||
|
type: object
|
5
swagger/definitions/resource/extension/contact/list.yml
Normal file
5
swagger/definitions/resource/extension/contact/list.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/contact'
|
||||||
|
- $ref: ./resource/extension/contact.yaml
|
7
swagger/definitions/resource/extension/contact/show.yml
Normal file
7
swagger/definitions/resource/extension/contact/show.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: number
|
||||||
|
availability_status:
|
||||||
|
type: string
|
||||||
|
enum: ['online', 'offline']
|
4
swagger/definitions/resource/extension/generic.yml
Normal file
4
swagger/definitions/resource/extension/generic.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: number
|
23
swagger/index.html
Normal file
23
swagger/index.html
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>ReDoc</title>
|
||||||
|
<!-- needed for adaptive design -->
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
|
||||||
|
<!--
|
||||||
|
ReDoc doesn't change outer page styles
|
||||||
|
-->
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<redoc spec-url='/swagger/swagger.json'></redoc>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"> </script>
|
||||||
|
</body>
|
||||||
|
</html>
|
17
swagger/index.yml
Normal file
17
swagger/index.yml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
swagger: 2.0
|
||||||
|
info:
|
||||||
|
description: This is the api documentation for Chatwoot server.
|
||||||
|
version: 1.0.0
|
||||||
|
title: Chatwoot
|
||||||
|
termsOfService: https://www.chatwoot.com/terms-of-service/
|
||||||
|
contact:
|
||||||
|
email: support@chatwoot.com
|
||||||
|
license:
|
||||||
|
name: MIT License
|
||||||
|
url: https://opensource.org/licenses/MIT
|
||||||
|
host: app.chatwoot.com
|
||||||
|
basePath: /api/v1/
|
||||||
|
paths:
|
||||||
|
$ref: ./paths/index.yml
|
||||||
|
definitions:
|
||||||
|
$ref: ./definitions/index.yml
|
18
swagger/paths/contact/conversations.yml
Normal file
18
swagger/paths/contact/conversations.yml
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
get:
|
||||||
|
tags: [Contact]
|
||||||
|
summary: Conversations
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
type: number
|
||||||
|
description: ID of contact
|
||||||
|
required: true
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Success
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/contact_conversations'
|
||||||
|
404:
|
||||||
|
description: Contact not found
|
||||||
|
403:
|
||||||
|
description: Access denied
|
42
swagger/paths/contact/crud.yml
Normal file
42
swagger/paths/contact/crud.yml
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
get:
|
||||||
|
tags: [Contact]
|
||||||
|
summary: Show Contact
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
type: number
|
||||||
|
description: ID of contact
|
||||||
|
required: true
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Success
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/extended_contact'
|
||||||
|
404:
|
||||||
|
description: Contact not found
|
||||||
|
403:
|
||||||
|
description: Access denied
|
||||||
|
|
||||||
|
put:
|
||||||
|
tags: [Contact]
|
||||||
|
summary: Update Contact
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
type: number
|
||||||
|
description: ID of the contact
|
||||||
|
required: true
|
||||||
|
- name: data
|
||||||
|
in: body
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/contact_update'
|
||||||
|
responses:
|
||||||
|
204:
|
||||||
|
description: Success
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/contact_base'
|
||||||
|
404:
|
||||||
|
description: Contact not found
|
||||||
|
403:
|
||||||
|
description: Access denied
|
36
swagger/paths/contact/list_create.yml
Normal file
36
swagger/paths/contact/list_create.yml
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
get:
|
||||||
|
tags: [Contact]
|
||||||
|
description: Listing all contacts with pagination
|
||||||
|
summary: List contacts
|
||||||
|
parameters:
|
||||||
|
- name: query_hash
|
||||||
|
in: query
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Success
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/contact_list'
|
||||||
|
400:
|
||||||
|
description: Bad Request Error
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/bad_request_error'
|
||||||
|
|
||||||
|
post:
|
||||||
|
tags: [Contact]
|
||||||
|
description: Create a contact
|
||||||
|
parameters:
|
||||||
|
- name: data
|
||||||
|
in: body
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/contact_create'
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Success
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/extended_contact'
|
||||||
|
400:
|
||||||
|
description: Bad Request Error
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/bad_request_error'
|
7
swagger/paths/index.yml
Normal file
7
swagger/paths/index.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Contacts
|
||||||
|
/contacts:
|
||||||
|
$ref: ./contact/list_create.yml
|
||||||
|
/contacts/{id}:
|
||||||
|
$ref: ./contact/crud.yml
|
||||||
|
/contacts/{id}/conversations:
|
||||||
|
$ref: ./contact/conversations.yml
|
386
swagger/swagger.json
Normal file
386
swagger/swagger.json
Normal file
|
@ -0,0 +1,386 @@
|
||||||
|
{
|
||||||
|
"swagger": 2.0,
|
||||||
|
"info": {
|
||||||
|
"description": "This is the api documentation for Chatwoot server.",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"title": "Chatwoot",
|
||||||
|
"termsOfService": "https://www.chatwoot.com/terms-of-service/",
|
||||||
|
"contact": {
|
||||||
|
"email": "support@chatwoot.com"
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"name": "MIT License",
|
||||||
|
"url": "https://opensource.org/licenses/MIT"
|
||||||
|
},
|
||||||
|
"host": "app.chatwoot.com",
|
||||||
|
"basePath": "/api/v1/"
|
||||||
|
},
|
||||||
|
"paths": {
|
||||||
|
"/contacts": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"Contact"
|
||||||
|
],
|
||||||
|
"description": "Listing all contacts with pagination",
|
||||||
|
"summary": "List contacts",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "query_hash",
|
||||||
|
"in": "query",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/contact_list"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"description": "Bad Request Error",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/bad_request_error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"post": {
|
||||||
|
"tags": [
|
||||||
|
"Contact"
|
||||||
|
],
|
||||||
|
"description": "Create a contact",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "data",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/contact_create"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/extended_contact"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"description": "Bad Request Error",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/bad_request_error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/contacts/{id}": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"Contact"
|
||||||
|
],
|
||||||
|
"summary": "Show Contact",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"type": "number",
|
||||||
|
"description": "ID of contact",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/extended_contact"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Contact not found"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"description": "Access denied"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"put": {
|
||||||
|
"tags": [
|
||||||
|
"Contact"
|
||||||
|
],
|
||||||
|
"summary": "Update Contact",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"type": "number",
|
||||||
|
"description": "ID of the contact",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "data",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/contact_update"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"204": {
|
||||||
|
"description": "Success",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/contact_base"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Contact not found"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"description": "Access denied"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/contacts/{id}/conversations": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"Contact"
|
||||||
|
],
|
||||||
|
"summary": "Conversations",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"type": "number",
|
||||||
|
"description": "ID of contact",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Success",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/contact_conversations"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Contact not found"
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"description": "Access denied"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"definitions": {
|
||||||
|
"bad_request_error": {
|
||||||
|
"title": "data",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/request_error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"request_error": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"field": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"message": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"code": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contact": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"email": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"phone_number": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"thumbnail": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"additional_attributes": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"conversation": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"display_id": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"messages": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"inbox_id": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"open",
|
||||||
|
"resolved"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"timestamp": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"user_last_seen_at": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"agent_last_seen_at": {
|
||||||
|
"type": "agent_last_seen_at"
|
||||||
|
},
|
||||||
|
"unread_count": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extended_contact": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/contact"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"availability_status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"online",
|
||||||
|
"offline"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"contact_base": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/contact"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"contact_list": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/contact"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contact_conversations": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/conversation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"meta": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"sender": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"thumbnail": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"channel": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"assignee": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contact_create": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"account_id": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"inbox_id": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contact_update": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"phone_number": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue