1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-25 02:42:28 +02:00

Переписаны методы http инструментария и события Google Calendar

This commit is contained in:
Anton 2024-02-22 19:38:32 +03:00
parent 5039c6b502
commit e869493655
3 changed files with 280 additions and 186 deletions

View File

@ -287,45 +287,6 @@
КонецФункции
// Создать событие.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события. См. ПолучитьОписаниеСобытия
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events";
Дата0 = ОписаниеСобытия["ДатаНачала"];
Дата1 = ОписаниеСобытия["ДатаОкончания"];
Вложения = ОписаниеСобытия["МассивURLФайловВложений"];
Вложения = ПреобразоватьВложения(Вложения);
Уведомления = ОписаниеСобытия["ОтправлятьУведомления"];
Параметры = Новый Структура;
Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]);
Параметры.Вставить("description", ОписаниеСобытия["Описание"]);
Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]);
Параметры.Вставить("start" , ПреобразоватьДату(Дата0));
Параметры.Вставить("end" , ПреобразоватьДату(Дата1));
Параметры.Вставить("attachments", Вложения);
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none"));
ПараметрыURL.Вставить("supportsAttachments" , ?(Вложения.Количество() > 0, "true", "false"));
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина);
Возврат Ответ;
КонецФункции
// Получить событие.
//
// Параметры:
@ -349,6 +310,59 @@
КонецФункции
// Создать событие.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события. См. ПолучитьОписаниеСобытия
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт
Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия);
КонецФункции
// Переместить событие.
//
// Параметры:
// Токен - Строка - Токен
// КалендарьИсточник - Строка - ID календаря источника
// КалендарьПриемник - Строка - ID календаря приемника
// Событие - Строка - ID события календаря источника
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ КалендарьИсточник
+ "/events/"
+ Событие
+ "/move?destination="
+ КалендарьПриемник;
Ответ = OPI_Инструменты.Post(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить событие.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// ОписаниеСобытия - Строка - Новое описание события
// Событие - Строка - ID события
//
// Возвращаемое значение:
// HTTPОтвет - Изменить событие
Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт
Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие);
КонецФункции
// Удалить событие.
//
// Параметры:
@ -478,4 +492,43 @@
КонецПроцедуры
Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "")
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Существующее = ЗначениеЗаполнено(Событие);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ Календарь
+ "/events"
+ ?(Существующее, "/" + Событие, "");
Дата0 = ОписаниеСобытия["ДатаНачала"];
Дата1 = ОписаниеСобытия["ДатаОкончания"];
Вложения = ОписаниеСобытия["МассивURLФайловВложений"];
Вложения = ПреобразоватьВложения(Вложения);
Уведомления = ОписаниеСобытия["ОтправлятьУведомления"];
Параметры = Новый Структура;
Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]);
Параметры.Вставить("description", ОписаниеСобытия["Описание"]);
Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]);
Параметры.Вставить("start" , ПреобразоватьДату(Дата0));
Параметры.Вставить("end" , ПреобразоватьДату(Дата1));
Параметры.Вставить("attachments", Вложения);
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none"));
ПараметрыURL.Вставить("supportsAttachments" , ?(Вложения.Количество() > 0, "true", "false"));
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
Если Существующее Тогда
Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
Иначе
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина);
КонецЕсли;
Возврат Ответ;
КонецФункции
#КонецОбласти

View File

