From 9246746f4b6af1bdbc0be91c22dd41f1eafeef9e Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 21 Feb 2024 19:09:05 +0300 Subject: [PATCH 01/13] =?UTF-8?q?Google=20Calendar:=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OPI_GoogleCalendar/Module.bsl | 371 +++++++++++++++--- OPI/src/CommonModules/YAX_Тесты/Module.bsl | 104 ++++- 2 files changed, 422 insertions(+), 53 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index 42fc32a7ea..3de35770cb 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -24,6 +24,116 @@ #Область ПрограммныйИнтерфейс +#Область РаботаСМетаданнымиКалендарей + +// Создать календарь. +// +// Параметры: +// Токен - Строка - Токен +// Наименование - Строка - Наименование создаваемого календаря +// +// Возвращаемое значение: +// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google +Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars"; + + Параметры = Новый Структура; + Параметры.Вставить("summary", Наименование); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить календарь. +// +// Параметры: +// Токен - Строка - Токен +// Календарь - Строка - ID календаря +// +// Возвращаемое значение: +// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google +Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить календарь. +// +// Параметры: +// Токен - Строка - Токен +// Календарь - Строка - ID календаря +// Наименование - Строка - Новое наименование +// Описание - Строка - Новое описание календаря +// +// Возвращаемое значение: +// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google +Функция ИзменитьМетаданныеКалендаря(Знач Токен, Знач Календарь, Знач Наименование = "", Знач Описание = "") Экспорт + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Наименование) Тогда + Параметры.Вставить("summary", Наименование); + КонецЕсли; + + Если ЗначениеЗаполнено(Описание) Тогда + Параметры.Вставить("description", Описание); + КонецЕсли; + + Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Очистить основной календарь. +// +// Параметры: +// Токен - Строка - Токен +// +// Возвращаемое значение: +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; + Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь); + + Возврат Ответ; + +КонецФункции + +// Удалить календарь. +// +// Параметры: +// Токен - Строка - Токен +// Календарь - Строка - ID календаря +// +// Возвращаемое значение: +// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google +Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + #Область РаботаСоСпискомКалендарей // Получить список календарей. @@ -66,74 +176,62 @@ КонецФункции -#КонецОбласти - -#Область РаботаСКалендарями - -// Создать календарь. -// -// Параметры: -// Токен - Строка - Токен -// Наименование - Строка - Наименование создаваемого календаря -// -// Возвращаемое значение: -// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google -Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars"; - - Параметры = Новый Структура; - Параметры.Вставить("summary", Наименование); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить календарь. +// Получить календарь списка. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: -// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google -Функция ПолучитьКалендарь(Знач Токен, Знач Календарь) Экспорт +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт Заголовки = ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции -// Изменить календарь. +// Удалить календарь из списка. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря -// Наименование - Строка - Новое наименование -// Описание - Строка - Новое описание календаря // // Возвращаемое значение: -// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google -Функция ИзменитьКалендарь(Знач Токен, Знач Календарь, Знач Наименование = "", Знач Описание = "") Экспорт +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт Заголовки = ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - Параметры = Новый Структура; + Возврат Ответ; + +КонецФункции + +// Изменить календарь списка. +// +// Параметры: +// Токен - Строка - Токен +// Календарь - Строка - ID календаря +// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) +// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) +// Скрытый - Булево - Скрытый календарь +// +// Возвращаемое значение: +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция ИзменитьКалендарьСписка(Знач Токен, Знач Календарь, Знач ОсновнойЦвет, Знач ДополнительныйЦвет, Знач Скрытый = Ложь) Экспорт - Если ЗначениеЗаполнено(Наименование) Тогда - Параметры.Вставить("summary", Наименование); - КонецЕсли; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true"; - Если ЗначениеЗаполнено(Описание) Тогда - Параметры.Вставить("description", Описание); - КонецЕсли; + Параметры = Новый Соответствие; + Параметры.Вставить("hidden" , Скрытый); + Параметры.Вставить("foregroundColor", ОсновнойЦвет); + Параметры.Вставить("backgroundColor", ДополнительныйЦвет); Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); @@ -141,19 +239,128 @@ КонецФункции -// Удалить календарь. +#КонецОбласти + +#Область РаботаССобытиями + +// Получить описание события. +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Пустой макет события +Функция ПолучитьОписаниеСобытия() Экспорт + + СоответствиеСобытия = Новый Соответствие; + СоответствиеСобытия.Вставить("Описание" , ""); // Описание события + СоответствиеСобытия.Вставить("Заголовок" , "Новое событие"); // Заголовок события + СоответствиеСобытия.Вставить("МестоПроведения" , ""); // Строка описание места проведения + СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДатаСеанса()); // Дата начала события + СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + 3600); // Дата окончания события + СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Новый Соответствие); // Ключ - название, Значение - URL к файлу + СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам + + Возврат СоответствиеСобытия; + +КонецФункции + +// Получить список событий. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: -// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google -Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт +// Соответствие Из КлючИЗначение - Массив соответствий событий +Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + МассивСобытий = Новый Массив; + + ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий); + + Возврат МассивСобытий; + +КонецФункции + +// Создать событие. +// +// Параметры: +// Токен - Строка - Токен +// Календарь - Строка - 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, Параметры, Заголовки, Истина); + + Возврат Ответ; + +КонецФункции + +// Получить событие. +// +// Параметры: +// Токен - Строка - Токен +// Календарь - Строка - ID календаря +// Событие - Строка - ID события +// +// Возвращаемое значение: +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events/" + + Событие; + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить событие. +// +// Параметры: +// Токен - Строка - Токен +// Календарь - Строка - ID календаря +// Событие - Строка - ID события +// +// Возвращаемое значение: +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events/" + + Событие; + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; @@ -174,6 +381,47 @@ КонецФункции +Функция ПреобразоватьДату(Знач Дата) + + СтруктураДаты = Новый Структура; + + Если Дата = НачалоДня(Дата) Тогда + ФорматДаты = "ДФ=yyyy-MM-dd"; + Поле = "date"; + Иначе + ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ"; + Поле = "dateTime"; + КонецЕсли; + + Дата = Формат(Дата, ФорматДаты); + СтруктураДаты.Вставить(Поле, Дата); + + Возврат СтруктураДаты; + +КонецФункции + +Функция ПреобразоватьВложения(Знач Вложения) + + МассивВложений = Новый Массив; + + Если ТипЗнч(Вложения) = Тип("Соответствие") Тогда + + Для Каждого Вложение Из Вложения Цикл + + ТекущеВложение = Новый Структура; + ТекущеВложение.Вставить("title" , Вложение.Ключ); + ТекущеВложение.Вставить("fileUrl", Вложение.Значение); + + МассивВложений.Добавить(ТекущеВложение); + + КонецЦикла; + + КонецЕсли; + + Возврат МассивВложений; + +КонецФункции + Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") Параметры = Новый Структура; @@ -199,4 +447,29 @@ КонецПроцедуры +Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Страница) Тогда + Параметры.Вставить("pageToken", Страница); + КонецЕсли; + + Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events" + , + , Заголовки); + + События = Результат["items"]; + Страница = Результат["nextPageToken"]; + + Для Каждого Событие Из События Цикл + МассивСобытий.Добавить(Событие); + КонецЦикла; + + Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда + ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index 51f806170f..23d874fa5e 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -65,7 +65,9 @@ .ДобавитьСерверныйТест("ГК_ПолучитьТокен" , "Получить токен") .ДобавитьСерверныйТест("ГК_ОбновитьТокен" , "Обновить токен") .ДобавитьСерверныйТест("ГК_ПолучитьСписокКалендарей" , "Получить список календарей") - .ДобавитьСерверныйТест("ГК_СоздатьУдалитьКалендарь" , "Создать/удалить календарь"); + .ДобавитьСерверныйТест("ГК_СоздатьУдалитьКалендарь" , "Создать/удалить календарь") + .ДобавитьСерверныйТест("ГК_СоздатьУдалитьСобытие" , "Создать/удалить событие") + .ДобавитьСерверныйТест("ГК_ПолучитьСписокСобытий" , "Получить список событий"); КонецПроцедуры @@ -1559,6 +1561,8 @@ ТипСоответствие = Тип("Соответствие"); ТипСтрока = Тип("Строка"); Summary = "summary"; + Черный = "#000000"; + Желтый = "#ffd800"; Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование); @@ -1569,7 +1573,7 @@ Календарь = Результат["id"]; - Результат = OPI_GoogleCalendar.ИзменитьКалендарь(Токен + Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен , Календарь , НаименованиеИзмененное , Описание); @@ -1580,7 +1584,7 @@ .Свойство("description").Равно(Описание) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); - Результат = OPI_GoogleCalendar.ПолучитьКалендарь(Токен, Календарь); + Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь); ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) @@ -1588,12 +1592,104 @@ .Свойство("description").Равно(Описание) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип(ТипСоответствие) + .Свойство(Summary).Равно(НаименованиеИзмененное) + .Свойство("description").Равно(Описание) + .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + + + Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип(ТипСоответствие) + .Свойство(Summary).Равно(НаименованиеИзмененное) + .Свойство("foregroundColor").Равно(Черный) + .Свойство("backgroundColor").Равно(Желтый); + + Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип(ТипСоответствие) + .Свойство(Summary).Равно(НаименованиеИзмененное) + .Свойство("foregroundColor").Равно(Черный) + .Свойство("backgroundColor").Равно(Желтый); + + + Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен); + + ЮТест.ОжидаетЧто(Результат).НеЗаполнено(); + + Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь); + + ЮТест.ОжидаетЧто(Результат).НеЗаполнено(); + Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь); ЮТест.ОжидаетЧто(Результат).НеЗаполнено(); КонецПроцедуры - + +Процедура ГК_СоздатьУдалитьСобытие() Экспорт + + Токен = ПолучитьПараметр("Google_Token"); + Календарь = ПолучитьПараметр("Google_Календарь"); + Наименование = "Новое событие"; + Описание = "Описание тестового события"; + ТипСоответствие = Тип("Соответствие"); + ТипСтрока = Тип("Строка"); + Summary = "summary"; + + Вложения = Новый Соответствие; + Вложения.Вставить("Картинка1", "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); + Вложения.Вставить("Картинка2", "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); + + СоответствиеСобытия = Новый Соответствие; + СоответствиеСобытия.Вставить("Описание" , Описание); + СоответствиеСобытия.Вставить("Заголовок" , Наименование); + СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе"); + СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДатаСеанса()); + СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + 3600); + СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения); + СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); + + Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия); + Событие = Результат["id"]; + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип(ТипСоответствие) + .Свойство(Summary).Равно(Наименование) + .Свойство("description").Равно(Описание) + .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + + Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип(ТипСоответствие) + .Свойство(Summary).Равно(Наименование) + .Свойство("description").Равно(Описание) + .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + + Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); + + ЮТест.ОжидаетЧто(Результат).НеЗаполнено(); + +КонецПроцедуры + +Процедура ГК_ПолучитьСписокСобытий() Экспорт + + Токен = ПолучитьПараметр("Google_Token"); + Календарь = ПолучитьПараметр("Google_Календарь"); + + Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Массив"); + +КонецПроцедуры + #КонецОбласти #КонецОбласти From 3455cab9c676454df63ea3dbf19acc68ffd5ef8a Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 21 Feb 2024 19:29:27 +0300 Subject: [PATCH 02/13] =?UTF-8?q?=D0=94=D0=B5=D1=84=D1=84=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D1=8B=20SC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OPI_GoogleCalendar/Module.bsl | 20 ++++++++++--------- OPI/src/CommonModules/YAX_Тесты/Module.bsl | 17 ++++++++++------ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index 3de35770cb..6a8e2fd741 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -249,16 +249,18 @@ // Соответствие Из КлючИЗначение - Пустой макет события Функция ПолучитьОписаниеСобытия() Экспорт - СоответствиеСобытия = Новый Соответствие; - СоответствиеСобытия.Вставить("Описание" , ""); // Описание события - СоответствиеСобытия.Вставить("Заголовок" , "Новое событие"); // Заголовок события - СоответствиеСобытия.Вставить("МестоПроведения" , ""); // Строка описание места проведения - СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДатаСеанса()); // Дата начала события - СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + 3600); // Дата окончания события - СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Новый Соответствие); // Ключ - название, Значение - URL к файлу - СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам + Час = 3600; + Событие = Новый Соответствие; + + Событие.Вставить("Описание" , ""); // Описание события + Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события + Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения + Событие.Вставить("ДатаНачала" , ТекущаяДатаСеанса()); // Дата начала события + Событие.Вставить("ДатаОкончания" , Событие["ДатаНачала"] + Час); // Дата окончания события + Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу + Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам - Возврат СоответствиеСобытия; + Возврат Событие; КонецФункции diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index 23d874fa5e..c279dada7d 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -1560,6 +1560,7 @@ НаименованиеИзмененное = Наименование + " (изм.)"; ТипСоответствие = Тип("Соответствие"); ТипСтрока = Тип("Строка"); + Description = "description"; Summary = "summary"; Черный = "#000000"; Желтый = "#ffd800"; @@ -1581,7 +1582,7 @@ ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(НаименованиеИзмененное) - .Свойство("description").Равно(Описание) + .Свойство(Description).Равно(Описание) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь); @@ -1589,7 +1590,7 @@ ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(НаименованиеИзмененное) - .Свойство("description").Равно(Описание) + .Свойство(Description).Равно(Описание) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь); @@ -1597,7 +1598,7 @@ ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(НаименованиеИзмененное) - .Свойство("description").Равно(Описание) + .Свойство(Description).Равно(Описание) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); @@ -1641,17 +1642,21 @@ ТипСоответствие = Тип("Соответствие"); ТипСтрока = Тип("Строка"); Summary = "summary"; + Час = 3600; Вложения = Новый Соответствие; - Вложения.Вставить("Картинка1", "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); - Вложения.Вставить("Картинка2", "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); + + Вложения.Вставить("Картинка1" + , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); + Вложения.Вставить("Картинка2" + , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); СоответствиеСобытия = Новый Соответствие; СоответствиеСобытия.Вставить("Описание" , Описание); СоответствиеСобытия.Вставить("Заголовок" , Наименование); СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе"); СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДатаСеанса()); - СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + 3600); + СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + Час); СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения); СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); From 3be0194c65a575558efbbde16f287a2fc91ec52f Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 21 Feb 2024 19:36:17 +0300 Subject: [PATCH 03/13] =?UTF-8?q?=D0=94=D0=B5=D1=84=D1=84=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D1=8B=20SC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl | 6 +++++- OPI/src/CommonModules/YAX_Тесты/Module.bsl | 2 -- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index 6a8e2fd741..708ae3124d 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -223,7 +223,11 @@ // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google -Функция ИзменитьКалендарьСписка(Знач Токен, Знач Календарь, Знач ОсновнойЦвет, Знач ДополнительныйЦвет, Знач Скрытый = Ложь) Экспорт +Функция ИзменитьКалендарьСписка(Знач Токен + , Знач Календарь + , Знач ОсновнойЦвет + , Знач ДополнительныйЦвет + , Знач Скрытый = Ложь) Экспорт Заголовки = ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true"; diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index c279dada7d..6b95d95afa 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -1600,7 +1600,6 @@ .Свойство(Summary).Равно(НаименованиеИзмененное) .Свойство(Description).Равно(Описание) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); - Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь); @@ -1618,7 +1617,6 @@ .Свойство("foregroundColor").Равно(Черный) .Свойство("backgroundColor").Равно(Желтый); - Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен); ЮТест.ОжидаетЧто(Результат).НеЗаполнено(); From d98fd2cd60ebd0d44c1ac59aaf047558eca1b0d6 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 22 Feb 2024 19:38:32 +0300 Subject: [PATCH 04/13] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B?= =?UTF-8?q?=20http=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D1=8F=20=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=D1=82=D0=B8=D1=8F=20Google=20Calendar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OPI_GoogleCalendar/Module.bsl | 131 +++++--- .../CommonModules/OPI_Инструменты/Module.bsl | 313 ++++++++++-------- OPI/src/CommonModules/YAX_Тесты/Module.bsl | 22 +- 3 files changed, 280 insertions(+), 186 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index 708ae3124d..5d0977c70a 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -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, Параметры, Заголовки, Истина); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl index 2502cce5f0..3a948e4876 100644 --- a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl +++ b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -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", , Истина, КодВозврата); - - УдалитьФайлы(ИмяСкрипта); - -КонецПроцедуры - #КонецОбласти #КонецОбласти @@ -208,56 +200,26 @@ Если Не ЗначениеЗаполнено(Параметры) Тогда Параметры = Новый Структура; КонецЕсли; + + Переадресация = 300; + Ошибка = 400; + ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded"); + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + УстановитьТелоЗапроса(Запрос, Параметры, JSON); - GZip = "gzip"; - ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded"); - СтруктураURL = РазбитьURL(URL); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Content-Type", ТипДанных); - Заголовки.Вставить("Accept-Encoding", GZip); - Заголовки.Вставить("Accept", "*/*"); - Заголовки.Вставить("Connection", "keep-alive"); - - Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда - - Для Каждого Заголовок Из ДопЗаголовки Цикл - Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); - КонецЦикла; - - КонецЕсли; - - Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL); - НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки); - - Если JSON Тогда - Данные = JSONСтрокой(Параметры); - Иначе - СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры); - Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - КонецЕсли; - - НовыйЗапрос.УстановитьТелоИзСтроки(Данные); - - Ответ = Соединение.ВызватьHTTPМетод(Вид, НовыйЗапрос); - - НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить( - "content-encoding") = GZip; - - Если НужнаРаспаковка Тогда - Ответ = РаспаковатьОтвет(Ответ); - КонецЕсли; - - Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ); - - Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда - - Попытка - Ответ = JsonВСтруктуру(Ответ); - Исключение - Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ); - КонецПопытки; - + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Если ЭтоПереадрисация Тогда + Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, JSON); + Иначе + ОбработатьОтвет(Ответ); КонецЕсли; Возврат Ответ; @@ -270,40 +232,28 @@ Параметры = Новый Структура; КонецЕсли; - Заголовки = Новый Соответствие; - - Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда - - Для Каждого Заголовок Из ДопЗаголовки Цикл - Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); - КонецЦикла; - - КонецЕсли; - - СтруктураURL = РазбитьURL(URL); - Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL); - Запрос = Новый HTTPЗапрос(СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры), Заголовки); - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - Переадресация = 300; - НеНайдено = 400; + Переадресация = 300; + Ошибка = 400; + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры); - Если Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < НеНайдено Тогда - Возврат ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки); + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки); + Соединение = СоздатьСоединение(Сервер); + + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Если ЭтоПереадрисация Тогда + Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки); + Иначе + ОбработатьОтвет(Ответ); КонецЕсли; - Попытка - ТелоОтвета = JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()); - Исключение - ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные(); - КонецПопытки; - - Возврат ТелоОтвета; + Возврат Ответ; КонецФункции -// BSLLS:CognitiveComplexity-off -// BSLLS:Typo-off - Функция ВыполнитьЗапросМультипарт(Знач URL , Знач Вид , Знач Параметры @@ -319,44 +269,128 @@ Файлы = Новый Соответствие; КонецЕсли; - ЗаменаТочки = "___"; - GZip = "gzip"; - Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); - СтруктураURL = РазбитьURL(URL); + Переадресация = 300; + Ошибка = 400; + Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); + РазделительСтрок = Символы.ВК + Символы.ПС; + ТипДанных = "multipart/form-data; boundary=" + Boundary; + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + ТелоЗапроса = Запрос.ПолучитьТелоКакПоток(); + ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь); + + ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры); + ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы); + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); + ЗаписьТекста.Закрыть(); + + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Если ЭтоПереадрисация Тогда + Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"] + , Вид + , Параметры + , Файлы + , ТипКонтента + , ДопЗаголовки); + Иначе + ОбработатьОтвет(Ответ); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") + Заголовки = Новый Соответствие; - Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary); - Заголовки.Вставить("Accept-Encoding", GZip); - Заголовки.Вставить("Accept", "*/*"); - Заголовки.Вставить("Connection", "keep-alive"); - + Заголовки.Вставить("Accept-Encoding", "gzip"); + Заголовки.Вставить("Accept" , "*/*"); + Заголовки.Вставить("Connection" , "keep-alive"); + + Если ЗначениеЗаполнено(ТипДанных) Тогда + Заголовки.Вставить("Content-Type", ТипДанных); + КонецЕсли; + Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда - + Для Каждого Заголовок Из ДопЗаголовки Цикл Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); КонецЦикла; - + КонецЕсли; + + НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки); - Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL); - НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки); - ТелоЗапроса = НовыйЗапрос.ПолучитьТелоКакПоток(); - ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь); + Возврат НовыйЗапрос; + +КонецФункции +Функция СоздатьСоединение(Знач Сервер) + Возврат Новый HTTPСоединение(Сервер, 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL); +КонецФункции + +Процедура ОбработатьОтвет(Ответ) + + GZip = "gzip"; + НужнаРаспаковка = + Ответ.Заголовки.Получить("Content-Encoding") = GZip + Или Ответ.Заголовки.Получить("content-encoding") = GZip; + + Если НужнаРаспаковка Тогда + Ответ = РаспаковатьОтвет(Ответ); + КонецЕсли; + + Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ); + + Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда + + Попытка + Ответ = JsonВСтруктуру(Ответ); + Исключение + Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ); + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON) + + Если JSON Тогда + Данные = JSONСтрокой(Параметры); + Иначе + СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры); + Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); + КонецЕсли; + + Запрос.УстановитьТелоИзСтроки(Данные); + +КонецПроцедуры + +Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры) + РазделительСтрок = Символы.ВК + Символы.ПС; - + Для Каждого Параметр Из Параметры Цикл - + Если Параметр.Значение = Неопределено Или Параметр.Значение = NULL Тогда - Продолжить; + Продолжить; КонецЕсли; - + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """"); ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - + Если ТипЗнч(Параметр.Значение) = Тип("Строка") Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда @@ -366,28 +400,37 @@ ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false")); + Иначе + ЗаписьТекста.Записать(Параметр.Значение); + КонецЕсли; - + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - + КонецЦикла; + +КонецПроцедуры - Счетчик = 0; +Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы) + + РазделительСтрок = Символы.ВК + Символы.ПС; + ЗаменаТочки = "___"; + Для Каждого Файл Из Файлы Цикл - + ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); - + Если ТипКонтента = "image/jpeg" Тогда ИмяФайлаОтправки = "photo"; Иначе ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1); ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ, - ЗаменаТочки, ".")); + ЗаменаТочки, ".")); КонецЕсли; - + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + ИмяФайлаОтправки @@ -400,32 +443,10 @@ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); ЗаписьТекста.Записать(Файл.Значение); ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - Счетчик = Счетчик + 1; - + КонецЦикла; - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); - - ЗаписьТекста.Закрыть(); - - Ответ = Соединение.ВызватьHTTPМетод(Вид, НовыйЗапрос); - - НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить( - "content-encoding") = GZip; - - Если НужнаРаспаковка Тогда - Ответ = РаспаковатьОтвет(Ответ); - КонецЕсли; - - Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные") - , JsonВСтруктуру(Ответ) - , JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные())); - -КонецФункции - -// BSLLS:Typo-on -// BSLLS:CognitiveComplexity-on +КонецПроцедуры #Область GZip diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index 6b95d95afa..809a90afa1 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -1240,6 +1240,7 @@ .ИмеетТип("Массив").Заполнено(); КонецПроцедуры + #КонецОбласти #Область YandexDisk @@ -1637,6 +1638,7 @@ Календарь = ПолучитьПараметр("Google_Календарь"); Наименование = "Новое событие"; Описание = "Описание тестового события"; + ОписаниеИзм = "Описание тестового события (изм.)"; ТипСоответствие = Тип("Соответствие"); ТипСтрока = Тип("Строка"); Summary = "summary"; @@ -1667,14 +1669,32 @@ .Свойство("description").Равно(Описание) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + СоответствиеСобытия.Вставить("Описание", ОписаниеИзм); + Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип(ТипСоответствие) + .Свойство(Summary).Равно(Наименование) + .Свойство("description").Равно(ОписаниеИзм) + .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + + Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие); ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(Наименование) - .Свойство("description").Равно(Описание) + .Свойство("description").Равно(ОписаниеИзм) .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип(ТипСоответствие) + .Свойство(Summary).Равно(Наименование) + .Свойство("description").Равно(ОписаниеИзм) + .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); ЮТест.ОжидаетЧто(Результат).НеЗаполнено(); From b33839bd470614539389361bd4b06945c6ac1cc1 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 22 Feb 2024 20:01:29 +0300 Subject: [PATCH 05/13] =?UTF-8?q?=D0=94=D0=B5=D1=84=D1=84=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D1=8B=20SC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OPI_GoogleCalendar/Module.bsl | 12 +++-- OPI/src/CommonModules/OPI_Twitter/Module.bsl | 14 +++-- OPI/src/CommonModules/OPI_VK/Module.bsl | 53 ++++++++++++------- .../CommonModules/OPI_YandexDisk/Module.bsl | 18 ++++--- 4 files changed, 63 insertions(+), 34 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index 5d0977c70a..e1827613b4 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -444,6 +444,8 @@ Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") + Items = "items"; + NPT = "nextPageToken"; Параметры = Новый Структура; Если ЗначениеЗаполнено(Страница) Тогда @@ -454,8 +456,8 @@ , , Заголовки); - Календари = Результат["items"]; - Страница = Результат["nextPageToken"]; + Календари = Результат[Items]; + Страница = Результат[NPT]; Для Каждого Календарь Из Календари Цикл МассивКалендарей.Добавить(Календарь); @@ -469,6 +471,8 @@ Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") + Items = "items"; + NPT = "nextPageToken"; Параметры = Новый Структура; Если ЗначениеЗаполнено(Страница) Тогда @@ -479,8 +483,8 @@ , , Заголовки); - События = Результат["items"]; - Страница = Результат["nextPageToken"]; + События = Результат[Items]; + Страница = Результат[NPT]; Для Каждого Событие Из События Цикл МассивСобытий.Добавить(Событие); diff --git a/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/OPI/src/CommonModules/OPI_Twitter/Module.bsl index 61da2b8de9..df3fc3fdc1 100644 --- a/OPI/src/CommonModules/OPI_Twitter/Module.bsl +++ b/OPI/src/CommonModules/OPI_Twitter/Module.bsl @@ -286,6 +286,7 @@ МассивМедиа = Новый Массив; Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + MIS = "media_id_string"; Если ЗначениеЗаполнено(МассивФайлов) Тогда @@ -301,7 +302,7 @@ ФайлОтправки = Новый ДвоичныеДанные(ФайлОтправки); КонецЕсли; - IDМедиа = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_)["media_id_string"]; + IDМедиа = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_)[MIS]; МассивМедиа.Добавить(IDМедиа); КонецЦикла; @@ -320,6 +321,9 @@ Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) + ProcessingInfo = "processing_info"; + MediaKey = "media_key"; + MIS = "media_id_string"; Command = "command"; ВидЗапроса = "POST"; Единица = 1024; @@ -362,8 +366,8 @@ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL); ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - KeyИнициализации = ОтветИнициализации["media_key"]; - IDИнициализации = ОтветИнициализации["media_id_string"]; + KeyИнициализации = ОтветИнициализации[MediaKey]; + IDИнициализации = ОтветИнициализации[MIS]; Счетчик = 0; Для Каждого Часть Из МассивЧтения Цикл @@ -390,7 +394,7 @@ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL); Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - СтатусОбработки = Ответ["processing_info"]["state"]; + СтатусОбработки = Ответ[ProcessingInfo]["state"]; Поля = Новый Структура; Поля.Вставить(Command , "STATUS"); @@ -400,7 +404,7 @@ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "GET", URL); Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация); - СтатусОбработки = Ответ["processing_info"]["state"]; + СтатусОбработки = Ответ[ProcessingInfo]["state"]; КонецЦикла; diff --git a/OPI/src/CommonModules/OPI_VK/Module.bsl b/OPI/src/CommonModules/OPI_VK/Module.bsl index a931436f6a..5e5f233f04 100644 --- a/OPI/src/CommonModules/OPI_VK/Module.bsl +++ b/OPI/src/CommonModules/OPI_VK/Module.bsl @@ -141,6 +141,8 @@ Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.getPhotoUploadServer", Параметры_); Response = "response"; + Hash = "hash"; + Photo = "photo"; URL = Ответ[Response]["upload_url"]; IDФото = ""; @@ -162,8 +164,8 @@ Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы); - Параметры_.Вставить("hash" , Ответ["hash"]); - Параметры_.Вставить("photo" , Ответ["photo"]); + Параметры_.Вставить(Hash , Ответ[Hash]); + Параметры_.Вставить(Photo , Ответ[Photo]); Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.savePhoto", Параметры_); IDФото = Ответ.Получить(Response)["id"]; @@ -543,13 +545,14 @@ // Строка - Сокращенный URL Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт + Response = "response"; Параметры_ = Новый Структура; Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_.Вставить("url", URL); Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_); - Возврат Ответ["response"]["short_url"]; + Возврат Ответ[Response]["short_url"]; КонецФункции @@ -597,6 +600,7 @@ МассивОтветов = Новый Массив; МассивНабора = Новый Массив; МаксимумПостов = 30; + Response = "response"; Для Каждого Пост Из МассивИДПостов Цикл @@ -608,7 +612,7 @@ Параметры_.Вставить("post_ids", СтрокаНомеров); Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); - МассивСтатистики = Статистика["response"]; + МассивСтатистики = Статистика[Response]; Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл МассивОтветов.Добавить(ЭлементСтатистики); @@ -624,7 +628,7 @@ Параметры_.Вставить("post_ids", СтрокаНомеров); Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); - МассивСтатистики = Статистика["response"]; + МассивСтатистики = Статистика[Response]; Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл МассивОтветов.Добавить(ЭлементСтатистики); @@ -795,13 +799,14 @@ // Соответствие Из Строка - Ключ - ID, Значение - Имя Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт + Response = "response"; Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); - Количество = Ответ["response"]["count"]; + Количество = Ответ[Response]["count"]; Параметры_.Вставить("count", Количество); Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); - Категории = Ответ["response"]["items"]; + Категории = Ответ[Response]["items"]; СоответствиеКатегорий = Новый Соответствие; @@ -1199,10 +1204,11 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт + Response = "response"; Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_); - Свойства = Ответ["response"]["items"]; + Свойства = Ответ[Response]["items"]; Возврат Свойства; @@ -1435,6 +1441,7 @@ Функция ЗагрузитьФотоНаСервер(Знач Картинка, Параметры, Знач Вид = "Пост") + Response = "response"; Файлы = Новый Соответствие; Метод = ОпределитьМетодЗагрузкиИзображений(Вид); URL = "api.vk.com/method/"; @@ -1454,7 +1461,7 @@ Файлы.Вставить(КлючКартинка, ЗначениеКартинка); Ответ = OPI_Инструменты.Get(Загрузка, Параметры); - URL = Ответ["response"]["upload_url"]; + URL = Ответ[Response]["upload_url"]; Параметры.Вставить("upload_url", URL); Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы); @@ -1532,7 +1539,8 @@ Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_.Вставить("v", "5.199"); - Подборка = OPI_Инструменты.ЧислоВСтроку(Подборка); + Response = "response"; + Подборка = OPI_Инструменты.ЧислоВСтроку(Подборка); ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_); @@ -1546,7 +1554,7 @@ Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); Если Не ЗначениеЗаполнено(ИДТовара) Тогда - ИДТовара = Ответ["response"]["market_item_id"]; + ИДТовара = Ответ[Response]["market_item_id"]; ИДТовара = OPI_Инструменты.ЧислоВСтроку(ИДТовара); КонецЕсли; @@ -1568,11 +1576,12 @@ Параметры_ = ПолучитьСтандартныеПараметры(Параметры); PhotoID = "photo_id"; + Response = "response"; Если ЗначениеЗаполнено(Картинка) Тогда Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Товар"); - ИДФото = Ответ["response"][PhotoID]; + ИДФото = Ответ[Response][PhotoID]; ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); Параметры_.Вставить(PhotoID, ИДФото); @@ -1582,7 +1591,7 @@ Если ЗначениеЗаполнено(ИДПодборки) Тогда Подборки = ПолучитьПодборкиПоИД(ИДПодборки, Параметры_); - Подборки = Подборки["response"]["items"]; + Подборки = Подборки[Response]["items"]; Если Не Подборки.Количество() = 0 Тогда ИДФото = Подборки[0]["photo"]["id"]; @@ -1622,6 +1631,7 @@ Hash = "hash"; Serv = "server"; Aid = "aid"; + Response = "response"; Фото = Метод["Фото"]; СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ[Serv]); @@ -1644,7 +1654,7 @@ Иначе - Параметры.Вставить("upload_results", Ответ["response"]["upload_result"]); + Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]); КонецЕсли; @@ -1652,13 +1662,14 @@ Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры) + Response = "response"; ОсновноеФото = ОписаниеТовара["ОсновноеФото"]; ДопФото = ОписаниеТовара["ДополнительныеФото"]; Свойства = ОписаниеТовара["ЗначенияСвойств"]; Если ЗначениеЗаполнено(ОсновноеФото) Тогда Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар"); - ИДФото = Ответ["response"]["photo_id"]; + ИДФото = Ответ[Response]["photo_id"]; ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); Параметры.Вставить("main_photo_id", ИДФото); КонецЕсли; @@ -1699,11 +1710,12 @@ Если МассивФото.Количество() > 0 Тогда СтрокаФотографий = ""; + Response = "response"; Для Каждого Фото Из МассивФото Цикл Ответ = ЗагрузитьФотоНаСервер(Фото, Параметры, "Товар"); - ИДФото = Ответ["response"]["photo_id"]; + ИДФото = Ответ[Response]["photo_id"]; ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); СтрокаФотографий = СтрокаФотографий + ИДФото + ","; @@ -1718,9 +1730,10 @@ Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0) + Response = "response"; МаксимумВЗапросе = 200; Ответ = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры); - Товары = Ответ["response"]["items"]; + Товары = Ответ[Response]["items"]; Если Товары.Количество() = 0 Тогда Возврат; @@ -1738,9 +1751,10 @@ Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0) + Response = "response"; МаксимумВЗапросе = 100; Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры); - Альбомы = Ответ["response"]["items"]; + Альбомы = Ответ[Response]["items"]; Если Альбомы.Количество() = 0 Тогда Возврат; @@ -1758,9 +1772,10 @@ Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0) + Response = "response"; МаксимумВЗапросе = 50; Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры); - Заказы = Ответ["response"]["items"]; + Заказы = Ответ[Response]["items"]; Если Заказы.Количество() = 0 Тогда Возврат; diff --git a/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl index 3fea979ff9..bbb6528449 100644 --- a/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl +++ b/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl @@ -54,6 +54,7 @@ Заголовки = ЗаголовокАвторизации(Токен); URL = "https://cloud-api.yandex.net/v1/disk/resources"; + Href = "href"; Параметры = Новый Структура; Параметры.Вставить("path", Путь); @@ -61,7 +62,7 @@ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); - URLОтвета = Ответ["href"]; + URLОтвета = Ответ[Href]; Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); Возврат Ответ; @@ -125,6 +126,7 @@ Заголовки = ЗаголовокАвторизации(Токен); URL = "https://cloud-api.yandex.net/v1/disk/resources/copy"; + Href = "href"; Параметры = Новый Структура; Параметры.Вставить("from" , Оригинал); @@ -134,7 +136,7 @@ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - URLОтвета = Ответ["href"]; + URLОтвета = Ответ[Href]; Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); Возврат Ответ; @@ -227,6 +229,7 @@ Заголовки = ЗаголовокАвторизации(Токен); URL = "https://cloud-api.yandex.net/v1/disk/resources/move"; + Href = "href"; Параметры = Новый Структура; Параметры.Вставить("from" , Оригинал); @@ -236,7 +239,7 @@ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - URLОтвета = Ответ["href"]; + URLОтвета = Ответ[Href]; Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); Возврат Ответ; @@ -256,6 +259,7 @@ Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт Заголовки = ЗаголовокАвторизации(Токен); + Href = "href"; Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда Файл = Новый ДвоичныеДанные(Файл); @@ -268,7 +272,7 @@ Параметры.Вставить("overwrite" , Перезаписывать); Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки); - URL = Ответ["href"]; + URL = Ответ[Href]; Ответ = OPI_Инструменты.PutMultipart(URL, , Файл, "multipart", Заголовки); Возврат Ответ; @@ -430,6 +434,7 @@ Заголовки = ЗаголовокАвторизации(Токен); Адрес = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk"; + Href = "href"; Параметры = Новый Структура; Параметры.Вставить("public_key", URL); @@ -445,7 +450,7 @@ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); Ответ = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь); - URLОтвета = Ответ["href"]; + URLОтвета = Ответ[Href]; Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); Возврат Ответ; @@ -471,6 +476,7 @@ Заголовки = ЗаголовокАвторизации(Токен); Назначение = ?(ОбщийДоступ, "publish", "unpublish"); + Href = "href"; URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение; @@ -480,7 +486,7 @@ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); - URLОтвета = Ответ["href"]; + URLОтвета = Ответ[Href]; Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); From 9ce09a1f76cbaf831d8d02693c0d0730b7110e21 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 22 Feb 2024 20:08:25 +0300 Subject: [PATCH 06/13] =?UTF-8?q?=D0=94=D0=B5=D1=84=D1=84=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D1=8B=20SC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommonModules/OPI_Инструменты/Module.bsl | 10 +++++---- OPI/src/CommonModules/YAX_Тесты/Module.bsl | 21 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl index 3a948e4876..a93042a42a 100644 --- a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl +++ b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -21,6 +21,7 @@ // SOFTWARE. // https://github.com/Bayselonarrend/OpenIntegrations +// BSLLS:Typo-off #Область СлужебныйПрограммныйИнтерфейс @@ -214,9 +215,9 @@ УстановитьТелоЗапроса(Запрос, Параметры, JSON); Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; - Если ЭтоПереадрисация Тогда + Если ЭтоПереадресация Тогда Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, JSON); Иначе ОбработатьОтвет(Ответ); @@ -291,9 +292,9 @@ ЗаписьТекста.Закрыть(); Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; - Если ЭтоПереадрисация Тогда + Если ЭтоПереадресация Тогда Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"] , Вид , Параметры @@ -653,6 +654,7 @@ КонецФункции // BSLLS:LatinAndCyrillicSymbolInWord-on +// BSLLS:Typo-on #КонецОбласти diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index 809a90afa1..2df3bbf87d 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -1642,6 +1642,8 @@ ТипСоответствие = Тип("Соответствие"); ТипСтрока = Тип("Строка"); Summary = "summary"; + Description = "description"; + UID = "id"; Час = 3600; Вложения = Новый Соответствие; @@ -1661,13 +1663,13 @@ СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия); - Событие = Результат["id"]; + Событие = Результат[UID]; ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(Наименование) - .Свойство("description").Равно(Описание) - .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + .Свойство(Description).Равно(Описание) + .Свойство(UID).ИмеетТип(ТипСтрока).Заполнено(); СоответствиеСобытия.Вставить("Описание", ОписаниеИзм); Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие); @@ -1675,25 +1677,24 @@ ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(Наименование) - .Свойство("description").Равно(ОписаниеИзм) - .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); - + .Свойство(Description).Равно(ОписаниеИзм) + .Свойство(UID).ИмеетТип(ТипСтрока).Заполнено(); Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие); ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(Наименование) - .Свойство("description").Равно(ОписаниеИзм) - .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + .Свойство(Description).Равно(ОписаниеИзм) + .Свойство(UID).ИмеетТип(ТипСтрока).Заполнено(); Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие); ЮТест.ОжидаетЧто(Результат) .ИмеетТип(ТипСоответствие) .Свойство(Summary).Равно(Наименование) - .Свойство("description").Равно(ОписаниеИзм) - .Свойство("id").ИмеетТип(ТипСтрока).Заполнено(); + .Свойство(Description).Равно(ОписаниеИзм) + .Свойство(UID).ИмеетТип(ТипСтрока).Заполнено(); Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); From 597e5192845f82aa5c04cefe3c1b36f74a4dc660 Mon Sep 17 00:00:00 2001 From: Anton Titovets <105596284+Bayselonarrend@users.noreply.github.com> Date: Thu, 22 Feb 2024 22:23:27 +0300 Subject: [PATCH 07/13] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 29c3c6afbd..6e50e30a07 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Anton Tsitavets +Copyright (c) 2023 Anton Tsitavets Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 53edf951705d62b4eb99a5219a0bc0090c756f60 Mon Sep 17 00:00:00 2001 From: Anton Date: Fri, 23 Feb 2024 18:38:07 +0300 Subject: [PATCH 08/13] =?UTF-8?q?=D0=9D=D0=B5=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=BB=D0=BE=D1=87=D0=B5=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=B8?= =?UTF-8?q?=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D1=81=20=D0=98=D0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OPI_GoogleCalendar/Module.bsl | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index e1827613b4..402dafb149 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -250,11 +250,11 @@ // Получить описание события. // // Возвращаемое значение: -// Соответствие Из КлючИЗначение - Пустой макет события +// Соответствие Из КлючИЗначение - Пустой макет события Функция ПолучитьОписаниеСобытия() Экспорт - Час = 3600; - Событие = Новый Соответствие; + Час = 3600; + Событие = Новый Соответствие; Событие.Вставить("Описание" , ""); // Описание события Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события @@ -442,6 +442,45 @@ КонецФункции +Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "") + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Существующее = ЗначениеЗаполнено(Событие); + 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, Параметры, Заголовки, Истина); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") Items = "items"; @@ -496,43 +535,4 @@ КонецПроцедуры -Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "") - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Существующее = ЗначениеЗаполнено(Событие); - 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, Параметры, Заголовки, Истина); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - #КонецОбласти \ No newline at end of file From 68c65897c7932637fd0870af0e296d1fecf090cc Mon Sep 17 00:00:00 2001 From: Anton Titovets <105596284+Bayselonarrend@users.noreply.github.com> Date: Fri, 23 Feb 2024 22:42:31 +0300 Subject: [PATCH 09/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68477fc0eb..7ecb90f380 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@
-Проект состоит из общих модулей, каждый из которых отвечает за свой API, а также нескольких модулей-инструментов, общих для всех. Реализованные методы выполняют конечные задачи (вроде ОтправитьСообщение() или СоздатьПост()), что позволяет использовать их без углубления в реализацию. Однако, код, при этом, достаточно сильно декомпозирован - методы авторизации, получения данных и пр. по возможности вынесены в отдельные функции. Это позволяет легко добавлять новые методы, даже если они еще не реализованы в самой библиотеке на текущий момент.

