Skip to content

Instantly share code, notes, and snippets.

@wmakeev
Last active December 29, 2015 09:09
Show Gist options
  • Save wmakeev/7648117 to your computer and use it in GitHub Desktop.
Save wmakeev/7648117 to your computer and use it in GitHub Desktop.
Moysklad Client interface
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 })
}
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()
}
// Получение всех записей коллекции ввиде массива
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)
}
/**
* Пример использования библиотеки 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