@ -26,7 +26,7 @@
#Область HTTPМетоды
// Без тела
#Область ЗапросыБезТела
Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "") Экспорт
Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки);
@ -36,7 +36,9 @@
Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки);
КонецФункции
// С телом
#КонецОбласти
#Область ЗапросыСТелом
Функция Post(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина) Экспорт
Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON);
@ -50,6 +52,10 @@
Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON);
КонецФункции
#КонецОбласти
#Область ЗапросыMultipart
Функция PostMultipart(Знач URL
, Знач Параметры
, Знач Файлы = ""
@ -70,6 +76,8 @@
КонецФункции
#КонецОбласти
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
СоответствиеВозврата = Новый Соответствие;
@ -181,22 +189,6 @@
Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
КонецФункции
Процедура ВыполнитьСкрипт(Знач Текст) Экспорт
ИмяСкрипта = ПолучитьИмяВременногоФайла(".ps1");
ТекстСкрипта = Новый ТекстовыйДокумент;
ТекстСкрипта.УстановитьТекст(Текст);
ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);
КодВозврата = 0;
ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", , Истина, КодВозврата);
УдалитьФайлы(ИмяСкрипта);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@ -209,15 +201,123 @@
Параметры = Новый Структура;
КонецЕсли;
GZip = "gzip";
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
СтруктураURL = РазбитьURL(URL);
Переадресация = 300;
Ошибка = 400;
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Соединение = СоздатьСоединение(Сервер);
УстановитьТелоЗапроса(Запрос, Параметры, JSON);
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадрисация Тогда
Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, JSON);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция ВыполнитьЗапросБезТела(Знач URL, Знач Вид, Знач Параметры = "", Знач ДопЗаголовки = "")
Если Не ЗначениеЗаполнено(Параметры) Тогда
Параметры = Новый Структура;
КонецЕсли;
Переадресация = 300;
Ошибка = 400;
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры);
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки);
Соединение = СоздатьСоединение(Сервер);
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадрисация Тогда
Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция ВыполнитьЗапросМультипарт(Знач URL
, Знач Вид
, Знач Параметры
, Знач Файлы = ""
, Знач ТипКонтента = "image/jpeg"
, Знач ДопЗаголовки = "")
Если Не ЗначениеЗаполнено(Параметры) Тогда
Параметры = Новый Структура;
КонецЕсли;
Если Не ЗначениеЗаполнено(Файлы) Тогда
Файлы = Новый Соответствие;
КонецЕсли;
Переадресация = 300;
Ошибка = 400;
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/form-data; boundary=" + Boundary;
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Соединение = СоздатьСоединение(Сервер);
ТелоЗапроса = Запрос.ПолучитьТелоКакПоток();
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь);
ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадрисация Тогда
Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"]
, Вид
, Параметры
, Файлы
, ТипКонтента
, ДопЗаголовки);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "")
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", ТипДанных);
Заголовки.Вставить("Accept-Encoding", GZip);
Заголовки.Вставить("Accept", "*/*");
Заголовки.Вставить("Connection", "keep-alive");
Заголовки.Вставить("Accept-Encoding", "gzip");
Заголовки.Вставить("Accept" , "*/*");
Заголовки.Вставить("Connection" , "keep-alive");
Если ЗначениеЗаполнено(ТипДанных) Тогда
Заголовки.Вставить("Content-Type", ТипДанных);
КонецЕсли;
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
@ -227,22 +327,22 @@
КонецЕсли;
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
Если JSON Тогда
Данные = JSONСтрокой(Параметры);
Иначе
СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
КонецЕсли;
Возврат НовыйЗапрос;
НовыйЗапрос.УстановитьТелоИзСтроки(Данные);
КонецФункции
Ответ = Соединение.ВызватьHTTPМетод(Вид, НовыйЗапрос);
Функция СоздатьСоединение(Знач Сервер)
Возврат Новый HTTPСоединение(Сервер, 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
КонецФункции
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить(
"content-encoding") = GZip;
Процедура ОбработатьОтвет(Ответ)
GZip = "gzip";
НужнаРаспаковка =
Ответ.Заголовки.Получить("Content-Encoding") = GZip
Или Ответ.Заголовки.Получить("content-encoding") = GZip;
Если НужнаРаспаковка Тогда
Ответ = РаспаковатьОтвет(Ответ);
@ -260,88 +360,22 @@
КонецЕсли;
Возврат Ответ;
КонецПроцедуры
КонецФункции
Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON)
Функция ВыполнитьЗапросБезТела(Знач URL, Знач Вид, Знач Параметры = "", Знач ДопЗаголовки = "")
Если Не ЗначениеЗаполнено(Параметры) Тогда
Параметры = Новый Структура;
Если JSON Тогда
Данные = JSONСтрокой(Параметры);
Иначе
СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
КонецЕсли;
Заголовки = Новый Соответствие;
Запрос.УстановитьТелоИзСтроки(Данные);
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
КонецПроцедуры
Для Каждого Заголовок Из ДопЗаголовки Цикл
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецЕсли;
СтруктураURL = РазбитьURL(URL);
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос(СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры), Заголовки);
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
Переадресация = 300;
НеНайдено = 400;
Если Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < НеНайдено Тогда
Возврат ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки);
КонецЕсли;
Попытка
ТелоОтвета = JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные();
КонецПопытки;
Возврат ТелоОтвета;
КонецФункции
// BSLLS:CognitiveComplexity-off
// BSLLS:Typo-off
Функция ВыполнитьЗапросМультипарт(Знач URL
, Знач Вид
, Знач Параметры
, Знач Файлы = ""
, Знач ТипКонтента = "image/jpeg"
, Знач ДопЗаголовки = "")
Если Не ЗначениеЗаполнено(Параметры) Тогда
Параметры = Новый Структура;
КонецЕсли;
Если Не ЗначениеЗаполнено(Файлы) Тогда
Файлы = Новый Соответствие;
КонецЕсли;
ЗаменаТочки = "___";
GZip = "gzip";
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
СтруктураURL = РазбитьURL(URL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
Заголовки.Вставить("Accept-Encoding", GZip);
Заголовки.Вставить("Accept", "*/*");
Заголовки.Вставить("Connection", "keep-alive");
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
Для Каждого Заголовок Из ДопЗаголовки Цикл
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецЕсли;
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
ТелоЗапроса = НовыйЗапрос.ПолучитьТелоКакПоток();
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь);
Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры)
РазделительСтрок = Символы.ВК + Символы.ПС;
@ -349,7 +383,7 @@
Если Параметр.Значение = Неопределено
Или Параметр.Значение = NULL Тогда
Продолжить;
Продолжить;
КонецЕсли;
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
@ -366,15 +400,24 @@
ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда
ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false"));
Иначе
ЗаписьТекста.Записать(Параметр.Значение);
КонецЕсли;
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
КонецЦикла;
Счетчик = 0;
КонецПроцедуры
Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы)
РазделительСтрок = Символы.ВК + Символы.ПС;
ЗаменаТочки = "___";
Для Каждого Файл Из Файлы Цикл
ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
@ -385,7 +428,7 @@
ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1);
ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ,
ЗаменаТочки, "."));
ЗаменаТочки, "."));
КонецЕсли;
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
@ -401,31 +444,9 @@
ЗаписьТекста.Записать(Файл.Значение);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
Счетчик = Счетчик + 1;
КонецЦикла;
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
Ответ = Соединение.ВызватьHTTPМетод(Вид, НовыйЗапрос);
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить(
"content-encoding") = GZip;
Если НужнаРаспаковка Тогда
Ответ = РаспаковатьОтвет(Ответ);
КонецЕсли;
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные")
, JsonВСтруктуру(Ответ)
, JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()));
КонецФункции
// BSLLS:Typo-on
// BSLLS:CognitiveComplexity-on
КонецПроцедуры
#Область GZip

