1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-03-29 21:57:16 +02:00

Notion API: Определение типов, создание страницы в базу, данные базы

This commit is contained in:
Anton 2024-01-21 21:08:56 +03:00
parent be9502c2c6
commit cba8742efa
2 changed files with 360 additions and 69 deletions

View File

@ -1,3 +1,27 @@
// MIT License
// Copyright (c) 2024 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
#Область ПрограммныйИнтерфейс
#Область РаботаСоСтраницами
@ -33,20 +57,18 @@
// Параметры:
// Токен - Строка - Токен
// Родитель - Строка - ID родительской базы
// Свойства - Структура Из Строка - Структура/Соответствие свойств. Должен соответствовать шаблону свойств базы
// Свойства - Соответствие - Соответствие свойств. Должен соответствовать шаблону свойств базы
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - Создать страницу в базу
Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Свойства) Экспорт
ДанныеБазы = ПолучитьБазуДанных(Токен, Родитель);
Заголовки = СоздатьЗаголовкиЗапроса(Токен);
Свойства = Новый Структура;
Параметры = Новый Структура;
ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры);
Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт
Заголовки = СоздатьЗаголовкиЗапроса(Токен);
Параметры = Новый Структура;
ДобавитьРодителяСтраницы(Родитель, Истина, Параметры);
Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен);
Параметры.Вставить("properties", Свойства);
Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
@ -74,6 +96,50 @@
КонецФункции
Функция ИзменитьСвойстваСтраницы(Знач Токен, Знач Страница, Знач Данные = "", Знач Иконка = "", Знач Обложка = "", Знач Архивирована = Ложь) Экспорт
Заголовки = СоздатьЗаголовкиЗапроса(Токен);
Параметры = Новый Структура;
Если ЗначениеЗаполнено(Данные) И ТипЗнч(Данные) = Тип("Соответствие") Тогда
Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь);
Иначе
Свойства = Новый Соответствие;
КонецЕсли;
Если ЗначениеЗаполнено(Иконка) Тогда
СоответствиеИконки = Новый Соответствие;
СоответствиеИконки.Вставить("Icon", Иконка);
ОбъектИконка = ПреобразоватьЗначениеПоТипу("files", СоответствиеИконки);
ОбъектИконка = ОбъектИконка["files"][0];
ОбъектИконка.Удалить("name");
Параметры.Вставить("icon", ОбъектИконка);
КонецЕсли;
Если ЗначениеЗаполнено(Обложка) Тогда
СоответствиеОбложки = Новый Соответствие;
СоответствиеОбложки.Вставить("Cover", Обложка);
ОбъектОбложка = ПреобразоватьЗначениеПоТипу("files", СоответствиеОбложки);
ОбъектОбложка = ОбъектОбложка["files"][0];
ОбъектОбложка.Удалить("name");
Параметры.Вставить("cover", ОбъектОбложка);
КонецЕсли;
Параметры.Вставить("properties", Свойства);
Параметры.Вставить("archived", Архивирована);
ПреобразоватьИД(Страница);
Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСБазамиДанных
@ -222,19 +288,8 @@
Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура)
СтруктураДанных = Новый Структура;
СтруктураТекста = Новый Структура;
МассивДанных = Новый Массив;
СтруктураТекста.Вставить("content", Заголовок);
СтруктураТекста.Вставить("link" , Неопределено);
СтруктураДанных.Вставить("type", "text");
СтруктураДанных.Вставить("text", СтруктураТекста);
МассивДанных.Добавить(СтруктураДанных);
ОсновнаяСтруктура.Вставить("title", МассивДанных);
Заголовок = ПреобразоватьЗаголовок(Заголовок);
ОсновнаяСтруктура.Вставить("title", Заголовок["title"]);
КонецПроцедуры
@ -285,4 +340,232 @@
КонецФункции
Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина)
Если ЭтоБаза Тогда
ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема);
Иначе
ДанныеСхемы = ПолучитьСтраницу(Токен, Схема);
КонецЕсли;
ПоляБазы = ДанныеСхемы["properties"];
Свойства = Новый Соответствие;
Для Каждого Поле Из ПоляБазы Цикл
ДанныеПоля = Поле.Значение;
ТипПоля = ДанныеПоля["type"];
ЗаполняемыеДанные = Данные.Получить(Поле.Ключ);
Если Не ЗначениеЗаполнено(ЗаполняемыеДанные) Тогда
Продолжить;
КонецЕсли;
ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные);
Если ПреобразованныеДанные = Неопределено Тогда
Продолжить;
КонецЕсли;
Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные);
КонецЦикла;
Возврат Свойства;
КонецФункции
#Область ПреобразованиеТипов
Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение)
Если Тип = "title" Тогда
Возврат ПреобразоватьЗаголовок(Значение);
ИначеЕсли Тип = "rich_text" Тогда
Возврат ПреобразоватьТекст(Значение);
ИначеЕсли Тип = "number" Тогда
Возврат ПреобразоватьЧисло(Значение);
ИначеЕсли Тип = "select" Тогда
Возврат ПреобразоватьВариантВыбора(Значение);
ИначеЕсли Тип = "multi_select" Тогда
Возврат ПреобразоватьМножественныйВыбор(Значение);
ИначеЕсли Тип = "status" Тогда
Возврат ПреобразоватьСтатус(Значение);
ИначеЕсли Тип = "date" Тогда
Возврат ПреобразоватьеДату(Значение);
ИначеЕсли Тип = "relation" Тогда
Возврат ПреобразоватьСвязь(Значение);
ИначеЕсли Тип = "people" Тогда
Возврат ПреобразоватьПользователей(Значение);
ИначеЕсли Тип = "files" Тогда
Возврат ПреобразоватьФайлы(Значение);
ИначеЕсли Тип = "checkbox" Тогда
Возврат ПреобразоватьБулево(Значение);
ИначеЕсли Тип = "url" Тогда
Возврат ПреобразоватьСсылку(Значение);
ИначеЕсли Тип = "email" Тогда
Возврат ПреобразоватьПочту(Значение);
ИначеЕсли Тип = "phone_number" Тогда
Возврат ПреобразоватьТелефон(Значение);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ПреобразоватьЗаголовок(Знач Заголовок)
СтруктураДанных = Новый Структура;
СтруктураТекста = Новый Структура;
МассивДанных = Новый Массив;
СтруктураТекста.Вставить("content", Заголовок);
СтруктураТекста.Вставить("link" , Неопределено);
СтруктураДанных.Вставить("type", "text");
СтруктураДанных.Вставить("text", СтруктураТекста);
МассивДанных.Добавить(СтруктураДанных);
Возврат Новый Структура("title", МассивДанных);
КонецФункции
Функция ПреобразоватьТекст(Знач Текст)
МассивТекста = Новый Массив;
СтруктураТекста = Новый Структура;
СтруктураТекста.Вставить("type", "text");
СтруктураТекста.Вставить("text", Новый Структура("content", Текст));
МассивТекста.Добавить(СтруктураТекста);
Возврат Новый Структура("rich_text", МассивТекста);
КонецФункции
Функция ПреобразоватьЧисло(Знач Число)
//Число = OPI_Инструменты.ЧислоВСтроку(Число);
Возврат Новый Структура("number", Число);
КонецФункции
Функция ПреобразоватьВариантВыбора(Знач Вариант)
СтруктураВыбора = Новый Структура;
СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант));
Возврат СтруктураВыбора;
КонецФункции
Функция ПреобразоватьСтатус(Знач Статус)
СтруктураСтатуса = Новый Структура;
СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус));
Возврат СтруктураСтатуса;
КонецФункции
Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов)
МассивВариантовВыбора = Новый Массив;
Для Каждого Вариант Из МассивВариантов Цикл
МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант));
КонецЦикла;
Возврат Новый Структура("multi_select", МассивВариантовВыбора);
КонецФункции
Функция ПреобразоватьеДату(Знач Дата)
СтруктураДаты = Новый Структура;
Если Дата = НачалоДня(Дата) Тогда
ФорматДаты = "ДФ=yyyy-MM-dd";
Иначе
ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ";
КонецЕсли;
Дата = Формат(Дата, ФорматДаты);
СтруктураДаты.Вставить("start", Дата);
Возврат Новый Структура("date", СтруктураДаты);
КонецФункции
Функция ПреобразоватьСвязь(Знач Идентификатор)
МассивСвязи = Новый Массив;
МассивСвязи.Добавить(Новый Структура("id", Идентификатор));
Возврат Новый Структура("relation", МассивСвязи);
КонецФункции
Функция ПреобразоватьПользователей(Знач МассивИД)
Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда
МассивИД_ = Новый Массив;
МассивИД_.Добавить(МассивИД);
МассивИД = МассивИД_;
КонецЕсли;
МассивПользователей = Новый Массив;
Для Каждого Идентификатор Из МассивИД Цикл
СтруктураПользователя = Новый Структура;
СтруктураПользователя.Вставить("object", "user");
СтруктураПользователя.Вставить("id" , Идентификатор);
МассивПользователей.Добавить(СтруктураПользователя);
КонецЦикла;
Возврат Новый Структура("people", МассивПользователей);
КонецФункции
Функция ПреобразоватьФайлы(Знач СоответствиеФайлов)
МассивФайлов = Новый Массив;
Для Каждого Файл Из СоответствиеФайлов Цикл
СтруктураФайла = Новый Структура;
СтруктураФайла.Вставить("type", "external");
СтруктураФайла.Вставить("name", Файл.Ключ);
СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение));
МассивФайлов.Добавить(СтруктураФайла);
КонецЦикла;
Возврат Новый Структура("files", МассивФайлов);
КонецФункции
Функция ПреобразоватьБулево(Знач Булево)
Возврат Новый Структура("checkbox", Булево);
КонецФункции
Функция ПреобразоватьСсылку(Знач URL)
Возврат Новый Структура("url", URL);
КонецФункции
Функция ПреобразоватьПочту(Знач Почта)
Возврат Новый Структура("email", Почта);
КонецФункции
Функция ПреобразоватьТелефон(Знач Телефон)
Возврат Новый Структура("phone_number", Телефон);
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -164,7 +164,59 @@
// BSLLS:CognitiveComplexity-on
Функция Post(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина) Экспорт
Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON);
КонецФункции
Функция Patch(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина) Экспорт
Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON);
КонецФункции
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
СоответствиеВозврата = Новый Соответствие;
КоличествоЧастей = 2;
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
Для Каждого Параметр Из МассивПараметров Цикл
МассивКлючЗначение = СтрРазделить(Параметр, "=");
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
КонецЕсли;
КонецЦикла;
Возврат СоответствиеВозврата;
КонецФункции
Функция UNIXTime(Знач Дата) Экспорт
Возврат Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
КонецФункции
Процедура ЗаменитьСпецСимволы(Текст) Экспорт
МассивСимволов = Новый Соответствие;
МассивСимволов.Вставить("<", "&lt;");
МассивСимволов.Вставить(">", "&gt;");
МассивСимволов.Вставить("&", "&amp;");
МассивСимволов.Вставить("_", " ");
МассивСимволов.Вставить("[", "(");
МассивСимволов.Вставить("]", ")");
Для Каждого СимволМассива Из МассивСимволов Цикл
Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Служебные
Функция ВыполнитьЗапросСТелом(Знач URL, Знач Вид, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина)
Если Не ЗначениеЗаполнено(Параметры) Тогда
Параметры = Новый Структура;
КонецЕсли;
@ -199,7 +251,7 @@
НовыйЗапрос.УстановитьТелоИзСтроки(Данные);
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
Ответ = Соединение.ВызватьHTTPМетод(Вид, НовыйЗапрос);
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить(
"content-encoding") = GZip;
@ -224,50 +276,6 @@
КонецФункции
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
СоответствиеВозврата = Новый Соответствие;
КоличествоЧастей = 2;
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
Для Каждого Параметр Из МассивПараметров Цикл
МассивКлючЗначение = СтрРазделить(Параметр, "=");
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
КонецЕсли;
КонецЦикла;
Возврат СоответствиеВозврата;
КонецФункции
Процедура ЗаменитьСпецСимволы(Текст) Экспорт
МассивСимволов = Новый Соответствие;
МассивСимволов.Вставить("<", "&lt;");
МассивСимволов.Вставить(">", "&gt;");
МассивСимволов.Вставить("&", "&amp;");
МассивСимволов.Вставить("_", " ");
МассивСимволов.Вставить("[", "(");
МассивСимволов.Вставить("]", ")");
Для Каждого СимволМассива Из МассивСимволов Цикл
Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
КонецЦикла;
КонецПроцедуры
Функция UNIXTime(Знач Дата) Экспорт
Возврат Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
КонецФункции
#КонецОбласти
#Область Служебные
Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
Если Параметры.Количество() = 0 Тогда