====== Описание взаимодействия через XHR ======
===== Выполнение запросов =====
- Запрос осуществляется может осуществляться как методом FormData //(Content-type: application/x-www-form-urlencoded)//, так и Payload //(Content-type: application/json)//
- URL для обработки запросов //**имя сайта**/?option=com_wmartalpha&task=api.**methodName**//
- Первоначальное получение токена выполняется методом [[xhr_api#init|api.init]]
- CSRF-токен должен передаваться клиентом в заголовке //csrf-token//, либо в параметре //csrfToken// тела запроса. [[xhr_api#Пример взаимодействия|Пример]]
- Ответ возвращается в формате JSON
=== Общие структурные элементы ===
|ok|Флаг успешности выполнения запроса|int|
|errors|Запись со списком ошибок запроса|[]|
{
ok: int,
errors: [
{
error: string,
type: string
},
...
],
...
}
=== Общие ошибки ===
|core|csrfError|CSRF токен не передан или передан неверный токен|
|core|tooManyRequests|Обнаружен флуд запросами. Данный ip адрес временно заблокирован. Поле //delay// указывает время, оставшееся до конца блокировки|
|core|forbidden|Данная операция запрещена для данного пользователя|
====== Инициализация =======
===== init =====
//имя сайта///?option=com_wmartalpha&task=api.**init**
Инициализация сессии, получение токена
=== Результат ===
|csrfToken|csrf токен|string|
====== Авторизация =======
===== login =====
//имя сайта///?option=com_wmartalpha&task=api.**login**
Авторизация пользователя
=== Запрос ===
|login|Логин(email или номер телефона в 11-значном формате)|string обязательный|
|password|Пароль|string обязательный|
|remember|Запомнить пользователя|bool|
=== Результат ===
|user|Основные данные пользователя|[[xhr_api#user|объект User]]|
=== Ошибки ===
|login|incorrect|Формат логина указан неверно|
|login|unregistred|Пользователь с таким логином не зарегистрирован|
|password|wrong|Указан неверный пароль|
===== loginOAuth =====
//имя сайта///?option=com_wmartalpha&task=api.**loginOAuth**
Регистрация/авторизация в сторонних сервисах по протоколу OAuth. Результат данного запроса должен собран и отправлен от имени пользователя.
=== Запрос ===
|service|Тип сервиса|Поддерживаемые типы: fb, google, vk, instagram, mailru, ok, vk,yandex|
|redirectUrl|url переадресации после авторизации|string|
=== Результат ===
|OAuthrequest|Объект, описывающий запрос|[[xhr_api#user|объект OAuthrequest]]|
=== Ошибки ===
|service|wrong|Сервис не существует или не подключен к системе|
===== logout =====
//имя сайта///?option=com_wmartalpha&task=api.**logout**
Завершение сессии пользователя
====== Регистрация ======
===== recover =====
//имя сайта///?option=com_wmartalpha&task=api.**recover**
Восстановление пароля пользователя. Перед процедурой регистрации необходимо запросить код подтверждения методом [[xhr_api#registerCheck|api.recoverCheck]]
=== Запрос ===
|login|Логин(email или номер телефона в 11-значном формате)|string обязательный|
|password|пароль|string обязательный|
|passwordConfirm|подтверждение пароля|string обязательный|
|code|код подтверждения из email или sms|string обязательный|
=== Результат ===
|user|Основные данные пользователя|[[xhr_api#user|объект User]]|
=== Ошибки ===
|login|incorrect|Логин указан неверно|
|login|unregistered|Данный логин не зарегистрирован|
|password|incorrect|Пароль указан некорректно|
|passwordConfirm|incorrect|Подтверждение пароля указано некорректно|
|passwordConfirm|unmatch|Пароли не совпадают|
|code|wrong|Некорректный код подтверждения|
|code|outdated|Код подтверждения устарел, необходимо перезапросить|
===== recoverCheck =====
//имя сайта///?option=com_wmartalpha&task=api.**recoverCheck**
Получение кода подтверждения для регистрации.
=== Запрос ===
|login|Логин(email или номер телефона в 11-значном формате)|string обязательный|
=== Результат ===
|delay|время, оставшееся до возможности запроса следующего кода подтверждения|float|
=== Ошибки ===
|login|incorrect|Логин указан неверно|
|login|unregistered|Данный логин не зарегистрирован|
|login|wait|Необходимо подождать, прежде чем запрашивать код подтверждения снова|
===== register =====
//имя сайта///?option=com_wmartalpha&task=api.**register**
Регистрация пользователя. Перед процедурой регистрации необходимо запросить код регистрации методом [[xhr_api#registerCheck|api.registerCheck]]
=== Запрос ===
|login|Логин(email или номер телефона в 11-значном формате)|string обязательный|
|password|пароль|string обязательный|
|passwordConfirm|подтверждение пароля|string обязательный|
|firstname|имя пользователя|string обязательный|
|lastname|фамилия пользователя|string обязательный|
|agree|согласие на обработку персональных данных|bool обязательный|
|code|код подтверждения из email или sms|string обязательный|
=== Результат ===
|user|Основные данные пользователя|[[xhr_api#user|объект User]]|
=== Ошибки ===
|login|incorrect|Логин указан неверно|
|login|registered|Данный логин уже зарегистрирован|
|agree|incorrect|Необходимо подтвердить обработку персональных данных|
|password|incorrect|Пароль указан некорректно|
|passwordConfirm|incorrect|Подтверждение пароля указано некорректно|
|passwordConfirm|unmatch|Пароли не совпадают|
|firstname|incorrect|Имя указано некорректно|
|lastname|incorrect|Фамилия указана некорректно|
|code|wrong|Некорректный код подтверждения|
|code|outdated|Код подтверждения устарел, необходимо перезапросить|
===== registerCheck =====
//имя сайта///?option=com_wmartalpha&task=api.**registerCheck**
Получение кода подтверждения для регистрации.
=== Запрос ===
|login|Логин(email или номер телефона в 11-значном формате)|string обязательный|
=== Результат ===
|delay|время, оставшееся до возможности запроса следующего кода подтверждения|float|
=== Ошибки ===
|login|incorrect|Логин указан неверно|
|login|registered|Данный логин уже зарегистрирован|
|login|wait|Необходимо подождать, прежде чем запрашивать код подтверждения снова|
====== Управление аккаунтом =======
===== passwordChange =====
//имя сайта///?option=com_wmartalpha&task=api.**passwordChange**
Изменение пароля пользователя
=== Запрос ===
|password|старый пароль|string|
|passwordNew|новый пароль|string|
|passwordNewConfirm|подтверждение пароля|string|
=== Ошибки ===
|password|wrong|Указан неверный пароль|
|passwordNew|incorrect|Пароль указан некорректно|
|passwordNewConfirm|incorrect|Подтверждение пароля указано некорректно|
|passwordNewConfirm|unmatch|Пароли не совпадают|
|lastname|incorrect|Фамилия указана некорректно|
|code|wrong|Некорректный код подтверждения|
|code|outdated|Код подтверждения устарел, необходимо перезапросить|
===== profileChange =====
//имя сайта///?option=com_wmartalpha&task=api.**profileChange**
Регистрация пользователя.
=== Запрос ===
|firstname|имя пользователя|string|
|lastname|фамилия пользователя|string|
|sex|пол, 1 - мужской, 2 - женский|int|
|subjects|тематика|[string,string, ...]|
|description|Описание|?string|
|orgINN|ИНН организации|?string|
|country|Страна|?string|
|region|Регион|?string|
|locality|Населенный пункт|?string|
=== Ошибки ===
|firstname|incorrect|Имя указано некорректно|
|lastname|incorrect|Фамилия указана некорректно|
|sex|incorrect|Пол указан некорректно|
|subjects|incorrect|Тематика указана некорректно|
|description|incorrect|Описание указано некорректно|
|orgINN|incorrect|ИНН организации указан некорректно|
|country|incorrect|Страна указана некорректно|
|region|incorrect|Регион указан некорректно|
|locality|incorrect|Населенный пункт указан некорректно|
=== Результат ===
|user|Основные данные пользователя|[[xhr_api#user|объект User]]|
====== Системные функции ======
===== reference =====
//имя сайта///?option=com_wmartalpha&task=api.**reference**
Получить значения из справочника
=== Запрос ===
|reference|Алиас справочника (доступны: subjects,country,region,locality)|string|
|parentId|id родительского значения из связанного справочника (например: отношение населенных пунктов к региону)|?int|
|start|Отступ выбираемых элементов|?int|
|limit|Количество выбираемых элементов|?int|
|search|Строка для поиска|?string|
=== Результат ===
|values|Массив элементов справочника|[{id:int,value:string},{id:int,value:string}, ...]|
|values.id|id элемента|int|
|values.value|значение элемента|string|
=== Ошибки ===
|reference|incorrect|Справочник не существует|
====== Пользователи ======
===== usersFilter =====
//имя сайта///?option=com_wmartalpha&task=api.**usersFilter**
Получить свойства и значения для фильтрации
=== Запрос ===
|filterQuery|Запрос свойств|Массив объектов [[xhr_api#filterQuery|filterQuery]]|
|?listQuery|Запрос элементов|объект [[xhr_api#listQuery|listQuery]]|
=== Результат ===
|props|Cвойствa и значения|Массив объектов [[xhr_api#props|props]]|
=== Ошибки ===
|property|incorrect|Свойство не существует|
===== userinfo =====
//имя сайта///?option=com_wmartalpha&task=api.**userinfo**
Получение информации о пользователе. Если id не указан, возвращается информация о текущем пользователе
=== Запрос ===
|?id|id пользователя|int|
=== Результат ===
|user|Основные данные пользователя|[[xhr_api#user|объект User]]|
=== Ошибки ===
|user|incorrect|Пользователь не существует|
===== usersList =====
//имя сайта///?option=com_wmartalpha&task=api.**usersList**
Получить свойства и значения для фильтрации
=== Запрос ===
|listQuery|Запрос элементов|объект [[xhr_api#listQuery|listQuery]]|
=== Результат ===
|users|Выбранные пользователи|Массив объектов [[xhr_api#user]]|
=== Ошибки ===
|property|incorrect|Свойство не существует|
====== Описание объектов ======
===== OAuthRequest =====
Объект, описывающий OAuth запрос
|url|url запроса|string|
|method|Метод|string|
|params|Передаваемые переменные|{}|
{
url: string,
method: string,
params: {
param1: value1,
param2: value2,
...
}
}
===== props =====
Запрос свойств
|id|id свойства|int|
|title|Имя свойства|string|
|alias|Алиас свойства|string|
|?count|Количество элементов с данным свойством|int|
|?values|Массив значений свойства|[]|
|values.id|id значения свойства|string|
|values.alias|alias значения свойства|string|
|values.value|Массив значений свойства|string|
|values.?count|Количество элементов с данным значением свойства|int|
{
id: int,
title: string,
alias: string,
?values: [
{
id: int,
value: string,
alias: string,
?count: int,
},
...
]
}
===== filterQuery =====
Запрос свойств. Планируется, что структура объекта будет общая для всех фильтрующихся элементов.
Для свойства необходимо указать id либо алиас.
|?id|id свойства|int|
|?alias|Алиас свойства|string|
|?count|Подсчет количества элементов по свойству|bool|
|?format|формат значений. Доступно: list. Если не указан - значения свойства не возвращаются |string|
{
?id: int,
?alias: string,
?count: bool,
?format: string,
}
===== listQuery =====
Запрос выборки по элементам. Для свойства необходимо указать id или алиас.
|?props|Массив выбранных свойств|string|
|props ?id|id свойства|string|
|props ?alias|Алиас свойства|string|
|props ?min|min значение для свойств типа число и дата|float/datetime|
|props ?max|max значение для свойств типа число и дата|float/datetime|
|props ?valueId|массив id значений|[]|
|props ?valueAlias|массив алиасов значений|[]|
|props ?search|Строка для поиска по свойству|string|
|?search|Строка для поиска по основным свойствам|string|
|?start|Отступ выбираемых элементов|bool|
|?limit|Количество выбираемых элементов|bool|
|?sort|Порядок сортировки|string|
|?direction|Направление сортировки asc или desc|string|
{
?props: {
{
?id: int,
?alias: string,
?min: float/datetime,
?max: float/datetime,
?search: string,
?valueId: [int, ...],
?valueAlias: [string, ...],
},
...
}
?search: string,
?limit: int,
?start: int,
?sort: string,
?direction: string,
}
===== user =====
Информация о пользователе
|id|id пользователя|int|
|registered|пользователь зарегистрирован|bool|
|login|Проритетный логин|string|
|firstname|Имя|string|
|lastname|Фамилия|string|
|fullname|Полное имя|string|
|sex|Пол (1-мужской, 2 - женский)|int|
|description|Описание|string|
|subjects|Массив объектов свойства-справочника Тематика|[{referenceId: int,value: string}, ...]|
|orgINN|ИНН организации|string|
|orgTitle|Название организации|string|
|country|Объект свойства-справочника страна|{referenceId: int,value: string}|
|region|Объект свойства-справочника регион|{referenceId: int,value: string}|
|locality|Объект свойства-справочника населенный пункт|{referenceId: int,value: string}|
|loginData|Массив данных авторизации пользователя|[]|
|loginData.type|тип логина|string|
|loginData.login|Массив данных авторизации пользователя|string|
{
id: int,
registered: bool,
?login: string,
?firstname: string,
?lastname: string,
?fullname: string,
?sex: int,
?description: string,
?subjects: [
{
referenceId: int,
value: string
},
...
],
?orgINN: string,
?orgTitle: string,
?country: {
referenceId: int,
value: string
},
?region: {
referenceId: int,
value: string
},
?locality: {
referenceId: int,
value: string
},
loginData: [
{
type: string,
login: string
},
...
],
}
====== Пример взаимодействия ======
function cookieGet(name) {
var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
};
function cookieSet(name, value, options) {
options = options || {};
var expires = options.expires;
if (!options.path)
options.path = '/';
if (typeof expires == "number" && expires) {
var d = new Date();
d.setTime(d.getTime() + expires * 1000);
expires = options.expires = d;
}
if (expires && expires.toUTCString) {
options.expires = expires.toUTCString();
}
value = encodeURIComponent(value);
var updatedCookie = name + "=" + value;
for (var propName in options) {
updatedCookie += "; " + propName;
var propValue = options[propName];
if (propValue !== true) {
updatedCookie += "=" + propValue;
}
}
document.cookie = updatedCookie;
return true;
}
function request(method,data,func){
data = JSON.stringify(data); //for Payload
let csrfToken=cookieGet('csrfToken');
let xhr = new XMLHttpRequest();
xhr.open('POST', 'https://fetch.melissa.team/?task=api.'+method);
xhr.setRequestHeader('csrf-token', csrfToken);
//xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //for FormData
xhr.setRequestHeader('Content-type', 'application/json;charset=UTF-8'); //for Payload
xhr.responseType = 'json';
xhr.withCredentials = true;
xhr.onload = function() {
if (xhr.status != 200) {
console.error('connection error');
} else {
if(xhr.response.errors){
if(xhr.response.errors.core==='tooManyRequests'){
console.error('flood detect. wait ' + xhr.response.data.delay);
return false;
}
if(xhr.response.errors.core==='csrfError'){
console.error('wrong csrf token');
return false;
}
}
if(typeof(func)==='function'){
func(xhr.response);
}
if(xhr.response.csrfToken){
cookieSet('csrf_token', xhr.response.csrfToken);
}
}
};
xhr.send(data);
}
//Инициализация
request('init');
//Авторизация
request('login',{login:'a1@lct.su', password:'12345'},data=>{ console.log(data) });
//Получение информации о текущем пользователе
request('userinfo','',data=>{ console.log(data) });