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

в 11:08, , рубрики: 37signals, basecamp, highrise, php, метки: , , ,

Один из наших сервисов занимается построением ежедневных отчетов анализируя данные из 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();

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

Автор: xytop

Источник

Поделиться

* - обязательные к заполнению поля