Utilização de GraphQL no Odoo: Otimização de APIs e Redução de Latência
Resumo:
Descubra como integrar o GraphQL no Odoo para criar APIs mais flexíveis, com menor latência e maior eficiência. Este guia prático em Português de Portugal inclui passos para criar um módulo, definir schemas, implementar resolvers e executar queries que, por exemplo, somam valores diretamente na resposta.
1. Porquê GraphQL no Odoo?
- Flexibilidade de Queries: Permite ao cliente escolher exatamente os campos desejados.
- Menor Latência: Uma única chamada HTTP pode substituir vários endpoints REST.
- Documentação Automática: Schemas auto-dokumentam-se, facilitando o trabalho da equipa de front-end.
- Ferramentas Ecosistema: GraphiQL, Apollo Client, entre outras.
“Integrar GraphQL no Odoo é um passo estratégico para quem procura APIs mais ágeis e customizáveis.”
– Equipa OpenCloud
2. Pré-requisitos
- Odoo 16+
- Python 3.8+
- Conhecimentos básicos de módulos Odoo
- Biblioteca Ariadne para GraphQL:
bash pip install ariadne
3. Estrutura do Módulo
bash
addons/
└── odoo_graphql
├── __init__.py
├── __manifest__.py
├── schema.graphql
├── resolvers.py
└── controllers/
└── graphql_controller.py
3.1 manifest.py
python
{
'name': 'Odoo GraphQL API',
'version': '1.0',
'category': 'Tools',
'summary': 'Exposição de API GraphQL para Odoo',
'depends': ['base'],
'data': [],
'installable': True,
}
4. Definir o Schema GraphQL
arquivo schema.graphql
:
```graphql type Query { product(id: ID!): Product sumOrderLines(orderId: ID!): Float }
type Product { id: ID! name: String! list_price: Float! }
type OrderLine { id: ID! product_id: ID! price_unit: Float! product_uom_qty: Float! }
schema { query: Query } ```
5. Implementar Resolvers
arquivo resolvers.py
:
```python from ariadne import QueryType from odoo import api, SUPERUSER_ID
query = QueryType()
@query.field("product") def resolve_product(_, info, id): env = info.context["env"] product = env['product.product'].browse(int(id)) return { "id": product.id, "name": product.name, "list_price": product.list_price, }
@query.field("sumOrderLines") def resolve_sum_order_lines(_, info, orderId): env = info.context["env"] lines = env['sale.order.line'].search([('order_id', '=', int(orderId))]) total = sum(lines.mapped('price_unit') * lines.mapped('product_uom_qty')) return total ```
6. Criar o Controller HTTP
arquivo controllers/graphql_controller.py
:
```python from odoo import http, api from odoo.http import request from ariadne import load_schema_from_path, make_executable_schema, graphql_sync, snake_case_fallback_resolvers
Carregar schema
type_defs = load_schema_from_path(file.replace('controllers/graphql_controller.py', '../schema.graphql')) from ..resolvers import query
schema = make_executable_schema(type_defs, query, snake_case_fallback_resolvers)
class GraphQLController(http.Controller):
@http.route('/graphql', auth='user', type='json', methods=['POST'])
def graphql(self, **data):
context = {
"env": request.env(user=SUPERUSER_ID)
}
success, result = graphql_sync(
schema,
data,
context_value=context,
debug=True
)
status = 200 if success else 400
return request.make_response(result, headers=[('Content-Type', 'application/json')], status=status)
```
7. Testar a API GraphQL
- Aceda a GraphiQL no URL:
https://<seu-odoo>/graphql
- Execute a query de exemplo:
graphql
query {
product(id: "1") {
name
list_price
}
sumOrderLines(orderId: "10")
}
Resultado esperado:
json { "data": { "product": { "name": "Laptop Pro", "list_price": 2499.0 }, "sumOrderLines": 5178.0 } }
8. Boas Práticas de Performance
- Batching & Caching: Utilize DataLoaders para reduzir chamadas múltiplas.
- Limit & Offset: Permita paginação nas queries que retornam listas.
- Autenticação JWT: Substitua
auth='user'
por um esquema seguro com tokens. - Monitorização: Integre com ferramentas como Prometheus ou Elastic APM.
9. Conclusão
Integrar GraphQL no Odoo traz maior desempenho, flexibilidade e facilidade de manutenção. Quer optimizar ainda mais as suas APIs? A equipa da OpenCloud ajuda-o a implementar soluções avançadas e escaláveis em Odoo:
- Visite www.opencloud.pro
- Saiba mais sobre a nossa parceria oficial com a Odoo em:
https://www.odoo.com/partners/opencloud-unipessoal-lda-12774
Pronto para dar o próximo passo? Contacte-nos e transforme as suas integrações Odoo com GraphQL!