====== Air Lay API v2 ======
==== Navigation ====
* [[en:first|Main page]]
* [[en:api|AirLay API]]
* [[en:api:air-lay|API Air Lay]]
----
**Структура запроса**
/**
* api/v2/{controller}/{action}?{parameter1=value¶meter1=value&...}
* Где
* controller - контролер в котором производится действие,
* action - действие контроллера,
* parameter1, parameter2 ... - параметры запроса,
* value1, value2 ... - значение параметров
*/
/**
* GET
* Вход пользователя через name и password
* @return JWT
*/
/user/auth
/**
*GET
* Регистрация пользователя необходимые параметры
* string name
* string password
* string email в формате example@mail ~
*/
/user/registration
/**
* GET
* Action for get menu
* @return object free trees and private trees
*/
/user/getmenu
/**
* POST
* Action for create tree. You can see JSON object descriptions below for more details.
* @name string Name tree
* @return object tree mongoDB object
*/
/node/createtree
/**
* GET
* Get layer objects by parameters.
* @id layer id
* Coordinates
* @lat1
* @lat2
* @lon1
* @lon1
* @return object tree mongoDB object
*/
/api/v2/node/getObjs
/**
* POST
* Action get layer objects info
* @collections json
* {"collections" : [
* {
* "name" : "layersId",
* "layers" : [objectId, objectId, ...]
* },
* ...
* ]}
* @return json
*/
/api/v2/node/getObjsInfo
/**
* Action for create Node(layerEntity/dir). You can see JSON object descriptions below for more details.
* @name string Node name
* @type string type of the node. Values : layerEntity/dir
* @treeId ObjectId the id of the tree in which the node is inserted
* @parentId ObjectId parent of the node
* @order order in the parent's childs. default -1
* @return array ['node'=> nodeInfo]
*/
/api/v2/node/createNode
/**
* Action for upload objects.
* @layerId object Layer Id
* @_FILES['json'] file with the geojson feature collection
* @return string 200 Ok
*/
/api/v2/uploadLayer
/**
* Action for download layer objects.
* @layerId objectId Layer Id
* @format string file format json/kml/dxf
* @filename string file name
* @return 200 Ok json/kml/dxf file
*/
/api/v2/node/downloadLayer
/**
* Action for changing node name.
* @treeId string ObjectId
* @nodeId string ObjectId
* @name string node name
* @return string 200 Ok
*/
/api/v2/node/updateNodeName
/**
* Action for changing node parent or order.
* @treeId string ObjectId
* @nodeId string ObjectId
* @newParentId string ObjectId
* @order string order number of node in new parent
* @return string 200 Ok
*/
/api/v2/node/moveNode
/**
* Action for removing node.
* @treeId object Layer Id
* @nodeId object Layer Id
* @return string 200 Ok
*/
/api/v2/node/removeNode
/**
* Search tree by name
* @name string tree name
* @return 200 Ok json tree
*/
/api/v2/node/searchTreeByName
/**
* Get srtm
* @lat
* @lon
*/
/api/v2/user/srtm
/**
* Action ensure layer db index.
* @layerId
* @indexName
*/
/api/v2/node/ensureLayerIndex
/**
* Action delete layer db index.
* @layerId
* @indexName
*/
/api/v2/node/deleteIndex
/**
* GET
* @id layer id
* @return josn layer option
*/
/api/v2/node/getLayerOptions
/**
* POST
* @id layer id
* @options json options
* @return 200 Ok
*/
/api/v2/node/updateLayerOptions
/**
* POST
* Action for group creation
* @name group name
* @return json group
*/
/api/v2/group/create
/**
* POST
* Action update group name
* @id ObjectId group id
* @name string new group name
* @return 200 Ok
*/
/api/v2/group/updateName
/**
* Action adds a tree to the group.
* @treeId ObjectId tree which to add
* @groupId ObjectId group where to add
* @return string 200 Ok
*/
/api/v2/group/addTree
/**
* Action remove tree from group.
* @treeId ObjectId tree which to remove
* @groupId ObjectId group where to remove
* @return string 200 Ok
*/
/api/v2/group/removeTree
/**
* Action return user groups.
* @return string 200 Ok
*/
/api/v2/group/get
/**
* Action for adding user to group.
* @userId string ObjectId.
* @groupId string ObjectId.
* @return string 200 Ok
*/
/api/v2/group/addUser
/**
* Action set user/tree permissions for group
* @id string ObjectId
* @groupId string ObjectId
* @permissions string group_mask
* @entityName string 'trees'/'users'
* @return string 200 Ok
*/
/api/v2/group/setPermissions
/**
* Action for deleting user from group.
* @userId string ObjectId.
* @groupId string ObjectId.
* @return string 200 Ok
*/
/api/v2/group/deleteUser
/**
* POST
* Action remove group
* @id group id
* @return 200 OK
*/
/api/v2/group/remove
/**
* POST
* Action for product creation.
* @title string group name **necessarily**
* @type string **necessarily**
* @treetIds/@file json array ObjectId of entities which is trees or file with product in zip format **necessarily**
* @groupId if owner of the group
* @description string product description
* @shortDescription string product short description
* @access int interaction_mask
* @icon string base64 icon
* @cost int product cost, default 0, not used at the moment.
* @translation string json product translations, example {"ru":{"title":"Заголовок", "description": "описание на русском", ...}, "en":{...}}
* @return string 200 Ok
*/
/api/v2/purchase/createProduct
/**
* GET
* Action for get product information.
* @productId string ObjectId of entity which is product
* @return string 200 product information
*/
/api/v2/purchase/getProduct
/**
* GET
* Action return all available product, excluding users products.
* Filters:
* @access int interaction_mask, /in development
* @type string (tree/map), /in development
* @point json {"lon":86.696379, "lat":54.153597} /in development
* @return string 200 products
*/
/api/v2/purchase/getProducts
/**
* GET
* Action for purchase product
* @productId string ObjectId of entity which is product
* @return string 200 OK
*/
/api/v2/purchase/purchaseProduct
/**
* POST
* Action for product update.
* @productId string ObjectId of entity which is product **necessarily**
* @title string product name
* @treeIds json array ObjectId trees
* @file file in zip format
* @description string product description
* @shortDescription string product short description
* @access int interaction_mask
* @icon string base64 icon
* @cost map string - double.
* @translation string json product translations, example {"ru":{"title":"Заголовок", "description": "описание на русском", ...}, "en":{...}}
* @return string 200 Ok
*/
/api/v2/purchase/updateProduct
/**
* GET
* Action for product remove from user or from bd if user is owner.
* @productId string ObjectId of entity which is product
* @return string 200 Ok
*/
/api/v2/purchase/removeProduct
/**
* GET
* Action for product get version.
* @productId string ObjectId of entity which is product
* @return string 200 product version
*/
/api/v2/purchase/getProductVersion
/**
* Action for get user products
* return string 200 user products
*/
/api/v2/purchase/getUserProducts
/**
* GET
* @text string feedback text
* @productId ObjectId product id
* @return string 200 Ok
*/
public function postFeedbackAction()
/**
* GET
* @productId ObjectId product id
* @return array 200 product feedback
*/
public function getProductFeedbackAction()
/**
* GET
* Action for get product file
* @productId ObjectId product id
* @return product file
*/
public function getProductFileAction()
/**
* Action set sidebar text pattern.
* @layerId string ObjectId
* @pattern string sidebar text pattern
* @return string 200 Ok
*/
/api/v2/node/setSideBar
/**
* Action get sidebar text pattern.
* @layerId string ObjectId
* @return string 200 Ok
*/
/api/v2/user/getSideBar
/**
* Action find user by name.
* @name string userName regexp.
* if name =='' return all users, else search by regexp
* @return string 200 [userId,name]
*/
/api/v2/user/findUsersByNames
/**
* Action find tree by name.
* @name string treeName regexp.
* @return string 200 [treeId,name]
*/
/api/v2/node/searchTreeByName
/**
* POST
* Action create layers object
* @layerId ObjectId layers id
* @treeId ObjectId tree Id
* @geometry string geo json geometry
* @properties string json properties
* @return 200 new objectId
*/
/api/v2/node/createObject
/**
* POST
* Action update layers object
* @objectId ObjectId layer object id
* @layerId ObjectId layer id
* @treeId ObjectId tree Id
* @objectId ObjectId layer object id
* @geometry geojson geometry
* @properties json properties
* @return 200 Ok
*/
/api/v2/node/updateObject
/**
* POST
* Action remove layers object
* @treeId ObjectId tree id
* @layerId ObjectId layer id
* @objectId ObjectId layer object id
* @return 200 Ok
*/
/api/v2/node/removeObject
/**
* POST
* Action change the layer for a layer object
* @layerId objectId layers id
* @newLayerId objectId new layers id
* @treeId ObjectId tree id
* @objectId ObjectId layer object id
* @return 200 Ok
*/
/api/v2/node/changeLayerObject
/**
* Action activate users devices.
* @request string *
* @providerId string *
* @receipt string for iOs devices.
* @web int if from webbrowser
* @os string devices OS
* @purchaseId string purchaseToken or pincode
* @return 200 Ok
*/
/api/v2/purchase/activate
/**
* POST
* Action confirm paid products
* @productId objectId product id
* @purchaseName string purchases name
* @return 200 Ok
*/
/api/v2/purchase/productPayConfirm
/**
* GET
* Action get unconfirmed paid products
* @return 200 Ok json
*/
/api/v2/purchase/getUnconfirmedPaidProduct
/**
* GET
* Action get help objects
* @return 200 Ok json help objects
*/
/api/v2/help/get
/**
* POST
* Action add help object
* @help json help object
* @file file help media file
* @return 200 Ok
*/
/api/v2/help/add
/**
* POST
* Action update the help object
* @helpObjectId objectId help object id
* @help json help object
* @file file help media file
* @return 200 Ok
*/
/api/v2/help/update
/**
* POST
* Action remove help object
* @helpObjectId objectId help object id
* @return 200 Ok
*/
/api/v2/help/remove
/**
* Rebuild user menu
*/
/api/v2/user/rebuildUserMenu
/**
* Upload track
* @file gpx format
*/
/api/v2/node/uploadTrack
/**
* GET
* Get user search
*/
/api/v2/user/getUserSearch
/**
* GET
* Get user search
*/
/api/v2/user/getUserSearch
/**
* GET
* Action get url
* @url string needed url
* @return 200 string url
*/
/api/v2/url/get
/**
* Action get tracker
* @token QR token or auth token
* @id tracker id
* @return 200 array trackers
*/
/api/v2/tracker/get
/**
* Action create tracker
* @tracker raw json data
* @return 200 json tracker object
*/
/api/v2/tracker/create
/**
* Action update tracker
* @tracker raw json data(id necessary)
* @return 200 OK
*/
/api/v2/tracker/update
/**
* Action delete tracker
* @id tracker id
* @return 200 OK
*/
/api/v2/tracker/delete
/**
* POST
* Action connect device to tracker
* @token auth device token
* @trackerId tracker id
* @return 200 array trackers
*/
/api/v2/tracker/connect
/**
* POST
* Action send data to tracker module
* @token JWT auth device token
* @type string type object (location/object)
* @body json object
* @schemeId scheme id(if type object)
* @return 200 array trackers
*/
/api/v2/tracker/send
/**
* POST
* Action get temp QR token
* @trackerId/@layerId ObjectId tracker id/layer id
* @return 200 Ok token
*/
/api/v2/QR/get
/**
* POST
* Action get token for access to tracker module
* @token temp QR token or auth token
* @deviceId device id
* @trackerId tracker module id for auth token
* @return 200 Ok or errors array
*/
/api/v2/QR/auth
/**
* POST
* Action get token with layer id
* @layerId objectId layers id
* @return 200 string JWT
*/
api/v2/node/getSubscriptionToken
/**
* POST
* Action create scheme
* Raw json data
* @return 200 Ok json scheme object
*/
api/v2/scheme/create
/**
* GET
* Action get scheme by id
* @id ObjectId scheme id
* @layerId ObjectId layer id(tracker id)
* @type string scheme type (Verification, Collector, Tracker, Command)
* @return 200 Ok json scheme object
*/
api/v2/scheme/get
/**
* POST
* Action update scheme
* Raw json data (necessarily "_id")
* @return 200 Ok
*/
api/v2/scheme/update
/**
* POST
* Action delete scheme by id
* @id scheme id
* @return 200 Ok
*/
api/v2/scheme/delete
/**
* POST
* Action verification object
* @schemeId ObjectId scheme id
* @objectId ObjectId object id
* @return 200 Ok or errors array
* Error codes:
* 1: Fields not found
* 2: Empty value
* 3: Invalid type. Value must be string/int/bool
* 4: Invalid value, must be one of the list [...]
*/
api/v2/scheme/verification
/**
* GET
* Get upload logs
* @layerId ObjectId layer id
* @return 200 OK log urls
*/
/api/v2/user/getUploadLogs
/**
* GET
* Action for get user organization.
* @return string json object organization
*/
/api/v2/organization/get
/**
* POST
* Action for update organization info.
* @name new organization name
* @return 200 OK
*/
/api/v2/organization/update
/**
* GET
* Action for get portal.
* @return 200 json object all connection portals
*/
/api/v2/portal/get
/**
* POST
* Action for create portal.
* @name string portal name
* @settings json portal settings
* @productId array portal products
* @open string 'true'/'false'
* @private string 'true'/'false'
* @groups array portal groups
* @helps array portal helps
* @return object tree mongoDB object
*/
/api/v2/portal/create
/**
* POST
* Action for delete portal.
* @id string portal id, if id is empty remove all portals
* @return 200 OK
*/
/api/v2/portal/remove
/**
* POST
* Action for delete all organization portals. And create default portal.
* @return 200 OK
*/
/api/v2/portal/removeAll
/**
* POST
* Action for update portal.
* @id portal id
* @name string portal name
* @settings array portal settings
* @productId array portal products
* @open string 'true'/'false' or int 1/0
* @private string 'true'/'false' or int 1/0
* @groups array portal groups
* @helps array portal helps
* @return object tree mongoDB object
*/
/api/v2/portal/update
**Tree**
{
_id: ObjectID;
"properties": {
"type": "tree",
"name": string,
"ownerId": ObjectID,
"shared": "free"/"private",
},
"children": []/null;
}
**Directory**
{
_id: ObjectID;
"properties": {
"type": "dir";
"name": string;
},
"children": []/null;
}
**Layer**
{
"properties": {
"type": "layer",
"api": string,
"alias": ObjectID
},
"children": []/null
}
**Layer Entity**
{
_id: ObjectID;
"properties": {
"type": "layerEntity",
"name": string,
"index": [],
"api": string/null
},
"children": []/null,
"options": [standartLayerOptions]
}
**Map**
{
_id: ObjectID;
properties: {
type: "map";
typeMap: "osm"/"2gis"/"mapbox"/"yandex"/"google",
name: string;
url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
urlCache: "http://cache.mrgis02.mrsks.local/osm/{z}/{x}/{y}.png",
options: {
maxZoom: 18
},
checked: 1,
cache: 0,
}
}
**overlayLayer**
{
"properties": {
"type": "overlayLayer",
"name": "Зоны с особыми условиями использования территории",
"url": "//pkk5.rosreestr.ru/arcgis/rest/services/Cadastre/ZONES/MapServer/export?",
"options": {
"format": "image/png",
"transparent": "true",
"tileSize": 256,
"zIndex": 100,
"shiftX": 0,
"shiftY": 0,
"maxZoom": 18
},
"checked": false
}
}
**Tokens**
Response header
// Access open
Authorization: 0;
// Expired token
Authorization: 1;
// Access denied
Authorization: 2;
// Some error
Authorization: 3;
// Refresh Token
refresh_token : some_token;
// Access Token
access_token : some_token;
**Users**
{
_id: ObjectID,
name: string,
email: string,
password: bcrypt,
time: time,
groups: [
groupId(ObjectID),
groupId(ObjectID)
],
products: [
productId(ObjectID),
productId(ObjectID)
]
}
**Interaction mask (interaction_mask)**
// 0 uses for invisible groups or products. Users can get access from owner invite only.
0 - invite
// Users can sent invite to owner groups or products.
1 - private
// Users can join to group without limitations.
2 - public
// Users can buy product.
3 - buy
// Users can get product, if they have premium account.
4 - premium
**Mask of access for groups (group_mask)**
// Mask of access to group/product. Can take 3 values 1 - read, 2 - write, 4- access.
// For groups
Read allows to see group members, write allows to add group members, access allows do delete and configure group.
// For example
// User doesn't have access to group/product.
0
//user has access to group/product.
4
**Groups**
{
_id: ObjectID,
name: string
access: interaction_mask,
users: [
{
userId: ObjectID,
mask: group_mask
}
],
tree: [
{
treeId: ObjectID,
mask: group_mask
}
],
}
**Products**
{
_id: ObjectID,
owner: {
userId/groupId : ObjectID
},
treeIds[]/file: ObjectID/filepath,
type: string(tree/map),
access: interaction_mask,
title: string,
description: text,
shortDescription: text,
shortDescription: text,
icon: icon,
cost: [
string(ISO 3166-1 alpha-3) : double,
...
],
users: [
ObjectID
],
purchaseId : string
}
**Translations**
{
"_id" : ObjectId,
"language" : string,
"code" : string,
"phrases" : {
"phrases" : "phrases translate",
...
}
}
**Orders**
{
"_id" : ObjectId,
"userId" : ObjectId,
"providerId" : ObjectId,
"productId" : ObjectId/string,
"softExpire" : int,
"hardExpire" : int,
"cost" : float,
"date" : Date,
"activation" : {
"token" : string,
"activated" : boolean,
"activatedDate" : Date,
"deviceId" : string,
"serialNumber" : stirng,
"expired" : boolean
}
}
**Helps**
{
title : string,
order : int,
text: string,
url: string,
type: string("Video"/"Image")
}
**Device**
{
"_id" : ObjectId,
"properties" : {
"deviceId" : string,
"trackers" : [
{
"trackerId" : ObjectId,
"status" : 0/1
}
]
},
"geometry" : {
"type" : "Point",
"coordinates" : [
double,
double
]
}
}
**Scheme**
{
"_id" : ObjectId,
"type" : string Tracker/Verification/Collector/Command,
"import" : ObjectId,
"export" : ObjectId,
"name" : string,
"owner" : ObjectId,
"icon": string base64 svg\png,
"geometryType": string Point/Line/Polygon,
"api": string(API, для приложения, на него идёт отправка данных),
/* Не обязательное поле fields */
"fields": array
[
0: {
"name": string,
"placeholder": string,
"type": string(string, int, bool, list, check box, media)
/* Для типов list, check box обязательное поле list */
"list" : array[ String...]
}
}
**Trackers**
{
"_id" : ObjectId,
"owner" : ObjectId,
"name" : string,
"OpenAPI" : bool,
"QR" : bool,
"Auth" : array[
ObjectId,
...
]
}
**Tracks**
{
"_id" : ObjectId,
"deviceId" : string,
"lon" : double,
"lat" : double,
"time" : ISODate
}
**Tracks body /api/v2/tracker/send**
{
"deviceId" : string,
"lon" : double,
"lat" : double
}
**Upload file log**
{
"_id" : ObjectId,
"time" : ISODate,
"userId" : ObjectId,
"logFile" : string,
"status" : string upload/progress/success/error,
"layerId" : ObjectId
}
**Organization**
{
_id: ObjectId,
name: string organization name
ownerId: Objectid user id,
portals: [] ObjectId portals
}
**Portal**
{
_id: ObjectId,
name: string portal name,
url: string portal url,
setting: {},
organizationId: ObjectId organization id
productId: [],
searchId: [],
open: bool,
private: bool,
groups: [],
helps: []
}
**PortalConnection **
{
userId: ObjectId,
portalId: ObjectId,
access: bool
}