wmakeev
11/25/2013 - 8:18 PM

Moysklad Client interface

Moysklad Client interface

/**
 *  Пример использования библиотеки 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;

}

// Получение всех записей коллекции ввиде массива
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)
}

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()
  
  
} 


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 })  
  
}