1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-12 11:15:07 +02:00
OpenIntegrations/OInt/core/Modules/OPI_GoogleCalendar.os
2024-03-14 20:08:51 +00:00

554 lines
27 KiB
Plaintext

// MIT License
// 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
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область РаботаСМетаданнымиКалендарей
// Создать календарь.
//
// Параметры:
// Токен - Строка - Токен
// Наименование - Строка - Наименование создаваемого календаря
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google
Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars";
Параметры = Новый Структура;
Параметры.Вставить("summary" , Наименование);
Параметры.Вставить("timeZone", "Europe/Moscow");
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить календарь.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google
Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить календарь.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// Наименование - Строка - Новое наименование
// Описание - Строка - Новое описание календаря
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google
Функция ИзменитьМетаданныеКалендаря(Знач Токен
, Знач Календарь
, Знач Наименование = ""
, Знач Описание = "") Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
Параметры = Новый Структура;
Если ЗначениеЗаполнено(Наименование) Тогда
Параметры.Вставить("summary", Наименование);
КонецЕсли;
Если ЗначениеЗаполнено(Описание) Тогда
Параметры.Вставить("description", Описание);
КонецЕсли;
Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
Возврат Ответ;
КонецФункции
// Очистить основной календарь.
//
// Параметры:
// Токен - Строка - Токен
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear";
Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь);
Возврат Ответ;
КонецФункции
// Удалить календарь.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google
Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСоСпискомКалендарей
// Получить список календарей.
//
// Параметры:
// Токен - Строка - Токен
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий данных календарей
Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
МассивКалендарей = Новый Массив;
ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей);
Возврат МассивКалендарей;
КонецФункции
// Добавить календарь в список.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google
Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
Параметры = Новый Структура;
Параметры.Вставить("id", Календарь);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить календарь списка.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Удалить календарь из списка.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить календарь списка.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff)
// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff)
// Скрытый - Булево - Скрытый календарь
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция ИзменитьКалендарьСписка(Знач Токен
, Знач Календарь
, Знач ОсновнойЦвет
, Знач ДополнительныйЦвет
, Знач Скрытый = Ложь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true";
Параметры = Новый Соответствие;
Параметры.Вставить("hidden" , Скрытый);
Параметры.Вставить("foregroundColor", ОсновнойЦвет);
Параметры.Вставить("backgroundColor", ДополнительныйЦвет);
Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаССобытиями
// Получить описание события.
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Пустой макет события
Функция ПолучитьОписаниеСобытия() Экспорт
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
Час = 3600;
Событие = Новый Соответствие;
Событие.Вставить("Описание" , ""); // Описание события
Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события
Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения
Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события
Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события
Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу
Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам
Возврат Событие;
КонецФункции
// Получить список событий.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий событий
Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
МассивСобытий = Новый Массив;
ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий);
Возврат МассивСобытий;
КонецФункции
// Получить событие.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// Событие - Строка - ID события
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ Календарь
+ "/events/"
+ Событие;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Создать событие.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события. См. ПолучитьОписаниеСобытия
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт
Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия);
КонецФункции
// Переместить событие.
//
// Параметры:
// Токен - Строка - Токен
// КалендарьИсточник - Строка - ID календаря источника
// КалендарьПриемник - Строка - ID календаря приемника
// Событие - Строка - ID события календаря источника
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ КалендарьИсточник
+ "/events/"
+ Событие
+ "/move?destination="
+ КалендарьПриемник;
Ответ = OPI_Инструменты.Post(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить событие.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// ОписаниеСобытия - Строка - Новое описание события
// Событие - Строка - ID события
//
// Возвращаемое значение:
// HTTPОтвет - Изменить событие
Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт
Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие);
КонецФункции
// Удалить событие.
//
// Параметры:
// Токен - Строка - Токен
// Календарь - Строка - ID календаря
// Событие - Строка - ID события
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ Календарь
+ "/events/"
+ Событие;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПреобразоватьДату(Знач Дата)
СтруктураДаты = Новый Структура;
Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
Возврат Неопределено;
КонецЕсли;
Если Дата = НачалоДня(Дата) Тогда
ФорматДаты = "ДФ=yyyy-MM-dd";
Поле = "date";
Иначе
ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ";
Поле = "dateTime";
КонецЕсли;
Дата = Формат(Дата, ФорматДаты);
СтруктураДаты.Вставить(Поле , Дата);
СтруктураДаты.Вставить("timeZone", "Europe/Moscow");
Возврат СтруктураДаты;
КонецФункции
Функция ПреобразоватьВложения(Знач Вложения)
МассивВложений = Новый Массив;
Если ТипЗнч(Вложения) = Тип("Соответствие") Тогда
Для Каждого Вложение Из Вложения Цикл
ТекущеВложение = Новый Структура;
ТекущеВложение.Вставить("title" , Вложение.Ключ);
ТекущеВложение.Вставить("fileUrl", Вложение.Значение);
МассивВложений.Добавить(ТекущеВложение);
КонецЦикла;
КонецЕсли;
Если МассивВложений.Количество() > 0 Тогда
Возврат МассивВложений;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "")
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
Существующее = ЗначениеЗаполнено(Событие);
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" , ?(ЗначениеЗаполнено(Вложения), "true", "false"));
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
Если Существующее Тогда
Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
Иначе
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина);
КонецЕсли;
Возврат Ответ;
КонецФункции
Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "")
Items = "items";
NPT = "nextPageToken";
Параметры = Новый Структура;
Если ЗначениеЗаполнено(Страница) Тогда
Параметры.Вставить("pageToken", Страница);
КонецЕсли;
Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList"
, Параметры
, Заголовки);
Календари = Результат[Items];
Страница = Результат[NPT];
Для Каждого Календарь Из Календари Цикл
МассивКалендарей.Добавить(Календарь);
КонецЦикла;
Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "")
Items = "items";
NPT = "nextPageToken";
Параметры = Новый Структура;
Если ЗначениеЗаполнено(Страница) Тогда
Параметры.Вставить("pageToken", Страница);
КонецЕсли;
Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events"
, Параметры
, Заголовки);
События = Результат[Items];
Страница = Результат[NPT];
Для Каждого Событие Из События Цикл
МассивСобытий.Добавить(Событие);
КонецЦикла;
Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница);
КонецЕсли;
КонецПроцедуры
#КонецОбласти