From e90a6035882662280808fe2bdd0202cdcdbba6d8 Mon Sep 17 00:00:00 2001 From: "aleksey.koryakin" Date: Mon, 9 Dec 2019 19:02:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 34 +++++++++ src/сonfluence.os | 187 +++++++++++++++++++++++++++++++--------------- 2 files changed, 161 insertions(+), 60 deletions(-) diff --git a/readme.md b/readme.md index 2403a4f..324e068 100644 --- a/readme.md +++ b/readme.md @@ -32,3 +32,37 @@ #### Установка метки странице `Confluence.ПрикрепитьМеткуКСтранице(ПараметрыПодключения, ИдентификаторСтраницы, "Моя метка")` + +### Примеры нового API + +```bsl + +// Настройки подключения +Подключение = Confluence.ОписаниеПодключения("https://confluence.myserver.ru", "user", "password") + +// Получение идентификатора страницы +ИдентификаторРодителя = Confluence.НайтиСтраницуПоИмени(Подключение, "SpaceKey", "Корневая страница"); + +// Структура адреса страницы (Пространство, Наименование, Идентификатор, Родитель) +АдресСтраницы = Confluence.АдресСтраницы("SpaceKey", "Новая страница", , ИдентификаторРодителя); + +// Создадим новую страницу +Confluence.Создать(Подключение, АдресСтраницы, "Содержимое страницы"); +Сообщить("Идентификатор новой страницы: " + АдресСтраницы.Идентификатор) + +// Обновим содержимое +Confluence.Обновить(Подключение, АдресСтраницы, "Новое содержимое страницы", Истина); + +// Адрес второй страницы +АдресСтраницы = Confluence.АдресСтраницы("SpaceKey", "Вторая страница", , ИдентификаторРодителя); + +// Обновим если содержимое отличается, либо создадим если отсутствует +Confluence.СоздатьИлиОбновить(Подключение, АдресСтраницы, "Содержимое второй страницы"); + +// Опубликуем страницу в формате Markdown +АдресСтраницы = Confluence.АдресСтраницы("SpaceKey", "Третья страница Markdown", , ИдентификаторРодителя); +Содержимое = Новый Структура("Значение, Формат", "# Содержимое третьей страницы", confluence.ФорматыСодержимого.MarkDown); +Confluence.СоздатьИлиОбновить(Подключение, АдресСтраницы, Содержимое); + + +``` diff --git a/src/сonfluence.os b/src/сonfluence.os index 8358a38..5ec6288 100644 --- a/src/сonfluence.os +++ b/src/сonfluence.os @@ -140,7 +140,7 @@ Если УспешныйЗапрос(РезультатЗапроса) Тогда - Данные = ЗначениеИзJSON(РезультатЗапроса.Ответ); + Данные = ДесериализоватьJSON(РезультатЗапроса.Ответ); Возврат Данные.body.storage.value; @@ -464,32 +464,20 @@ КонецФункции -Функция ПреобразоватьMarkdownToConfluence(ПараметрыПодключения, СодержимоеMarkdown) Экспорт - - Идентификатор = ""; - - URLОперации = "rest/tinymce/1/markdownxhtmlconverter"; - - ПараметрыОперации = Новый Структура(); - ПараметрыОперации.Вставить("wiki", СодержимоеMarkdown); - - Тело = СтрокаJSON(ПараметрыОперации); - РезультатЗапроса = ВыполнитьHTTPЗапрос(ПараметрыПодключения, "POST", URLОперации, Тело, "text/html; charset=UTF-8"); - - Если УспешныйЗапрос(РезультатЗапроса) Тогда - - Возврат РезультатЗапроса.Ответ; - - Иначе - - ВызватьИсключение "Ошибка преобразования markdown → html" + ТекстОшибки(РезультатЗапроса, URLОперации, "POST"); - - КонецЕсли; - - Возврат Идентификатор; - -КонецФункции +#Область НовоеAPI +// АдресСтраницы +// Описание расположения страницы +// +// Параметры: +// КодПространства - Строка - Код пространства confluence +// ИмяСтраницы - Строка - имя страницы, должно быть уникально в пределах пространства +// Идентификатор - Строка - Идентификатор страницы confluence, может быть получен только поиском +// ИдентификаторРодителя - Строка - Идентификатор родителя страницы confluence, может быть получен только поиском +// +// Возвращаемое значение: +// Структура - Описание расположения страницы +// Функция АдресСтраницы(КодПространства, ИмяСтраницы = "", Идентификатор = "", ИдентификаторРодителя = "") Экспорт Адрес = Новый Структура; @@ -503,6 +491,19 @@ КонецФункции +// Создать +// Создает новую страницу в confluence и возвращает идентификатор новой страницы, также установив его в "АдресСтраницы" +// +// Параметры: +// ПараметрыПодключения - Структура - Описание подключения, см. confluence.ОписаниеПодключения +// АдресСтраницы - Структура - Описание расположения страницы, см. confluence.АдресСтраницы +// Содержимое - Строка, Структура - Содержимое новой страницы. +// либо строка содержимого в формате confluence +// либо структура с ключами Значение и Формат (Confluence, Markdown, HTML) +// +// Возвращаемое значение: +// Строка - Идентификатор созданной страницы +// Функция Создать(ПараметрыПодключения, АдресСтраницы, Содержимое = Неопределено) Экспорт HTTPМетод = "POST"; @@ -512,7 +513,7 @@ URL = ПолучитьURLОперации(); - РезультатЗапроса = ВыполнитьHTTPЗапрос(ПараметрыПодключения, HTTPМетод, URL, СтрокаJSON(ПараметрыКоманды)); + РезультатЗапроса = ВыполнитьHTTPЗапрос(ПараметрыПодключения, HTTPМетод, URL, СериализоватьJSON(ПараметрыКоманды)); Если УспешныйЗапрос(РезультатЗапроса) Тогда @@ -531,6 +532,23 @@ КонецФункции +// Обновить +// Выполняет обновление существующей страницы +// +// Параметры: +// ПараметрыПодключения - Структура - Описание подключения, см. confluence.ОписаниеПодключения +// АдресСтраницы - Структура - Описание расположения страницы, см. confluence.АдресСтраницы +// Содержимое - Строка, Структура - Содержимое новой страницы. +// либо строка содержимого в формате confluence +// либо структура с ключами Значение и Формат (Confluence, Markdown, HTML) +// +// ОбновитьПриИзмененииСодержимого - Булево - Выполнять только если содержимое изменено, +// Если установлено в Истина, но меняется только родитель или имя страницы - изменения не будут применены +// +// Возвращаемое значение: +// Неопределено, Строка - Когда обновление не требуется будет возвращено Неопределено, +// в других случаях - идентификатор страницы +// Функция Обновить(ПараметрыПодключения, АдресСтраницы, Содержимое = Неопределено, ОбновитьПриИзмененииСодержимого = Ложь) Экспорт Если ПустаяСтрока(АдресСтраницы.ИмяСтраницы) И ПустаяСтрока(АдресСтраницы.Идентификатор) Тогда @@ -590,7 +608,7 @@ ПараметрыКоманды = ПараметрыСозданияОбновления(АдресСтраницы, ОписаниеСодержимого, Версия); - ТелоЗапроса = СтрокаJSON(ПараметрыКоманды); + ТелоЗапроса = СериализоватьJSON(ПараметрыКоманды); РезультатЗапроса = ВыполнитьHTTPЗапрос(ПараметрыПодключения, HTTPМетод, URL, ТелоЗапроса); @@ -602,7 +620,66 @@ Возврат АдресСтраницы.Идентификатор; -КонецФункции // ОбновитьСтраницу() +КонецФункции + +// СоздатьИлиОбновить +// Создает новую страницу, либо обновление существующую +// +// Параметры: +// ПараметрыПодключения - Структура - Описание подключения, см. confluence.ОписаниеПодключения +// АдресСтраницы - Структура - Описание расположения страницы, см. confluence.АдресСтраницы +// Содержимое - Строка, Структура - Содержимое новой страницы. +// либо строка содержимого в формате confluence +// либо структура с ключами Значение и Формат (Confluence, Markdown, HTML) +// ОбновитьПриИзмененииСодержимого - Булево - Выполнять только если содержимое изменено, +// Если установлено в Истина, но меняется только родитель или имя страницы - изменения не будут применены +// +// Возвращаемое значение: +// Структура - Ключи: +// Успешно - Булево - не было ошибок +// Действие - Строка - "Создание", "Обновление", Неопределено +// +Функция СоздатьИлиОбновить(ПараметрыПодключения, АдресСтраницы, Содержимое, ОбновитьПриИзмененииСодержимого) Экспорт + + Результат = Новый Структура("Успешно, Действие"); + Если ПустаяСтрока(АдресСтраницы.Идентификатор) Тогда + + АдресСтраницы.Идентификатор = НайтиСтраницуПоИмени(ПараметрыПодключения, АдресСтраницы.КодПространства, АдресСтраницы.ИмяСтраницы); + + КонецЕсли; + + Если Не ПустаяСтрока(АдресСтраницы.Идентификатор) Тогда + + РезультатОбновления = Обновить( + ПараметрыПодключения, + АдресСтраницы, + Содержимое, + ОбновитьПриИзмененииСодержимого); + + Если РезультатОбновления <> Неопределено Тогда + Результат.Действие = "Обновление"; + КонецЕсли; + + Иначе + + АдресСтраницы.Идентификатор = Создать(ПараметрыПодключения, АдресСтраницы, Содержимое); + Результат.Действие = "Создание"; + + КонецЕсли; + + Результат.Успешно = Истина; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +/////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ФУНКЦИОНАЛ +/////////////////////////////////////////////////////////////////// + +#Область СлужебныеМетоды Функция ПараметрыСозданияОбновления(Адрес, ОписаниеСодержимого, Версия = Неопределено) @@ -710,44 +787,32 @@ КонецФункции -Функция СоздатьИлиОбновить(ПараметрыПодключения, АдресСтраницы, Содержимое, ОбновитьПриИзмененииСодержимого) Экспорт +Функция ПреобразоватьMarkdownToConfluence(ПараметрыПодключения, СодержимоеMarkdown) + + Идентификатор = ""; - Результат = Новый Структура("Успешно, Действие"); - Если ПустаяСтрока(АдресСтраницы.Идентификатор) Тогда - - АдресСтраницы.Идентификатор = НайтиСтраницуПоИмени(ПараметрыПодключения, АдресСтраницы.КодПространства, АдресСтраницы.ИмяСтраницы); - - КонецЕсли; + URLОперации = "rest/tinymce/1/markdownxhtmlconverter"; + + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("wiki", СодержимоеMarkdown); - Если Не ПустаяСтрока(АдресСтраницы.Идентификатор) Тогда + Тело = СериализоватьJSON(ПараметрыОперации); + РезультатЗапроса = ВыполнитьHTTPЗапрос(ПараметрыПодключения, "POST", URLОперации, Тело, "text/html; charset=UTF-8"); + + Если УспешныйЗапрос(РезультатЗапроса) Тогда + + Возврат РезультатЗапроса.Ответ; - РезультатОбновления = Обновить( - ПараметрыПодключения, - АдресСтраницы, - Содержимое, - ОбновитьПриИзмененииСодержимого); - - Если РезультатОбновления <> Неопределено Тогда - Результат.Действие = "Обновление"; - КонецЕсли; - Иначе - - АдресСтраницы.Идентификатор = Создать(ПараметрыПодключения, АдресСтраницы, Содержимое); - Результат.Действие = "Создание"; + + ВызватьИсключение "Ошибка преобразования markdown → html" + ТекстОшибки(РезультатЗапроса, URLОперации, "POST"); КонецЕсли; - - Результат.Успешно = Истина; - - Возврат Результат; + + Возврат Идентификатор; КонецФункции -/////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЙ ФУНКЦИОНАЛ -/////////////////////////////////////////////////////////////////// - Функция ПолучитьURLОперации(КодПространства = "", ИмяСтраницы = "", Идентификатор = "", Операция = "") URLОперации = "rest/api/content/"; @@ -828,7 +893,7 @@ КонецФункции -Функция СтрокаJSON(Значение) +Функция СериализоватьJSON(Значение) ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(Ложь, , Истина, , , , , , Истина); Запись = Новый ЗаписьJSON(); @@ -840,7 +905,7 @@ КонецФункции -Функция ЗначениеИзJSON(СтрокаJSON) +Функция ДесериализоватьJSON(СтрокаJSON) Чтение = Новый ЧтениеJSON(); Чтение.УстановитьСтроку(СтрокаJSON); Данные = ПрочитатьJSON(Чтение); @@ -870,6 +935,8 @@ КонецФункции +#КонецОбласти + ФорматыСодержимого = Новый Структура(); ФорматыСодержимого.Вставить("Markdown", "markdown"); ФорматыСодержимого.Вставить("Confluence", "confluence");