Nestes primeiros meses de 2017, o grupo MVCBr dedicou a maior parte do tempo em implementar um servidor OData que permite o acesso a base de dados utilizando protocolo RESTful via HTTP.
FIREBIRD !!!
Sim….. o servidor OData implementado no MVCBr é um servidor que expõe recursos (resources) armazenados em um servidor FIREBIRD 3.0
Simplificando, o servidor MVCBrServer é um servidor RESTful que utiliza o protocolo OData que suporta o Firebird3.
Arquitetura do Servidor
O servidor é um servidor implementado utilizando componentes INDY para fazer o processamento das requisições. Ao receber a chamada do CLIENTE o motor INDY passa para o framework “Delphi MVC Framework” implementado pelo “Daniele Teti”. Seguindo os padrões RESTful, o servidor analisa o tipo de pacote que esta recebendo (GET, PUT, POST, PATCH, DELETE, OPTIONS) e passa a requisição para um PARSER OData implementado no framework MVCBr. Ao receber a requisição o PARSER prepara a requisição que será feito ao banco de dados (ex: select * from produtos), avalia o “metadata” contendo as regras de acesso e constrói a solicitação através da estrutura do FireDAC do Delphi, que remete ao driver o FIREBIRD. Recebendo o retorno tudo é empacotado utilizando JSON e devolvido para o cliente.
O “metadata” – Onde o modelo relacional é descrito
Junto com o projeto MVCBr irá encontrar um banco FIREBIRD3 (MVCBr.fdb) que possui uma estrutura básica de teste utilizada no “framework”
Configurar o “databases.conf” do firebird:
# # Live Databases: # mvcbr=[path]/mvcbr.fdb
Como configurar um resource
Resource é o identificar a ser utilizado no HTTP para acessar um determinado recurso do banco de dados.
Veja o exemplo:
{ "resource": "produtos", "collection": "produtos", "keyID": "codigo", "maxpagesize": 100, "fields": "*", "method": "GET,PATCH,POST,PUT,DELETE", "relations": [ { "resource": "grupos", "sourceKey": "grupo", "targetKey": "codigo", "join": "left join grupos on (produtos.grupo=grupos.grupo)" } ] }
- resource: apelido para o URL utilizada no HTTP
- collection: nome da tabela fisica no banco de dados
- keyID: coluna de acesso rápido ás linhas da tabela ex: http://…./OData/OData.svc/produtos(‘789112313311’)
- maxpagesize: número máximo de linhas a retornar caso não seja indicado o comando $top
- fields: lista de colunas a retornar quando o comando $select não for indicado
- method: quais as permissões serão publicadas aos clientes
- relations: quais relacionamento podem ser executados com “resource” corrente ( é um DETAIL)
- relations.resource: qual o apelido do relacionamento com o resource MASTER
- relations.sourceKey: qual a coluna de recionamento no resource MASTER
- relations.targetKey: qual a coluna de relacionamento no resource DETAIL
- relations.join: utilizado para JOINs mais complexos ignorando “sourceKey” e “targetKey”
Listagem completa do metadata de exemplo
[code lang=”javascript”]
{
"@odata.context": "http://localhost:8080/OData/OData.svc",
"__comment": "Services list all resource available to OData.Service",
"OData.Services": [
{
"resource": "produtos",
"collection": "produtos",
"keyID": "codigo",
"maxpagesize": 100,
"fields": "*",
"method": "GET,PATCH,POST,PUT,DELETE",
"relations": [
{
"resource": "grupos",
"sourceKey": "grupo",
"targetKey": "codigo",
"join": "left join grupos on (produtos.grupo=grupos.grupo)"
}
]
},
{
"resource": "grupos",
"collection": "grupos",
"keyID": "codigo",
"fields": "*",
"method": "GET,PATCH,DELETE,PUT,POST",
"maxpagesize": 100,
"relations": [
{
"resource": "produtos",
"sourceKey": "codigo",
"targetKey": "grupo",
"join": "join produtos on (grupos.codigo=produtos.grupo)"
}
]
},
{
"resource": "fornecedores",
"collection": "fornecedores",
"maxpagesize": 100,
"fields": "*",
"keyID": "codigo"
},
{
"resource": "clientes",
"collection": "clientes",
"keyID": "codigo",
"method": "GET,POST,PATCH,UT,DELETE",
"searchFields": "nome",
"maxpagesize": 100,
"fields": "*"
"relations": [
{
"resource": "vendas",
"join": "join vendas on (vendas.cliente=clientes.codigo)"
},
{
"resource": "vendas_item",
"join": "join vendas a on (clientes.codigo=a.cliente) join vendas_item b on (b.documento=a.documento)"
}
]
},
{
"resource": "vendas",
"collection": "vendas",
"maxpagesize": 100,
"keyID": "documento",
"fields": "*",
"method": "GET,POST,PATCH,PUT,DELETE"
},
{
"resource": "vendas_item",
"collection": "vendas_item",
"maxpagesize": 100,
"keyID": "documento"
"method": "GET,POST,PATCH,PUT,DELETE"
}
]
}
[/code]