OneScript.Web icon indicating copy to clipboard operation
OneScript.Web copied to clipboard

WIP: Поддержка генератора документации

Open dvakor opened this issue 7 years ago • 22 comments

#47

Пока я собрался сделать ПР. @EvilBeaver уже добавил поддержку роутинга по атрибутам и корректное заполнение селекторов, что сильно облегчило внедрение.

Генератор работает на основе проекта Swashbuckle https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Сейчас работает UI и генератор JSON для сваггера.

Модуль включается через метод "ИспользоватьДокументацию" по аналогии с "ИспользоватьМаршруты"

UI доступен по адресу host:port/swagger JSON для UI находится по адресу host:port/swagger/{version}/swagger.json Метаданные, включая версию вынес в конфиг файл (в нашем случае appsettings.json), в секцию "Info", структуру глянуть пока тут https://github.com/ArchLord42RU/OneScript.Web/blob/e706537104aaeb69e049e7e39fe4e3249d3ae8e3/src/OneScript/Infrastructure/SwaggerServicePlugin.cs Видны только методы помеченные аннотацией Route\Маршрут(xxx)

Замеченные проблемы:

  • Нет описания возвращаемого значения, точней оно всегда ActionResult

  • Все методы имеют OperationId "ResultAction" (автоматом присваивается имя метода), не очень страшно, но UI тупит из-за этого, если сделать маппинг на OS методы, то хз как там будет с кириллицей.

  • Для UI сейчас захардкожен добавленный эндпоинт, надо бы его из конфига грузить. https://github.com/EvilBeaver/OneScript.Web/compare/develop...ArchLord42RU:feature/Swagger?expand=1#diff-cf462c11ed5d57c1216462ff171014f7R199

  • Нет поддержки версионированного описания API (а надо ли?)

dvakor avatar Nov 12 '18 04:11 dvakor

Это что-то явно крутое, мне надо время, чтобы въехать. К выходным думаю, доберусь. Спасибо!

EvilBeaver avatar Nov 13 '18 07:11 EvilBeaver

Кстати, раз это WIP - с чем помочь?

EvilBeaver avatar Nov 20 '18 15:11 EvilBeaver

Собственно я в первом сообщении написал что там еще надо. Пока у самого руки не дошли( Щас доки генерятся, но толку от них особого нет ибо:

  1. Нет маппинга возвращаемого значения из ОСкрипта
  2. Нет маппинга входящих параметров из ОСкрипта

Тут надо по большей части надо порассуждать \ попробывать как удобней писать код и сделать верное архитектурное решение как все это прокинуть в APIExplorer из ОСкрипта

Начнем с 1.

В шарпе все довольно просто ибо статическая типизация, он например смотрит что тип возр. значения у хттп метода "Pet", он читает все публичные свойства и делает "модель" (в терминах сваггера) и потом в документации мы видим что-то типа того

image

В Оскрипте такой финт не прокатит ибо дин.типизация, в пхп юзают комменты вида "@Return Pet" как то так, где Pet это пхпшный класс.

Можно так же сделать аннотацию &Возврат("Pet") а там уже считать свойства

В свою очередь в классе Pet будут свойства опять же с аннотациями типа:

&Тип("string")
Перем Id Экспорт;

чтобы все типы значений прокинулись корректно. Тут мы конечно будем вынуждены, если нам нужен генератор отказаться от Возврат Новый Структура("Id", 1); Но структуру обработать гораздо сложнее будет.

dvakor avatar Nov 20 '18 19:11 dvakor

А можно пойти путем 1Сным и спарсить типичный коммент для процедур \ функций Это которые такие:

// Описание функции (хттп метода)
//
// Параметры:
//	Нет
//
// Возвращаемое значение:
//	Класс - Pet
//

или такие

// Описание функции (хттп метода)
//
// Параметры:
//	Нет
//
// Возвращаемое значение:
//	Структура
//         * Id Строка - Идентификатор блаблабла
//

dvakor avatar Nov 20 '18 19:11 dvakor

я за второй вариант, ибо 1С-совместимо и не будет вызывать вопросов.

EvilBeaver avatar Nov 20 '18 20:11 EvilBeaver

А как же возврат представлений/результатов? Да ещё и динамический иногда: если все хорошо, то вьюха, а иначе 500?

nixel2007 avatar Nov 21 '18 02:11 nixel2007

А так первое прям попахивает entity :)

nixel2007 avatar Nov 21 '18 02:11 nixel2007

@nixel2007

Сваггер же больше про документацию АПИ, а какие там вьюхи. Хотя видел как-то, что из апи возвращался хтмл, правда 1 раз. Если рассмотреть данную ситуацию с точки зрения типов данных, то вьюха это хтмл, а хтмл это строка, собственно

//Блаблабла
// Возвращаемое значение:
//      Строка - представление чего-то там

Кстати в документации сваггера возвращаемый тип "файл" тоже имеет тип строка с форматом binary или byte. Да и у сваггера есть ограничение на типы данных, их не так много, только основные https://swagger.io/docs/specification/data-models/data-types/

Возврат кодов состояний можно сделать так:

