/petstore

Primary LanguageGo

Задание

Есть стандартное апи, на которое ссылается сваггер для демонстрации https://petstore.swagger.io/
Предлагаем сделать простейшую реализацию бекенда к этому апи. Детали бизнес-логики можно придумать самостоятельно. Интересна будет реализация гарантий соответствия результата целевому апи, возможно кодогенерация по openapi.

Промежуточный итог

  1. Упоролся в сторону генерации кода по спецификации. Но так как меня больше интересует реализация на основе ProtocolBuffers & gRPC, прикрутил gnostic, который позволяет генерировать код на основе yaml файла. Генератор не совсем корректно работает с массивами, но в целом позволяет быстро сгенерировать proto файл. Если брать эту идею дальше, то необходимо будет форкать это приложение и докручивать в соответствии с нашими потребностями.
  2. После этого необходимо сгенерировать код на основе proto файла. Для этого можно использовать protoc-gen-go. Но тут возникает проблема, что в proto-файле необходимо указывать пакет, в который будет сгенерирован код. По умолчанию это пакет, который указан в опции go_package. Пока решил эту проблему с помощью awk. Но это не очень хорошее решение. Поскольку на первом этапе срузу указна опция grpc-gateway, подключаю три доп. плагина к компилятору protoc. После этого сгенерировал код на основе proto файла. На основе полученный *.pb.go файлов можно сгенерировать как сам gRPC сервер, так и REST API на основе grpc-gateway. Плагин validator позволяет автоматически валидировать данные.
  3. Остается самое большое - автоматическая генерация файла заготовки для реализации бизнес логики. Для этого можно использовать go generate. В итоге получится генерация по только сгенерированным *.pb.go файлам.
  4. В папке cmd реализовано 3 варианта точек входа в приложение. Первый просто запускает gRPC сервер. Второй запускает REST API на основе grpc-gateway. Третий запускает оба сервера.

Текущие проблемы

  • Необходимо доработать генератор gnostic, чтобы он корректно генерировал proto файлы.
  • понять почему chi.Router не работает с grpc-gateway.