diff --git a/.github/workflows/oint_test_Airtable.yml b/.github/workflows/oint_test_Airtable.yml index 54dbb3125..ab9ee7c2d 100644 --- a/.github/workflows/oint_test_Airtable.yml +++ b/.github/workflows/oint_test_Airtable.yml @@ -91,6 +91,10 @@ jobs: if: ${{ cancelled() }} == false run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьПоле" + - name: Создать/Удалить записи + if: ${{ cancelled() }} == false + run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьУдалитьЗаписи" + - name: Записать измененные данные if: ${{ cancelled() }} == false diff --git a/.github/workflows/oint_test_full.yml b/.github/workflows/oint_test_full.yml index e71332a89..483a5966c 100644 --- a/.github/workflows/oint_test_full.yml +++ b/.github/workflows/oint_test_full.yml @@ -851,6 +851,10 @@ jobs: if: ${{ cancelled() }} == false run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьПоле" + - name: Создать/Удалить записи + if: ${{ cancelled() }} == false + run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьУдалитьЗаписи" + Encode: runs-on: ubuntu-latest needs: [Testing-Twitter] diff --git a/OInt/core/Modules/OPI_Airtable.os b/OInt/core/Modules/OPI_Airtable.os index c6dd3f499..c464e2a2c 100644 --- a/OInt/core/Modules/OPI_Airtable.os +++ b/OInt/core/Modules/OPI_Airtable.os @@ -292,6 +292,128 @@ #КонецОбласти +#Область РаботаСЗаписями + +// Получить список записей +// Получает список записей выбранной таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить запись +// Получает данные строки таблицы по идентификатору +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать записи +// Создает одну или массив записей по описанию или массиву описаний значений полей +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); + + Параметры = Новый Структура(); + ДобавитьОписаниеДанных(Данные, Параметры); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить записи +// Удаляет одну или массив записей по идентификаторам +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьМассив(Записи); + + СтрокаЗаписей = ""; + + Для Каждого Запись Из Записи Цикл + СтрокаЗаписей = СтрокаЗаписей + + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?") + + "records[]=" + + OPI_Инструменты.ЧислоВСтроку(Запись); + КонецЦикла; + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -331,4 +453,24 @@ КонецФункции +Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры) + + Если ТипЗнч(Данные) = Тип("Массив") Тогда + + МассивОтправки = Новый Массив; + + Для Каждого ОписаниеЗаписи Из Данные Цикл + МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи)); + КонецЦикла; + + OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры); + + Иначе + + OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/OInt/tests/Modules/internal/OPI_Тесты.os b/OInt/tests/Modules/internal/OPI_Тесты.os index 19fcddf53..4725818e0 100644 --- a/OInt/tests/Modules/internal/OPI_Тесты.os +++ b/OInt/tests/Modules/internal/OPI_Тесты.os @@ -3574,6 +3574,73 @@ КонецПроцедуры +Процедура АТ_СоздатьУдалитьЗаписи() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); + + Числовой = 10; + Строчный = "Привет"; + + ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный); + ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный); + + МассивУдаляемых = Новый Массив; + МассивОписаний = Новый Массив; + МассивОписаний.Добавить(ОписаниеСтроки1); + МассивОписаний.Добавить(ОписаниеСтроки2); + + Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2); + + Для Каждого Запись Из Результат["records"] Цикл + МассивУдаляемых.Добавить(Запись["id"]); + КонецЦикла; + + Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)"); + + ОдиночнаяЗапись = Результат["id"]; + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено(ОдиночнаяЗапись); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный); + + Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись); + + Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(3); + + Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2); + + Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(1); + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os index 4b924b50f..d7d26cbd7 100644 --- a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os +++ b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os @@ -200,6 +200,7 @@ НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ); НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ); НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ); + НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ); Возврат ТаблицаТестов; diff --git a/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os b/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os index e7d626fe5..9d1a1b975 100644 --- a/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os +++ b/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os @@ -184,11 +184,13 @@ СтрокаПараметров = "?"; Для Каждого Параметр Из Параметры Цикл + + ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение); + СтрокаПараметров = СтрокаПараметров + Параметр.Ключ + "=" - + КодироватьСтроку(Параметр.Значение, - СпособКодированияСтроки.КодировкаURL) + + ЗначениеПараметра + "&"; КонецЦикла; @@ -704,6 +706,21 @@ КонецФункции +Функция ПреобразоватьПараметрВСтроку(Знач Значение) + + Если ТипЗнч(Значение) = Тип("Массив") Тогда + Значение = СтрСоединить(Значение, ","); + Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); + Значение = "[" + Значение + "]"; + Иначе + Значение = ЧислоВСтроку(Значение); + Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); + КонецЕсли; + + Возврат Значение; + +КонецФункции + Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON) Коллекция = ТипЗнч(Параметры) = Тип("Структура") diff --git a/data.json.gpg b/data.json.gpg index ac9b01e32..40265afaa 100644 Binary files a/data.json.gpg and b/data.json.gpg differ