Короче появилась у меня идея генерировать API из схемы базы данных, но все не доходили руки. На той неделе я набросал 120 строк как пробу пера и забил. Вчера отредактировал тот быдлокод и залил на гитхаб.
Сейчас я придумал как сделать авторизацию через jwt для защиты приложения, но до реализации руки не дошли. Прошу покритиковать идею.
Создаем схему и тестовую функцию:
drop schema if exists foo cascade;
create schema foo;
create or replace function foo.hello(name text default 'world') returns text as $$
select format('Hello, %s!', name);
$$ language sql;
Натравливаем скрипт на схему:
$ cd scripts
$ ./pgrpc postgres://postgres@/test --schema foo --debug true
Проверяем:
$ curl -XPOST -d '{"id": 123, "method": "hello"}' http://0.0.0.0:8080/jsonrpc
{
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "missing required fields: jsonrpc"
},
"id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "jsonrpc": "2.0", "foo": "bar"}' http://0.0.0.0:8080/jsonrpc
{
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "unknown fields: foo"
},
"id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": ["sergey"], "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
"jsonrpc": "2.0",
"result": {
"hello": "Hello, sergey!"
},
"id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": {"name": "sergey"}, "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
"jsonrpc": "2.0",
"result": {
"hello": "Hello, sergey!"
},
"id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": {"name": -1}, "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
"jsonrpc": "2.0",
"error": {
"code": -32603,
"message": "invalid input for query argument $1: -1 (expected str, got int)"
},
"id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": {"name": "sergey", "foo": "bar"}, "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "unknown params: foo"
},
"id": 123
}