Last active
December 29, 2015 09:09
-
-
Save wmakeev/7648117 to your computer and use it in GitHub Desktop.
Moysklad Client interface
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import moysklad from 'moysklad' | |
import csp from 'js-csp' | |
import { take } from 'js-csp-async' | |
let client = moysklad.createCspClient() | |
let { customerOrder, CustomerOrder } = client | |
async function orders () { | |
let order, orders, orderPositions | |
// ЗАГРУЗКА ОДНОГО ОБЪЕКТА | |
// | |
// promiseChan загрузка заказа | |
let orderCh = client.load('CustomerOrder', id) | |
let order1 = await take(orderCh) | |
// orderCh всегда возвращает полученный заказ | |
let order2 = await take(orderCh) | |
assert(order1 === order2) | |
// ЗАГРУЗКА СПИСКА ОБЪЕКТОВ | |
// | |
let ordersCh = client.load('customerOrder', query) | |
while ((order = await take(ordersCh)) !== csp.CLOSED) { | |
console.log(order.name) | |
} | |
// СОХРАНЕНИЕ | |
// Объект | |
order = await take(client.save('customerOrder', { name: '10001' })) | |
order = await take(client.save(order)) | |
// Список объектов | |
let ids = await take(client.save(orders)) | |
// Канал объектов | |
let saveCh = chan(1, map(order => order.stateUuid = 'new-uuid')) | |
let query = client.from.customerOrder.filter('state.name', 'Новый') | |
// .pipe | |
saveCh = query.pipe(saveCh) | |
// или .transduce | |
saveCh = query.transduce(map(order => order.stateUuid = 'new-uuid')) | |
// сохраняем в потоке | |
client.save(saveCh, { maxPayloadLength: 5000, timeout: 5000 }) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import moysklad from 'moysklad' | |
let client = moysklad.createAsyncClient() | |
let { customerOrder, CustomerOrder } = client | |
async function orders () { | |
let order, orders, orderPositions | |
// Загрузка по id | |
order = await client.load('CustomerOrder', id) | |
order = await client.load(CustomerOrder, id) | |
// Загрузка по id через коллекцию | |
order = await customerOrder.id(id).load() | |
// Загрузка коллекции | |
orders = await client.load('customerOrder', query) | |
orders = await client.load(customerOrder.select(query)) | |
// Загрузка вложенных объектов/коллекций | |
order = await client.load(CustomerOrder, id, { expand: 'positions' }) | |
order = await customerOrder.expand('positions').first() | |
// Несклько expand .. | |
order = await customerOrder.expand('positions').expand('attributes').first() | |
// .. или массив | |
order = await customerOrder.expand(['positions', 'attributes']).first() | |
// Вложенные expand | |
order = await customerOrder.expand('positions.product').first() | |
// Загрузка связанных коллекций с пейджингом | |
orderPositions = await client.fromRef('customerOrder', id, 'positions') | |
.skip(5).take(10).load() | |
// Загрузка связанных коллекций | |
orderPositions = await client.loadRef('customerOrder', id, 'positions') | |
// Ленивая загрузка | |
client.createLazyLoader().attach(order) | |
let agent = client.customerOrder.id(id).lazy().first() | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Получение всех записей коллекции ввиде массива | |
let demands = await client.demands.toArray() | |
// Получение курсора для перебора записей | |
// по примеру http://docs.mongodb.org/manual/reference/method/js-cursor/ | |
let cursor = await client.demands.toCursor() | |
// Использование курсора | |
if (cursor.hasNext()) { | |
let demand = await cursor.next() | |
} | |
// Observable | |
let stream$ = client.demands.toObservable() | |
stream$ | |
.filter(demand => demand.sum.sum > 10000) | |
// получение данных после вызова onValue | |
.onValue(demand => console.log(demand.name)) | |
// Channel | |
import { CLOSED } from 'moysklad-client' | |
import take from 'await-js-csp' | |
let chan = await client.demands.toChannel() | |
let demand | |
while ((demand = await take(chan) !== CLOSED) { | |
console.log(demand.name) | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Пример использования библиотеки moysklad-client | |
* Описан вариант для синхронного режима (для Node.js вызовы блокирующих методов будут выглядеть иначе) | |
*/ | |
function moysklad_client_vision() { | |
var moysklad = require('moysklad'), | |
log = require('my-logger'); | |
// СОЗДАНИЕ ТОЧКИ ДОСТУПА | |
var client = moysklad.ceateClient({ | |
auth: { | |
login: 'user@company', | |
password: 'password' | |
}, | |
async: false // загружать данные в синхронном режиме (опция для Node.js) | |
}); | |
// ПОЛУЧЕНИЕ ОБЪЕКТА ИЛИ СПИСКА ОБЪЕКТОВ ПО ИДЕНТИФИКАТОРУ | |
// Запрос типа GET/{id} | |
// Параметры load(): | |
// {string} type Тип сущности, {string|Array} id Идентификатор(ы), {Object} [settings] Объект с настройками | |
var good = client.load('good', '42e5e49a-c177-11e2-0002-001b21d91495', { | |
fileContent: true | |
}); | |
log.info(good.productCode); // -> '71326 apricot #4486' | |
// ФОРМИРОВАНИЕ ЗАПРОСА | |
// | |
var query01, query02, query03, query04; | |
// Вариант 1: Определение запроса через конструктор | |
query01 = client.createQuery({ | |
applicable: true, | |
updated: client.greaterThen('2013-05-01 00:00:00') | |
}); | |
// Вариант 2: Определение запроса методом select | |
query02 = client.createQuery(); | |
query02.select({ | |
moment: client.lessThen('2013-11-20 00:00:00'), | |
sum: { | |
// сумма в валюте документа между 1000 и 2500 | |
sumInCurrency: client.between(1000, 2500) | |
} | |
}); | |
// Объединение запросов | |
// Как в конструктор, так и select можно передать массив объектов или других запросов | |
// | |
// Ниже все три варианта аналогичны | |
query03 = client.createQuery(query01).select(query02); | |
query03 = client.createQuery([query01, query02]); | |
query03 = client.createQuery().select([query01, query02]); | |
// Создание запроса с указанием дополнительных параметров (сотрировка, пейджинг) | |
query04 = client | |
.select(query03) // берем за основу существующий запрос | |
.select({ | |
// добавляем фильтры по пользовательским свойствам | |
'Экспедитор': '11e3d190-156d-11e3-1c9e-7054d21a8d1e', | |
'Номер машины': client.anyOf([ 'Ф589СР', 'M245РО' ]) | |
}) | |
.sort('moment').sortMode('dsc') // или .sortDsc('moment') | |
.start(10).count(100) | |
.fileContent(true); | |
// ПОЛУЧЕНИЕ СПИСКА ОБЪЕКТОВ | |
// | |
var entities; | |
// Получение указанного типа объектов, выбирая по готовому запросу | |
entities = client.load('сustomerOrder', query04); | |
// Привязка типа объкта и метода загрузки к запросу для более лаконичной записи | |
goods = client | |
.from('good') // метод from создает пустрой запрос и добавляет методы исполнения запроса, напр. load() и пр. | |
.select(query01) // формирование запроса как обычно, используя все методы Query | |
.load(); // завершаем методом загрузки (напр. load) без указания типа в параметре, т.к. тип указан в звене from() | |
// ДРУГИЕ МЕТОДЫ ПОЛУЧЕНИЯ ДАННЫХ С СЕРВИСА | |
// | |
// Получение первого объекта из списка по указанному запросу | |
var firstEntity = client.from('good').select({ uuid: '42e5e49a-c177-11e2-0002-001b21d91495' }).first(); | |
log.info(firstEntity.productCode); // -> '71326 apricot #4486' | |
// Получение кол-ва объектов по указанному запросу | |
var totalEntities = client.from('Good').select(query01).total(); | |
log.info(totalEntities); // -> 20 | |
// СОЗДАНИЕ/СОХРАНЕНИЕ/ОБНОВЛЕНИЕ ОБЪЕКТОВ | |
// | |
// 1. Создание объекта заказа метод createEntity | |
var newOrder2 = client.createEntity('customerOrder', { | |
name: 'order-02' | |
}); | |
newOrder2 = client.save(newOrder2); | |
console.log(newOrder2.uuid); | |
// 2. Передача типа объекта заказа в качестве параметра метода client.save | |
var newOrder3 = client.save('customerOrder', { | |
name: 'order-03' | |
}); | |
// Аналогичным способом сохраняются полученные с сервиса и модифицированные объекты | |
// Изменение имени объекта | |
firstEntity.name = 'Новое имя товара'; | |
// Сохранение полученного ранее объекта | |
client.save(firstEntity); | |
// УДАЛЕНИЕ ОБЪЕКТА | |
// | |
// 1. Удаление объекта (объект или массив объектов) | |
var isDeleted = client.del(newOrder1); | |
console.log(isDeleted); // -> true | |
// 2. Удаление объекта по идентификатору (строка или массив строк идентификаторов) | |
var deletedUuids = client.del('customerOrder', [ newOrder2.uuid, newOrder3.uuid]); | |
console.log(deletedUuids[0] === newOrder2.uuid); // -> true | |
// ЛЕНИВАЯ ЗАГРУЗКА | |
// ВНИМАНИЕ! Подобная техника применима только для синхронного режима веб-запросов | |
// | |
// Загрузка заказа | |
var lazyOrder = client.load('good', 'a7acd190-156d-11e3-1c9e-7054d21a8d1e'); | |
// Идентификатор ссылка на контрагента (не объект) | |
var agentUuid = lazyOrder.sourceAgentUuid; | |
// ОШИБКА! в lazyOrder нет свойства sourceAgent, только ссылка на контрагента "sourceAgentUuid" | |
var agentName = lazyOrder.sourceAgent.name; | |
// Для доступа к связанным сущностям необходимо воспользоваться ленивым загрузчиком | |
var lazy = client.createLazyLoader(); | |
// Привязка ленивого загрузчика к заказу | |
lazy.attach(lazyOrder, [ 'good' ]); | |
// Получение имени контрагента (динамическая подгрузка в момент обращения к свойству sourceAgent) | |
agentName = lazyOrder.sourceAgent.name; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment