Задача [0501]: API импорта конфигурации

Формулировка проблемы: необходим метод API импорта конфигурации, полученной при помощи системной функции экспорта конфигурации.

Связанные задачи:

Решение:

Необходимо реализовать следующий метод API:

URL метода: rest/api/configuration.

Тип запроса: POST.

Тип содержимого (Content-Type): multipart/form-data.

Метод могут вызывать только пользователи, которые имеют права суперметодолога.

Метод принимает следующие параметры:

Метод возвращает json-объект с полями:

Пример передаваемого запроса:

POST Synergy/rest/api/configuration HTTP/1.1
Content-Length: 6198
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------2cce5ebcbcb2d479

--------------------------2cce5ebcbcb2d479
Content-Disposition: form-data; name="data"; filename="configuration-2013-01-25_12-19-28.xml"
Content-Type: application/xml

<?xml version="1.0" encoding="utf-8"?>
<configuration version="1" date="2013-01-25 12:19:19">
    <objects version="1" date="2013-01-25 12:19:19">
        <dictionary code="priority_items" name="priority_items" comment="Справочник приоритетов работ (руками не трогать, только через интерфейс!)">
            <columns>
                <column code="name" name="name" order="0" comment="name" localized="true"/>
                <column code="color" name="color" order="1"
                    comment="color" localized="false"/>
                <column code="position" name="position" order="2"
                    comment="position" localized="true"/>
                <column code="number" name="number" order="3"
                    comment="number" localized="false"/>
                <column code="base" name="base" order="4" comment="base" localized="false"/>
                <column code="deleted" name="deleted" order="5"
                    comment="deleted" localized="true"/>
            </columns>
            <items>
                <item>
                    <itemValue column="base" value="true"/>
                    <itemValue column="deleted" value="false"
                        _c_value="false" _c_setByUser="true"
                        _ru_value="false" _ru_setByUser="false"
                        _kk_value="false" _kk_setByUser="false"
                        _en_value="false" _en_setByUser="false"/>
                    <itemValue column="number" value="1"/>
                    <itemValue column="position" value="2" _c_value="2"
                        _c_setByUser="true" _ru_value="2"
                        _ru_setByUser="false" _kk_value="2"
                        _kk_setByUser="false" _en_value="2" _en_setByUser="false"/>
                    <itemValue column="color" value="#f6f782"/>
                    <itemValue column="name" value="Плановое"
                        _c_value="Плановое" _c_setByUser="true"
                        _ru_value="Плановое" _ru_setByUser="true"
                        _kk_value="Жоспарлы" _kk_setByUser="true"
                        _en_value="Routine" _en_setByUser="true"/>
                </item>
                <item>
                    <itemValue column="base" value="false"/>
                    <itemValue column="deleted" value="false"
                        _c_value="false" _c_setByUser="true"
                        _ru_value="false" _ru_setByUser="false"
                        _kk_value="false" _kk_setByUser="false"
                        _en_value="false" _en_setByUser="false"/>
                    <itemValue column="number" value="0"/>
                    <itemValue column="position" value="1" _c_value="1"
                        _c_setByUser="true" _ru_value="1"
                        _ru_setByUser="false" _kk_value="1"
                        _kk_setByUser="false" _en_value="1" _en_setByUser="false"/>
                    <itemValue column="color" value="#c0de48"/>
                    <itemValue column="name" value="Не срочно"
                        _c_value="Не срочно" _c_setByUser="true"
                        _ru_value="Не срочно" _ru_setByUser="true"
                        _kk_value="Шұғыл емес" _kk_setByUser="true"
                        _en_value="Nonurgent" _en_setByUser="true"/>
                </item>
                <item>
                    <itemValue column="base" value="false"/>
                    <itemValue column="deleted" value="false"
                        _c_value="false" _c_setByUser="true"
                        _ru_value="false" _ru_setByUser="false"
                        _kk_value="false" _kk_setByUser="false"
                        _en_value="false" _en_setByUser="false"/>
                    <itemValue column="number" value="3"/>
                    <itemValue column="position" value="4" _c_value="4"
                        _c_setByUser="true" _ru_value="4"
                        _ru_setByUser="false" _kk_value="4"
                        _kk_setByUser="false" _en_value="4" _en_setByUser="false"/>
                    <itemValue column="color" value="#e4302f"/>
                    <itemValue column="name" value="Критично"
                        _c_value="Критично" _c_setByUser="true"
                        _ru_value="Критично" _ru_setByUser="true"
                        _kk_value="Шұғыл" _kk_setByUser="true"
                        _en_value="Critical" _en_setByUser="true"/>
                </item>
                <item>
                    <itemValue column="base" value="false"/>
                    <itemValue column="deleted" value="false"
                        _c_value="false" _c_setByUser="true"
                        _ru_value="false" _ru_setByUser="false"
                        _kk_value="false" _kk_setByUser="false"
                        _en_value="false" _en_setByUser="false"/>
                    <itemValue column="number" value="2"/>
                    <itemValue column="position" value="3" _c_value="3"
                        _c_setByUser="true" _ru_value="3"
                        _ru_setByUser="false" _kk_value="3"
                        _kk_setByUser="false" _en_value="3" _en_setByUser="false"/>
                    <itemValue column="color" value="#ef7c77"/>
                    <itemValue column="name" value="Срочно"
                        _c_value="Срочно" _c_setByUser="true"
                        _ru_value="Срочно" _ru_setByUser="true"
                        _kk_value="Тығыз" _kk_setByUser="true"
                        _en_value="Urgent" _en_setByUser="true"/>
                </item>
            </items>
        </dictionary>
    </objects>
    <dependencies/>
