60 lines
2.1 KiB
Python
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)
|