+Проект состоит из общих модулей, каждый из которых отвечает за свой API, а также нескольких модулей-инструментов, общих для всех. Реализованные методы выполняют конечные задачи (вроде ОтправитьСообщение() или СоздатьПост()), что позволяет использовать их без углубления в реализацию. Однако, код, при этом, достаточно сильно декомпозирован - методы авторизации, получения данных и пр. по возможности вынесены в отдельные функции. Это позволяет легко добавлять новые методы, даже если они еще не реализованы в самой библиотеке на текущий момент.

На данный момент реализованы методы для работы со следующими API:
From 4b02d88576564d3e6ada9737cf08d768462b5f15 Mon Sep 17 00:00:00 2001 From: Anton Date: Sat, 24 Feb 2024 20:52:02 +0300 Subject: [PATCH 10/13] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20Google=20Calendar:=20?= =?UTF-8?q?=D0=A1=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Rabota-s-sobytiyami/Izmenit-sobytie.md | 78 +++++++++++++++++++ .../Rabota-s-sobytiyami/Peremestit-sobytie.md | 75 ++++++++++++++++++ .../Rabota-s-sobytiyami/Udalit-sobytie.md | 29 +++++++ 3 files changed, 182 insertions(+) create mode 100644 docs/docs/Google_Calendar/Rabota-s-sobytiyami/Izmenit-sobytie.md create mode 100644 docs/docs/Google_Calendar/Rabota-s-sobytiyami/Peremestit-sobytie.md create mode 100644 docs/docs/Google_Calendar/Rabota-s-sobytiyami/Udalit-sobytie.md diff --git a/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Izmenit-sobytie.md b/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Izmenit-sobytie.md new file mode 100644 index 0000000000..99bdd85567 --- /dev/null +++ b/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Izmenit-sobytie.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 6 +--- + +# Изменить событие +Обновляет описание события + +*Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт* + + | Параметр | Тип | Назначение | + |-|-|-| + | Токен | Строка | Токен доступа | + | Календарь | Строка | ID календаря| + | ОписаниеТовара | Соответствие | Описание создаваемого события. См. [ПолучитьОписаниеТовара](./Poluchit-opisanye-sobytiya) | + | Событие | Строка | ID события для изменения | + + Вовзращаемое значение: Соответствие - сериализованный JSON ответа от VK + +```bsl title="Пример кода" + + СоответствиеСобытия = Новый Соответствие; + СоответствиеСобытия.Вставить("Описание", "Описание тестового события (изм.)"); + + Ответ = OPI_GoogleCalendar.ИзменитьСобытие(Токен, "55868c32be16935f0...", СоответствиеСобытия, "j4nonfcc0m2..."); + Ответ = OPI_Инструменты.JSONСтрокой(Ответ); + +``` + +```json title="Результат" + +{ + "eventType": "default", + "attachments": [ + { + "iconLink": "", + "title": "Картинка2", + "fileUrl": "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1" + }, + { + "iconLink": "", + "title": "Картинка1", + "fileUrl": "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png" + } + ], + "reminders": { + "useDefault": true + }, + "sequence": 0, + "start": { + "timeZone": "Europe/Minsk", + "dateTime": "2024-02-24T16:42:28+03:00" + }, + "creator": { + "self": true, + "email": "bayselonarrend@gmail.com" + }, + "end": { + "timeZone": "Europe/Minsk", + "dateTime": "2024-02-24T17:42:28+03:00" + }, + "iCalUID": "7c2s6g3k6ib1mr2v1b7lnt9kfk@google.com", + "description": "Описание тестового события (изм.)", + "updated": "2024-02-24T10:42:42.401Z", + "created": "2024-02-24T10:42:32.000Z", + "htmlLink": "https://www.google.com/calendar/event?eid=N2MyczZnM2s2aWIxbXIydjFiN2xudDlrZmsgYmF5c2Vsb25hcnJlbmRAbQ", + "location": "В офисе", + "summary": "Новое событие", + "organizer": { + "self": true, + "email": "bayselonarrend@gmail.com" + }, + "status": "confirmed", + "id": "7c2s6g3k6ib1mr2v1b7lnt9kfk", + "etag": "\"3417542724802000\"", + "kind": "calendar#event" +} + +``` diff --git a/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Peremestit-sobytie.md b/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Peremestit-sobytie.md new file mode 100644 index 0000000000..19646c49fc --- /dev/null +++ b/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Peremestit-sobytie.md @@ -0,0 +1,75 @@ +--- +sidebar_position: 5 +--- + +# Переместить событие +Перемещает событие из одного календаря в другой + +*Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт* + + | Параметр | Тип | Назначение | + |-|-|-| + | Токен | Строка | Токен доступа | + | КалендарьИсточник | Строка | ID календаря-источника | + | КалендарьПриемник | Строка | ID календаря-приемника | + | Событие | Строка | ID события для перемещения | + + Вовзращаемое значение: Соответствие - сериализованный JSON ответа от Google + +```bsl title="Пример кода" + + Ответ = OPI_GoogleCalendar.ПереместитьСобытие(Токен, "bayselonarrend@gmail.com", "55868c32be16935f0...", "j4nonfcc0m2..."); //Соответствие + Ответ = OPI_Инструменты.JSONСтрокой(Ответ); //Строка + +``` + +```json title="Результат" + +{ + "eventType": "default", + "attachments": [ + { + "iconLink": "", + "title": "Картинка2", + "fileUrl": "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1" + }, + { + "iconLink": "", + "title": "Картинка1", + "fileUrl": "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png" + } + ], + "reminders": { + "useDefault": true + }, + "sequence": 0, + "start": { + "timeZone": "Europe/Minsk", + "dateTime": "2024-02-24T16:20:49+03:00" + }, + "creator": { + "self": true, + "email": "bayselonarrend@gmail.com" + }, + "end": { + "timeZone": "Europe/Minsk", + "dateTime": "2024-02-24T17:20:49+03:00" + }, + "iCalUID": "f9kkj2omsqtt67g12qh2jig8uk@google.com", + "description": "Описание тестового события", + "updated": "2024-02-24T10:20:51.234Z", + "created": "2024-02-24T10:20:49.000Z", + "htmlLink": "https://www.google.com/calendar/event?eid=Zjlra2oyb21zcXR0NjdnMTJxaDJqaWc4dWsgYmF5c2Vsb25hcnJlbmRAbQ", + "location": "В офисе", + "summary": "Новое событие", + "organizer": { + "self": true, + "email": "bayselonarrend@gmail.com" + }, + "status": "confirmed", + "id": "f9kkj2omsqtt67g12qh2jig8uk", + "etag": "\"3417540102468000\"", + "kind": "calendar#event" +} + +``` diff --git a/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Udalit-sobytie.md b/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Udalit-sobytie.md new file mode 100644 index 0000000000..0d34277d32 --- /dev/null +++ b/docs/docs/Google_Calendar/Rabota-s-sobytiyami/Udalit-sobytie.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 7 +--- + +# Удалить событие +Удаляет событие по ID + +*Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт* + + | Параметр | Тип | Назначение | + |-|-|-| + | Токен | Строка | Токен доступа | + | Календарь | Строка | ID календаря | + | Событие | Строка | ID события | + + Вовзращаемое значение: Пустая строка + +```bsl title="Пример кода" + + Ответ = OPI_GoogleCalendar.УдалитьСобытие(Токен, "55868c32be16935f0...", "j4nonfcc0m2..."); //Соответствие + Ответ = OPI_Инструменты.JSONСтрокой(Ответ); //Строка + +``` + +```json title="Результат" + +"" + +``` From ddbe4cf02d9a13bef0259a5318acb4ae3a316db3 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 25 Feb 2024 00:10:49 +0300 Subject: [PATCH 11/13] =?UTF-8?q?Google=20Calendar:=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BF=D0=BE=20=D1=87=D0=B0=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=BC=20=D0=BF=D0=BE=D1=8F=D1=81=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OPI_GoogleCalendar/Module.bsl | 33 ++++++++++++----- .../CommonModules/OPI_Инструменты/Module.bsl | 35 +++++++++++++++++++ 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index 402dafb149..eef89c8643 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -31,6 +31,7 @@ // Параметры: // Токен - Строка - Токен // Наименование - Строка - Наименование создаваемого календаря +// ЧасовойПояс - Строка - Часовой пояс в формате IANA // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google @@ -40,7 +41,8 @@ URL = "https://www.googleapis.com/calendar/v3/calendars"; Параметры = Новый Структура; - Параметры.Вставить("summary", Наименование); + Параметры.Вставить("summary" , Наименование); + Параметры.Вставить("timeZone", ЧасовойПояс()); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); @@ -73,10 +75,14 @@ // Календарь - Строка - ID календаря // Наименование - Строка - Новое наименование // Описание - Строка - Новое описание календаря +// ЧасовойПояс - Строка - Часовой пояс в формате IANA // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google -Функция ИзменитьМетаданныеКалендаря(Знач Токен, Знач Календарь, Знач Наименование = "", Знач Описание = "") Экспорт +Функция ИзменитьМетаданныеКалендаря(Знач Токен + , Знач Календарь + , Знач Наименование = "" + , Знач Описание = "") Экспорт Заголовки = ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; @@ -90,8 +96,8 @@ Если ЗначениеЗаполнено(Описание) Тогда Параметры.Вставить("description", Описание); КонецЕсли; - - Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); Возврат Ответ; @@ -405,6 +411,10 @@ СтруктураДаты = Новый Структура; + Если Не ТипЗнч(Дата) = Тип("Дата") Тогда + Возврат Неопределено; + КонецЕсли; + Если Дата = НачалоДня(Дата) Тогда ФорматДаты = "ДФ=yyyy-MM-dd"; Поле = "date"; @@ -414,7 +424,8 @@ КонецЕсли; Дата = Формат(Дата, ФорматДаты); - СтруктураДаты.Вставить(Поле, Дата); + СтруктураДаты.Вставить(Поле , Дата); + СтруктураДаты.Вставить("timeZone", ЧасовойПояс()); Возврат СтруктураДаты; @@ -438,7 +449,11 @@ КонецЕсли; - Возврат МассивВложений; + Если МассивВложений.Количество() > 0 Тогда + Возврат МассивВложений; + Иначе + Возврат Неопределено; + КонецЕсли; КонецФункции @@ -455,7 +470,7 @@ Дата1 = ОписаниеСобытия["ДатаОкончания"]; Вложения = ОписаниеСобытия["МассивURLФайловВложений"]; Вложения = ПреобразоватьВложения(Вложения); - Уведомления = ОписаниеСобытия["ОтправлятьУведомления"]; + Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено, Ложь, ОписаниеСобытия["ОтправлятьУведомления"]); Параметры = Новый Структура; Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]); @@ -467,10 +482,12 @@ ПараметрыURL = Новый Структура; ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none")); - ПараметрыURL.Вставить("supportsAttachments" , ?(Вложения.Количество() > 0, "true", "false")); + ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false")); URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); + Если Существующее Тогда Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); Иначе diff --git a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl index a93042a42a..7d17e7cf72 100644 --- a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl +++ b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -119,6 +119,41 @@ КонецПроцедуры +Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт + + ТипКоллекции = ТипЗнч(Коллекция); + ВыходнаяКоллекция = Новый(ТипКоллекции); + + Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда + ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + КонецЕсли; + + КонецЦикла; + + ИначеЕсли ТипКоллекции = Тип("Массив") Тогда + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда + ВыходнаяКоллекция.Добавить(ЭлементКоллекции); + КонецЕсли; + + КонецЦикла; + + Иначе + + ВыходнаяКоллекция = Коллекция; + + КонецЕсли; + + Коллекция = ВыходнаяКоллекция; + +КонецПроцедуры + #КонецОбласти #Область Служебные From 778f4e86623000a810743096aa202ff7ff527f16 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 25 Feb 2024 11:18:31 +0300 Subject: [PATCH 12/13] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=20Calendar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl | 2 -- 1 file changed, 2 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index eef89c8643..7480e33c66 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -31,7 +31,6 @@ // Параметры: // Токен - Строка - Токен // Наименование - Строка - Наименование создаваемого календаря -// ЧасовойПояс - Строка - Часовой пояс в формате IANA // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google @@ -75,7 +74,6 @@ // Календарь - Строка - ID календаря // Наименование - Строка - Новое наименование // Описание - Строка - Новое описание календаря -// ЧасовойПояс - Строка - Часовой пояс в формате IANA // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google From 46d4a476e26b152cba7295708f9dd5b0c0b6d7ed Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 25 Feb 2024 12:54:31 +0300 Subject: [PATCH 13/13] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=9A?= =?UTF-8?q?=D0=B0=D0=BB=D0=B5=D0=BD=D0=B4=D0=B0=D1=80=D1=8C,=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=D0=BC=20=D0=B8=20VK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OPI_GoogleCalendar/Module.bsl | 4 +- .../OPI_GoogleWorkspace/Module.bsl | 1 + OPI/src/CommonModules/OPI_VK/Module.bsl | 4 +- .../CommonModules/OPI_Инструменты/Module.bsl | 40 ++++++++++++------- OPI/src/CommonModules/YAX_Тесты/Module.bsl | 4 +- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl index 7480e33c66..a14289f848 100644 --- a/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -468,7 +468,9 @@ Дата1 = ОписаниеСобытия["ДатаОкончания"]; Вложения = ОписаниеСобытия["МассивURLФайловВложений"]; Вложения = ПреобразоватьВложения(Вложения); - Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено, Ложь, ОписаниеСобытия["ОтправлятьУведомления"]); + Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено + , Ложь + , ОписаниеСобытия["ОтправлятьУведомления"]); Параметры = Новый Структура; Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]); diff --git a/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl b/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl index 2c7b095684..9e1747f869 100644 --- a/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl @@ -111,4 +111,5 @@ Возврат СтрСоединить(МассивРазрешений, " "); КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/OPI/src/CommonModules/OPI_VK/Module.bsl b/OPI/src/CommonModules/OPI_VK/Module.bsl index 5e5f233f04..fcaac5d227 100644 --- a/OPI/src/CommonModules/OPI_VK/Module.bsl +++ b/OPI/src/CommonModules/OPI_VK/Module.bsl @@ -1621,7 +1621,8 @@ КонецФункции Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры) - + + Response = "response"; Способ = Метод["Способ"]; СтандартныйСпособ = 1; НовыйСпособ = 2; @@ -1631,7 +1632,6 @@ Hash = "hash"; Serv = "server"; Aid = "aid"; - Response = "response"; Фото = Метод["Фото"]; СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ[Serv]); diff --git a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl index 7d17e7cf72..6a73e0761a 100644 --- a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl +++ b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -126,23 +126,11 @@ Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда - Для Каждого ЭлементКоллекции Из Коллекция Цикл - - Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда - ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); - КонецЕсли; - - КонецЦикла; + УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция); ИначеЕсли ТипКоллекции = Тип("Массив") Тогда - Для Каждого ЭлементКоллекции Из Коллекция Цикл - - Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда - ВыходнаяКоллекция.Добавить(ЭлементКоллекции); - КонецЕсли; - - КонецЦикла; + УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция); Иначе @@ -484,6 +472,30 @@ КонецПроцедуры +Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция) + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда + ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция) + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда + ВыходнаяКоллекция.Добавить(ЭлементКоллекции); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + #Область GZip // Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index 2df3bbf87d..56e8353fbd 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -1670,8 +1670,10 @@ .Свойство(Summary).Равно(Наименование) .Свойство(Description).Равно(Описание) .Свойство(UID).ИмеетТип(ТипСтрока).Заполнено(); - + + СоответствиеСобытия = Новый Соответствие; СоответствиеСобытия.Вставить("Описание", ОписаниеИзм); + Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие); ЮТест.ОжидаетЧто(Результат)