</configuration>

--------------------------2cce5ebcbcb2d479
Content-Disposition: form-data; name="locale"

ru
--------------------------2cce5ebcbcb2d479--

Пример возвращаемого json-объекта при успешном выполнении метода:


{
    "errorCode": 0,
    "errorMessage": "Конфигурация импортирована успешно"
}

Внимание

Если во время выполнения импорта произойдет ошибка, все изменения конфигурации, примененные в процессе импорта, должны быть отменены (т.е. метод должен выполняться в рамках одной транзакции).

Альтернативные потоки событий

Альтернативный поток №1. Не передан обязательный параметр data либо он имеет неверный тип. Сервер возвращает ошибку HTTP 400 с сообщением:

{
  "errorCode": 3,
  "errorMessage": "Не передан параметр data либо он имеет неверный тип (требуется application/xml)"
}

действие не выполняется.

Альтернативный поток №2. Передано некорректное значение параметра new_version. Сервер возвращает ошибку HTTP 400 с сообщением:

{
  "errorCode": 3,
  "errorMessage": "Передано некорректное значение параметра new_version. Требуется: true или false."
}

действие не выполняется.

Альтернативный поток №3. Передан некорректный файл конфигурации: невалидный XML или содержащий неизвестное содержимое. Сервер возвращает ошибку HTTP 400 с сообщением:

{
  "errorCode": 3,
  "errorMessage": "Некорректный формат файла"
}

действие не выполняется.

Альтернативный поток №4. Передана версия конфигурации, несовместимая с версией Synergy на сервере. Сервер возвращает ошибку HTTP 400 с сообщением:

{
  "errorCode": 3,
  "errorMessage": "Импорт конфигураций из более новых версий Synergy в более старую не поддерживается"
}

действие не выполняется.

Альтернативный поток №5. Пользователь, который запускает метод, не имеет прав суперметодолога. Сервер возвращает ошибку HTTP 403 с сообщением:

{
  "errorCode": 2,
  "errorMessage": "Недостаточно прав для выполнения этого действия"
}

действие не выполняется.

Альтернативный поток №6. Во время импорта конфигурации произошла ошибка. Сервер возвращает ошибку HTTP 500 с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Во время импорта конфигурации произошла ошибка. Изменения не применены."
}

действие не выполняется.