diff --git a/.github/workflows/oint_test.yml b/.github/workflows/oint_test.yml index d7fb3768a..75d30a003 100644 --- a/.github/workflows/oint_test.yml +++ b/.github/workflows/oint_test.yml @@ -750,6 +750,14 @@ jobs: if: ${{ cancelled() }} == false run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Слак_ОткрытьЗакрытьДиалог" + - name: Получить список файлов + if: ${{ cancelled() }} == false + run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Слак_ПолучитьСписокФайлов" + + - name: Загрузить/Удалить файл + if: ${{ cancelled() }} == false + run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Слак_ЗагрузитьУдалитьФайл" + Encode: runs-on: ubuntu-latest needs: Testing-Twitter diff --git a/OInt/core/Modules/OPI_Slack.os b/OInt/core/Modules/OPI_Slack.os index dde9edc63..42d5bafb4 100644 --- a/OInt/core/Modules/OPI_Slack.os +++ b/OInt/core/Modules/OPI_Slack.os @@ -650,6 +650,161 @@ #КонецОбласти +#Область РаботаСФайлами + +// Получить список файлов +// Получает список файлов бота или канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Канал для отбора - channel +// НомерСтраницы - Число, Строка - Номер страницы - page +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт + + URL = "https://slack.com/api/files.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("page" , НомерСтраницы, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл +// Загружает файл на сервера Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file +// ИмяФайла - Строка - Имя файла с расширением - filename +// Заголовок - Строка - Имя файла в Slack - title +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + Upload_url = "upload_url"; + File_id = "file_id"; + URL = "https://slack.com/api/files.getUploadURLExternal"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Размер = Файл.Размер(); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("length" , Размер , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + URL = Ответ[Upload_url]; + Идентификатор = Ответ[File_id]; + + Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда + Возврат Ответ; + КонецЕсли; + + Файлы = Новый Соответствие; + Файлы.Вставить(ИмяФайла, Файл); + + Ответ = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки); + URL = "https://slack.com/api/files.completeUploadExternal"; + ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("channel_id", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить данные файла +// Получает информацию о файле +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.info"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET"); + + Возврат Ответ; + +КонецФункции + +// Удалить файл +// Удаляет файл на Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.delete"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Сделать файл публичным +// Создает публичный URL для файла. Требует токен пользователя +// +// Параметры: +// Токен - Строка - Токен пользователя - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.sharedPublicURL"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Сделать файл приватным +// Удаляет публичный URL у файла. Требует токен пользователя +// +// Параметры: +// Токен - Строка - Токен пользователя - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.revokePublicURL"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + #Область ФормированиеБлоков // Сформировать блок картинку @@ -708,4 +863,22 @@ КонецФункции +Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST") + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + ВидЗапроса = вРег(ВидЗапроса); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); + + Если ВидЗапроса = "POST" Тогда + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + Иначе + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + #КонецОбласти diff --git a/OInt/tests/Modules/internal/OPI_Тесты.os b/OInt/tests/Modules/internal/OPI_Тесты.os index 27186c32f..0216b2c1c 100644 --- a/OInt/tests/Modules/internal/OPI_Тесты.os +++ b/OInt/tests/Modules/internal/OPI_Тесты.os @@ -3140,6 +3140,83 @@ КонецПроцедуры +Процедура Слак_ПолучитьСписокФайлов() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + + Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + МассивФайлов = Новый Массив; + ИмяФайла = "megadoc.docx"; + Заголовок = "Новый файл"; + + Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + ЗагруженныйФайл = Результат["files"][0]; + МассивФайлов.Добавить(ЗагруженныйФайл["id"]); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + ЗагруженныйФайл = Результат["files"][0]; + МассивФайлов.Добавить(ЗагруженныйФайл["id"]); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл"); + + ЗагруженныйФайл = Результат["file"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Результат = OPI_Slack.СделатьФайлПубличным(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьФайлПубличным"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["permalink_public"]).Заполнено(); + + Результат = OPI_Slack.СделатьФайлПриватным(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьФайлПриватным"); + + Проверка_СлакОк(Результат); + + Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл + + Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл"); + + Проверка_СлакОк(Результат); + + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os index a61a92362..6c5cfd950 100644 --- a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os +++ b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os @@ -182,6 +182,8 @@ НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал" , "Создать/Архивировать канал" , Слак); НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов" , "Получить список каналов" , Слак); НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог" , "Открыть/Закрыть диалог" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов" , "Получить список файлов" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак); Возврат ТаблицаТестов; diff --git a/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os b/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os index 94507be20..aa90668db 100644 --- a/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os +++ b/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os @@ -421,6 +421,9 @@ ИначеЕсли Тип = "СтрокаФайла" Тогда OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина); + ИначеЕсли Тип = "Массив" Тогда + OPI_ПреобразованиеТипов.ПолучитьМассив(Значение); + Иначе OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);