1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-29 02:57:35 +02:00
OpenIntegrations/OInt/core/Modules/OPI_GoogleCalendar.os
Anton 1a6dd86410 Большие доработки по workflow
Теперь не номер версии нужно менять только в 1С - в остальных местах поменяется сам; не нужно больше определять список модулей в Convert и список библиотек в CLI parse - в конверт подтянется из комментария в bsl, а в CLIP - из OS (как уже делается в доках)
2024-05-12 17:00:02 +03:00

632 lines
33 KiB
Plaintext

// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os
// Библиотека: Google Calendar
// Команда CLI: gcalendar
// 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"
#Область ПрограммныйИнтерфейс
#Область РаботаСМетаданнымиКалендарей
// Создать календарь
// Создает пустой календарь
//
// Параметры:
// Токен - Строка - Токен - token
// Наименование - Строка - Наименование создаваемого календаря - title
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars";
Параметры = Новый Структура;
Параметры.Вставить("summary" , Наименование);
Параметры.Вставить("timeZone", "Europe/Moscow");
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить календарь
// Получает информацию о календаре по ID
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить календарь
// Изменяет свойства существуещего календаря
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
// Наименование - Строка - Новое наименование - title
// Описание - Строка - Новое описание календаря - description
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ИзменитьМетаданныеКалендаря(Знач Токен
, Знач Календарь
, Знач Наименование = ""
, Знач Описание = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
Параметры = Новый Структура;
Если ЗначениеЗаполнено(Наименование) Тогда
Параметры.Вставить("summary", Наименование);
КонецЕсли;
Если ЗначениеЗаполнено(Описание) Тогда
Параметры.Вставить("description", Описание);
КонецЕсли;
Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
Возврат Ответ;
КонецФункции
// Очистить основной календарь
// Очищает список событий основного календаря
//
// Параметры:
// Токен - Строка - Токен - token
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear";
Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь);
Возврат Ответ;
КонецФункции
// Удалить календарь
// Удаляет календарь по ID
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСоСпискомКалендарей
// Получить список календарей
// Получает массив календарей аккаунта
//
// Параметры:
// Токен - Строка - Токен - token
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий данных календарей
Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
МассивКалендарей = Новый Массив;
ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей);
Возврат МассивКалендарей;
КонецФункции
// Добавить календарь в список
// Добавляет существующий календарь в список пользователя
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
Параметры = Новый Структура;
Параметры.Вставить("id", Календарь);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить календарь списка
// Получает календарь из списка пользователя по ID
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Удалить календарь из списка
// Удаляет календарь из списка пользователя
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить календарь списка
// Изменяет свойства календаря из списка пользователей
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary
// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary
// Скрытый - Булево - Скрытый календарь - hidden
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ИзменитьКалендарьСписка(Знач Токен
, Знач Календарь
, Знач ОсновнойЦвет
, Знач ДополнительныйЦвет
, Знач Скрытый = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет);
OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true";
Параметры = Новый Соответствие;
Параметры.Вставить("hidden" , Скрытый);
Параметры.Вставить("foregroundColor", ОсновнойЦвет);
Параметры.Вставить("backgroundColor", ДополнительныйЦвет);
Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаССобытиями
// Получить описание события !NOCLI
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Пустой макет события
Функция ПолучитьОписаниеСобытия() Экспорт
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
Час = 3600;
Событие = Новый Соответствие;
Событие.Вставить("Описание" , ""); // Описание события
Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события
Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения
Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события
Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события
Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу
Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам
Возврат Событие;
КонецФункции
// Получить список событий
// Получает список всех событий календаря
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий событий
Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
МассивСобытий = Новый Массив;
ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий);
Возврат МассивСобытий;
КонецФункции
// Получить событие
// Получает событие по ID
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
// Событие - Строка - ID события - event
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ Календарь
+ "/events/"
+ Событие;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Создать событие
// Создает новое событие
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props
//
// Возвращаемое значение:
// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт
Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия);
КонецФункции
// Переместить событие
// Перемещает событие в другой календарь
//
// Параметры:
// Токен - Строка - Токен - token
// КалендарьИсточник - Строка - ID календаря источника - from
// КалендарьПриемник - Строка - ID календаря приемника - to
// Событие - Строка - ID события календаря источника - event
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник);
OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ КалендарьИсточник
+ "/events/"
+ Событие
+ "/move?destination="
+ КалендарьПриемник;
Ответ = OPI_Инструменты.Post(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить событие
// Изменяет существующее событие
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
// ОписаниеСобытия - Строка - Новое описание события - props
// Событие - Строка - ID события - event
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт
Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие);
КонецФункции
// Удалить событие
// Удаляет событие по ID
//
// Параметры:
// Токен - Строка - Токен - token
// Календарь - Строка - ID календаря - calendar
// Событие - Строка - ID события - event
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ Календарь
+ "/events/"
+ Событие;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПреобразоватьДату(Знач Дата)
OPI_ПреобразованиеТипов.ПолучитьДату(Дата);
СтруктураДаты = Новый Структура;
Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
Возврат Неопределено;
КонецЕсли;
Если Дата = НачалоДня(Дата) Тогда
ФорматДаты = "ДФ=yyyy-MM-dd";
Поле = "date";
Иначе
ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ";
Поле = "dateTime";
КонецЕсли;
Дата = Формат(Дата, ФорматДаты);
СтруктураДаты.Вставить(Поле , Дата);
СтруктураДаты.Вставить("timeZone", "Europe/Moscow");
Возврат СтруктураДаты;
КонецФункции
Функция ПреобразоватьВложения(Знач Вложения)
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения);
МассивВложений = Новый Массив;
Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда
Для Каждого Вложение Из Вложения Цикл
ТекущеВложение = Новый Структура;
ТекущеВложение.Вставить("title" , Вложение.Ключ);
ТекущеВложение.Вставить("fileUrl", Вложение.Значение);
МассивВложений.Добавить(ТекущеВложение);
КонецЦикла;
КонецЕсли;
Если МассивВложений.Количество() > 0 Тогда
Возврат МассивВложений;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "")
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия);
Заголовки = 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 И ЗначениеЗаполнено(Страница) Тогда
ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница);
КонецЕсли;
КонецПроцедуры
#КонецОбласти