View File

@ -1240,6 +1240,7 @@
.ИмеетТип("Массив").Заполнено();
КонецПроцедуры
#КонецОбласти
#Область YandexDisk
@ -1637,6 +1638,7 @@
Календарь = ПолучитьПараметр("Google_Календарь");
Наименование = "Новое событие";
Описание = "Описание тестового события";
ОписаниеИзм = "Описание тестового события (изм.)";
ТипСоответствие = Тип("Соответствие");
ТипСтрока = Тип("Строка");
Summary = "summary";
@ -1667,12 +1669,30 @@
.Свойство("description").Равно(Описание)
.Свойство("id").ИмеетТип(ТипСтрока).Заполнено();
СоответствиеСобытия.Вставить("Описание", ОписаниеИзм);
Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип(ТипСоответствие)
.Свойство(Summary).Равно(Наименование)
.Свойство("description").Равно(ОписаниеИзм)
.Свойство("id").ИмеетТип(ТипСтрока).Заполнено();
Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип(ТипСоответствие)
.Свойство(Summary).Равно(Наименование)
.Свойство("description").Равно(Описание)
.Свойство("description").Равно(ОписаниеИзм)
.Свойство("id").ИмеетТип(ТипСтрока).Заполнено();
Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип(ТипСоответствие)
.Свойство(Summary).Равно(Наименование)
.Свойство("description").Равно(ОписаниеИзм)
.Свойство("id").ИмеетТип(ТипСтрока).Заполнено();
Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие);