Pull to refresh

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

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


Весь код библиотеки вместе с примером на гитхабе.
Tags:
Hubs:
Total votes 5: ↑4 and ↓1+3
Comments5

Articles