Создание базы данных на основе API 37signals

от автора

Один из наших сервисов занимается построением ежедневных отчетов анализируя данные из Highrise.
Данные из Highrise можно получать несколькими способами:

  • Использовать экспорт в CSV
  • Использовать API

CSV нами даже не рассматривался и мы попытались найти удобный метод для ежедневного обновления нашей базы через API.
Придумали следующее:

  • Получаем XML фид и парсим его.
  • Все непосредственные дочерние поля мы считаем полями в таблице.
  • Все вложенные элементы мы считаем связанными таблицами


Пример XML ответа (https://xxx.highrisehq.com/deals.xml):

image

Стрелками обозначены элементы, которые мы считаем вложенными и соответственно выносим данные в связанные таблицы.

Как мы делали из XML MySQL таблицы.

  • Если в данных имеется поле id — мы считаем его первичным целым ключом
  • Для всех остальных полей XML типом мы считаем аттрибут type (исключая тип array)
  • Для вложенных элементов мы проверяем имеют ли они аттрибут id и если имеют (у нас связанная таблица), то добавялем к нашей таблице поле <имя вложенной таблицы>-id и создаем вложенную таблицу
  • Все поля в таблице делим на 3 типа: integer, datetime и varchar/text. TEXT у нас только в том случае, если имя поля имеет одно из конкретных значений: ‘value’, ‘description’, ‘text’, ‘body’, ‘message’, ‘data’, ‘blob’, ‘background’

Пример того что у нас получается на выходе:

image

Теперь с этими данными можно делать что угодно, рисовать графики, считать суммы, выдергивать другую интересную информацию.

Самое главное, что получившийся код работает со всеми сервисами 37signals и может делать синхронизацию любого их сервиса.

Пример синхронизации Basecamp
<?php  require 'SyncService.class.php';  $sync = new SyncService( array(         'db' => array(                 'host' => 'localhost',                 'user' => 'root',                 'password' => '123',                 'schema' => 'basecamp'             ),         'service' => array(                 'name' => 'basecamp',                 'url' => 'https://xxx.basecamphq.com',                 'token' => 'abcdef1234567890abcdef1234567890',                 'streams' => array(                         '/todo_lists.xml' => 500,                         '/people.xml' => 500,                         '/projects.xml' => 500,                         '/account.xml' => 0,                     )             ),     ) );  $sync->doSyncing(); 

Весь код библиотеки вместе с примером на гитхабе.

ссылка на оригинал статьи http://habrahabr.ru/post/179665/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *