60 lines
2.1 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from werkzeug.exceptions import NotFound
from odoo import http
from odoo.http import request
class WebsiteJitsiController(http.Controller):
@http.route(["/jitsi/update_status"], type="json", auth="public")
def jitsi_update_status(self, room_name, participant_count, joined):
""" Update room status: participant count, max reached
Use the SQL keywords "FOR UPDATE SKIP LOCKED" in order to skip if the row
is locked (instead of raising an exception, wait for a moment and retry).
This endpoint may be called multiple times and we don't care having small
errors in participant count compared to performance issues.
:raise ValueError: wrong participant count
:raise NotFound: wrong room name
"""
if participant_count < 0:
raise ValueError()
chat_room = self._chat_room_exists(room_name)
if not chat_room:
raise NotFound()
request.env.cr.execute(
"""
WITH req AS (
SELECT id
FROM chat_room
-- Can not update the chat room if we do not have its name
WHERE name = %s
FOR UPDATE SKIP LOCKED
)
UPDATE chat_room AS wcr
SET participant_count = %s,
last_activity = NOW(),
max_participant_reached = GREATEST(max_participant_reached, %s)
FROM req
WHERE wcr.id = req.id;
""",
[room_name, participant_count, participant_count]
)
@http.route(["/jitsi/is_full"], type="json", auth="public")
def jitsi_is_full(self, room_name):
return self._chat_room_exists(room_name).is_full
# ------------------------------------------------------------
# TOOLS
# ------------------------------------------------------------
def _chat_room_exists(self, room_name):
return request.env["chat.room"].sudo().search([("name", "=", room_name)], limit=1)