English | Pусский
API для хранимых процедур БД
Пакет apisite/procapi является частью проекта apisite и предназначен для предоставления доступа к хранимым функциям БД (например, postgresql) следующим потребителям:
- golang-шаблонам, для формирования страниц сайта с использованием данных из БД
- внешним клиентам, для вызова функций БД из, например, javascript
Т.к. вся необходимая потребителям информация (включая список и сигнатуры функций БД) изначально размещена в БД, при ее изменении не требуется перекомпиляция golang-кода.
Задача пакета решается функцией вида:
func Call(method string, args map[string]interface{}) ([]map[string]interface{}, error) {}для случая, когда методы API представляют собой функции Postgresql.
- Выбор
mapдля аргументов обусловлен необходимостью различать
- аргумент со значением (/name?arg=XX)
- аргумент без значения (NULL) (/name?arg)
- аргумент со значением по умолчанию (/name)
- Использование
mapв результате, для golang-потребителей, может быть сведено к структурам с помощью mapstructure - Доступная в БД информация об аргументах функций используется для их валидации
Библиотека разделена на следующие части:
Варианты запуска:
TEST_DATABASE="{PG_DSN}" TZ="Europe/Berlin" go test ./...make cov- тесты с генерацией отчета о покрытии (смmake help)
Т.к. для работы с БД могут потребоваться параметры соединения, они вынесены в файл настроек .env, для создания которого необходимо выполнить make config.
Варианты запуска Postgresql:
- Внешний, в настройках задаются параметры соединения, пользователь и БД должны существовать
- Внутренний (с помощью docker). Для запуска необходимо в отдельной консоли выполнить
make test-docker-run
В любом из этих случаев, при выполнении тестов будут созданы и наполнены данными 3 схемы БД, которые после выполнения тестов будут удалены (по завершении тестов выполняется ROLLBACK).
Необходимый для тестов SQL-код подключается в каталог тестовых данных (testdata) посредством git submodule. Т.о., если проект не был склонирован с ключем --recursive, для подгрузки SQL необходимо выполнить
git submodule init
git submodule updateИспользуемый для тестов SQL-код разработан в рамках проекта pgmig и включает пакеты:
См. также: .drone.yml - пример запуска тестов
- реестр доступных функций (и их сигнатуры) хранится в БД, там же хранятся описания функций, аргументов, результатов и примеры вызова (в перспективе - с поддержкой i18n)
- в реестре также задается соответствие между именем функции в API и в БД
- доступ к реестру производится через вызовы специальных функций БД (их схема и имена задаются в настройках)
Для получения информации из реестра используются функции с зашитыми в код сигнатурами (их имена могут быть изменены в настройках), вызов имеет вид SELECT * FROM %c(code):
--db.index $name(default:"index") - список доступных функций, структура ответа - Method--db.indef $name(default:"func_args") - описание аргументов функции, структура ответа - InDef--db.outdef $name(default:"func_result") - описание результата функции, структура ответа - OutDef
Структура PGType дополняет возможности pgx v4. Код реализовывает интерфейс Marshaller и может быть заменен другим с помощью вызова SetMarshaller.
Пакет добавляет в gin маршрутизацию для прямого вызова функций API и дополняет funcMap функциями доступа к API из шаблонов. Для работы с procapi используется интерфейс ginproc.Caller
- JWT + OAuth
- Проверка доступа
- Кэш
- тесты ошибок
- поддержка нативных методов API (golang)
- LISTEN для фоновой обработки задач
- Read-Only транзакции для Method.IsRO
- Rollback транзакции для тестов из шаблонов