57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
import json
|
|
import logging
|
|
|
|
from odoo import http
|
|
from odoo.http import request
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MatrixWebhookController(http.Controller):
|
|
"""HTTP controller for incoming Matrix push events.
|
|
|
|
Matrix homeserver pushes events to this endpoint.
|
|
Incoming message → create mail.message in Odoo with 'matrix' channel tag.
|
|
"""
|
|
|
|
@http.route(
|
|
'/tier_matrix/webhook',
|
|
type='http',
|
|
auth='public',
|
|
methods=['POST'],
|
|
csrf=False,
|
|
)
|
|
def matrix_webhook(self, **kwargs):
|
|
"""Receive a Matrix event and create a mail.message in Odoo."""
|
|
try:
|
|
payload = json.loads(request.httprequest.data or '{}')
|
|
except (ValueError, TypeError):
|
|
_logger.warning('tier_matrix webhook: invalid JSON payload')
|
|
return request.make_response(
|
|
json.dumps({'error': 'invalid JSON'}),
|
|
headers=[('Content-Type', 'application/json')],
|
|
status=400,
|
|
)
|
|
|
|
event_type = payload.get('type', '')
|
|
if event_type != 'm.room.message':
|
|
return request.make_response(
|
|
json.dumps({'status': 'ignored'}),
|
|
headers=[('Content-Type', 'application/json')],
|
|
)
|
|
|
|
try:
|
|
request.env['tier.channel.matrix.helper'].sudo().channel_receive_message(payload)
|
|
except Exception:
|
|
_logger.exception('tier_matrix webhook: error processing event')
|
|
return request.make_response(
|
|
json.dumps({'error': 'processing error'}),
|
|
headers=[('Content-Type', 'application/json')],
|
|
status=500,
|
|
)
|
|
|
|
return request.make_response(
|
|
json.dumps({'status': 'ok'}),
|
|
headers=[('Content-Type', 'application/json')],
|
|
)
|