//Блаблабла
// Возвращаемое значение:
//	Структура
//         * Id Строка - Идентификатор блаблабла
//     Код состояния
//         * 404 - Элемент не найден
//         * 400 - Не верные чего-то там

dvakor avatar Nov 21 '18 03:11 dvakor

@nixel2007

А так первое прям попахивает entity :)

Сначала подумал про entity framework, а потом вспомнил, что мне на инфостарте Лустин или Сосновый говорил про твой ОРМ, это ты его и имел ввиду как я понял))

Вообще может не с того места зашел, вместо внедрения в код самого проекта, можно было бы сделать возможность добавлять "плагины" для движка, которые бы имели доступ в ConfigureServices \ Configure, а там уже делай что хочешь, тогда можно бы было сделать все тоже самое, что я и щас сделал, но вынести логику генерации в оскрипт, а тут мы уже имеем https://github.com/bia-tech/autodocgen и твой entity. Соответсвенно сама логика генерации была бы в оскрипте, где больше свободы для конечного разработчика, ну и результат бы отдавался в провайдер сваггера. И поствлять в виде либы.

@EvilBeaver что думаешь?

dvakor avatar Nov 21 '18 04:11 dvakor

@ArchLord42RU я понимаю про swagger. я скорее про то, что oscript.web - это не только голые http-сервисы, возвращающие данные (то бишь бэкэнд). это еще и фреймворк для построения приложений. первый пример - odminus, который веб-обертка над rac.

nixel2007 avatar Nov 21 '18 04:11 nixel2007

Сначала подумал про entity framework, а потом вспомнил, что мне на инфостарте Лустин или Сосновый говорил про твой ОРМ, это ты его и имел ввиду как я понял))

да, его) просто аннотации с типами над переменными класса - это прям оно :)

в целом идея со сваггером очень клевая и полезная! просто нужно учесть особенности фреймворка.

nixel2007 avatar Nov 21 '18 04:11 nixel2007

@ArchLord42RU я понимаю про swagger. я скорее про то, что oscript.web - это не только голые http-сервисы, возвращающие данные. это еще и фреймворк для построения приложений. первый пример - odminus, который веб-обертка над rac.

вот в том то и дело, сваггер штука узкоспециализированная и изначально я думал как сделать так, чтобы его небыло в основном проекте ибо нужно оно будет не такому большому количеству людей.

dvakor avatar Nov 21 '18 04:11 dvakor

@ArchLord42RU я могу тебе просто дать права на пуш в этот проект и ты будешь не пулреквестить, а напрямую пилить в движок?

Тут явно много экспериментирования потребуется, поэтому открытие/обсуждение реквестов, кажется преждевременным. Такое удобно, когда уже есть видение по той или иной теме. Здесь его нет и удобнее просто кодить и смотреть что получается, не?

EvilBeaver avatar Nov 21 '18 08:11 EvilBeaver

@EvilBeaver давай, создам ветку буду там экспереминтировать.

dvakor avatar Nov 24 '18 07:11 dvakor

Можно просто эту же ветку запушить в другой ремоут

nixel2007 avatar Nov 24 '18 07:11 nixel2007

@nixel2007 ну можно и так, тут щас главное заиметь время на эксперименты) Я вот уже месяц прикручиваю ОСкрипт к Астериску через ARI, собственно буквально вчера добился более менее внятного синтаксиса со стороны ОСкрипта, при этом я не в свободное время делаю а в рабочее, т.к. проект для нужд компании.

dvakor avatar Nov 24 '18 10:11 dvakor

Можно просто эту же ветку запушить в другой ремоут

Чо-чо сделать?

EvilBeaver avatar Nov 25 '18 17:11 EvilBeaver

@EvilBeaver я думаю он имеет ввиду текущую ветку закинуть в основной репо и с ней продолжить работать.

dvakor avatar Nov 25 '18 17:11 dvakor

Именно.

⁣Отправлено с помощью BlueMail ​

На 26 нояб. 2018 г., 0:52, в 0:52, Dmitriy Korolev [email protected] написал:п>@EvilBeaver я думаю он имеет ввиду текущую ветку закинуть в основной

репо и с ней продолжить работать.

-- You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub: https://github.com/EvilBeaver/OneScript.Web/pull/48#issuecomment-441458825

nixel2007 avatar Nov 26 '18 02:11 nixel2007

Вам чиз одним писом или наслайсить? (с)

⁣Отправлено с помощью BlueMail ​

На 26 нояб. 2018 г., 0:16, в 0:16, Andrei Ovsiankin [email protected] написал:п>> Можно просто эту же ветку запушить в другой ремоут

Чо-чо сделать?

-- You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub: https://github.com/EvilBeaver/OneScript.Web/pull/48#issuecomment-441456315

nixel2007 avatar Nov 26 '18 02:11 nixel2007

@EvilBeaver оп, я только что занотайсил, что экстеншены уже сделаны лонг тайм эгоу :) это который ExtensionsCompiler, только что-то не пойму не доделано оно? Кроме как в тесте работу с данным классом нигде не вижу.

dvakor avatar Nov 26 '18 05:11 dvakor

Да, компилятор не доделан, т.к. эти API не работают в netstandard2.0

EvilBeaver avatar Nov 26 '18 17:11 EvilBeaver