From c254aab413c6ceb59e54411b2aea08b146ab2930 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Wed, 15 Jun 2022 22:44:41 +0200 Subject: [PATCH] feat(assist): full autocomplete feat(assist): solved endpoints conflicts feat(api): live sessions full autocomplete --- api/chalicelib/core/assist.py | 2 +- api/or_dependencies.py | 4 ++- ee/utilities/server.js | 3 +- ee/utilities/servers/websocket-cluster.js | 44 ++++++++++++++--------- ee/utilities/servers/websocket.js | 43 +++++++++++++--------- ee/utilities/utils/helper-ee.js | 41 ++++++++++----------- utilities/servers/websocket.js | 38 ++++++++++++-------- utilities/utils/helper.js | 22 +++++++++--- 8 files changed, 122 insertions(+), 75 deletions(-) diff --git a/api/chalicelib/core/assist.py b/api/chalicelib/core/assist.py index 5ff067229..977d98826 100644 --- a/api/chalicelib/core/assist.py +++ b/api/chalicelib/core/assist.py @@ -130,7 +130,7 @@ def autocomplete(project_id, q: str, key: str = None): except: print("couldn't get response") return {"errors": ["Something went wrong wile calling assist"]} - return results + return {"data": results} def get_ice_servers(): diff --git a/api/or_dependencies.py b/api/or_dependencies.py index 7eee72c49..824670687 100644 --- a/api/or_dependencies.py +++ b/api/or_dependencies.py @@ -33,7 +33,9 @@ class ORRoute(APIRoute): if isinstance(response, JSONResponse): response: JSONResponse = response body = json.loads(response.body.decode('utf8')) - if response.status_code == 200 and body is not None and body.get("errors") is not None: + if response.status_code == 200 \ + and body is not None and isinstance(body, dict) \ + and body.get("errors") is not None: if "not found" in body["errors"][0]: response.status_code = status.HTTP_404_NOT_FOUND else: diff --git a/ee/utilities/server.js b/ee/utilities/server.js index 480a2b27e..93d6d2a2e 100644 --- a/ee/utilities/server.js +++ b/ee/utilities/server.js @@ -75,16 +75,17 @@ if (process.env.uws !== "true") { } uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-list`, uWrapper(socket.handlers.socketsList)); uapp.post(`${PREFIX}/${process.env.S3_KEY}/sockets-list`, uWrapper(socket.handlers.socketsList)); + uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-list/:projectKey/autocomplete`, uWrapper(socket.handlers.autocomplete)); uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-list/:projectKey`, uWrapper(socket.handlers.socketsListByProject)); uapp.post(`${PREFIX}/${process.env.S3_KEY}/sockets-list/:projectKey`, uWrapper(socket.handlers.socketsListByProject)); uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-list/:projectKey/:sessionId`, uWrapper(socket.handlers.socketsListByProject)); uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live`, uWrapper(socket.handlers.socketsLive)); uapp.post(`${PREFIX}/${process.env.S3_KEY}/sockets-live`, uWrapper(socket.handlers.socketsLive)); + uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey/autocomplete`, uWrapper(socket.handlers.autocomplete)); uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey`, uWrapper(socket.handlers.socketsLiveByProject)); uapp.post(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey`, uWrapper(socket.handlers.socketsLiveByProject)); uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey/:sessionId`, uWrapper(socket.handlers.socketsLiveByProject)); - uapp.get(`${PREFIX}/${process.env.S3_KEY}/sockets-live/:projectKey/autocomplete`, uWrapper(socket.handlers.autocomplete)); socket.start(uapp); diff --git a/ee/utilities/servers/websocket-cluster.js b/ee/utilities/servers/websocket-cluster.js index f414939fe..2062e5794 100644 --- a/ee/utilities/servers/websocket-cluster.js +++ b/ee/utilities/servers/websocket-cluster.js @@ -1,7 +1,14 @@ const _io = require('socket.io'); const express = require('express'); const uaParser = require('ua-parser-js'); -const {extractPeerId, hasFilters, isValidSession, sortPaginate} = require('../utils/helper'); +const { + extractPeerId, + hasFilters, + isValidSession, + sortPaginate, + getValidAttributes, + uniqueAutocomplete +} = require('../utils/helper'); const { extractProjectKeyFromRequest, extractSessionIdFromRequest, @@ -104,8 +111,6 @@ const socketsList = async function (req, res) { } respond(res, liveSessions); } -wsRouter.get(`/sockets-list`, socketsList); -wsRouter.post(`/sockets-list`, socketsList); const socketsListByProject = async function (req, res) { debug && console.log("[WS]looking for available sessions"); @@ -133,9 +138,6 @@ const socketsListByProject = async function (req, res) { } respond(res, liveSessions[_projectKey] || []); } -wsRouter.get(`/sockets-list/:projectKey`, socketsListByProject); -wsRouter.post(`/sockets-list/:projectKey`, socketsListByProject); -wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject); const socketsLive = async function (req, res) { debug && console.log("[WS]looking for all available LIVE sessions"); @@ -163,8 +165,6 @@ const socketsLive = async function (req, res) { } respond(res, sortPaginate(liveSessions, filters)); } -wsRouter.get(`/sockets-live`, socketsLive); -wsRouter.post(`/sockets-live`, socketsLive); const socketsLiveByProject = async function (req, res) { debug && console.log("[WS]looking for available LIVE sessions"); @@ -194,14 +194,11 @@ const socketsLiveByProject = async function (req, res) { } respond(res, sortPaginate(liveSessions[_projectKey] || [], filters)); } -wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject); -wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject); -wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject); const autocomplete = async function (req, res) { - debug && console.log("[WS]looking for available LIVE sessions"); + debug && console.log("[WS]autocomplete"); let _projectKey = extractProjectKeyFromRequest(req); - let filters = extractPayloadFromRequest(req); + let filters = await extractPayloadFromRequest(req); let results = []; if (filters.query && Object.keys(filters.query).length > 0) { let rooms = await getAvailableRooms(); @@ -217,9 +214,8 @@ const autocomplete = async function (req, res) { } } } - respond(res, results); + respond(res, uniqueAutocomplete(results)); } -wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete); const findSessionSocketId = async (io, peerId) => { const connected_sockets = await io.in(peerId).fetchSockets(); @@ -292,6 +288,21 @@ function extractSessionInfo(socket) { } } +wsRouter.get(`/sockets-list`, socketsList); +wsRouter.post(`/sockets-list`, socketsList); +wsRouter.get(`/sockets-list/:projectKey/autocomplete`, autocomplete); +wsRouter.get(`/sockets-list/:projectKey`, socketsListByProject); +wsRouter.post(`/sockets-list/:projectKey`, socketsListByProject); +wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject); + +wsRouter.get(`/sockets-live`, socketsLive); +wsRouter.post(`/sockets-live`, socketsLive); +wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete); +wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject); +wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject); +wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject); + + module.exports = { wsRouter, start: (server, prefix) => { @@ -420,6 +431,7 @@ module.exports = { socketsList, socketsListByProject, socketsLive, - socketsLiveByProject + socketsLiveByProject, + autocomplete } }; \ No newline at end of file diff --git a/ee/utilities/servers/websocket.js b/ee/utilities/servers/websocket.js index 686b62293..02267fb66 100644 --- a/ee/utilities/servers/websocket.js +++ b/ee/utilities/servers/websocket.js @@ -1,11 +1,18 @@ const _io = require('socket.io'); const express = require('express'); const uaParser = require('ua-parser-js'); -const {extractPeerId, hasFilters, isValidSession, sortPaginate} = require('../utils/helper'); +const { + extractPeerId, + hasFilters, + isValidSession, + sortPaginate, + getValidAttributes, + uniqueAutocomplete +} = require('../utils/helper'); const { extractProjectKeyFromRequest, extractSessionIdFromRequest, - extractPayloadFromRequest + extractPayloadFromRequest, } = require('../utils/helper-ee'); const {geoip} = require('../utils/geoIP'); const wsRouter = express.Router(); @@ -86,8 +93,6 @@ const socketsList = async function (req, res) { } respond(res, liveSessions); } -wsRouter.get(`/sockets-list`, socketsList); -wsRouter.post(`/sockets-list`, socketsList); const socketsListByProject = async function (req, res) { debug && console.log("[WS]looking for available sessions"); @@ -115,9 +120,6 @@ const socketsListByProject = async function (req, res) { } respond(res, sortPaginate(liveSessions[_projectKey] || [], filters)); } -wsRouter.get(`/sockets-list/:projectKey`, socketsListByProject); -wsRouter.post(`/sockets-list/:projectKey`, socketsListByProject); -wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject); const socketsLive = async function (req, res) { debug && console.log("[WS]looking for all available LIVE sessions"); @@ -144,8 +146,6 @@ const socketsLive = async function (req, res) { } respond(res, sortPaginate(liveSessions, filters)); } -wsRouter.get(`/sockets-live`, socketsLive); -wsRouter.post(`/sockets-live`, socketsLive); const socketsLiveByProject = async function (req, res) { debug && console.log("[WS]looking for available LIVE sessions"); @@ -174,14 +174,11 @@ const socketsLiveByProject = async function (req, res) { } respond(res, sortPaginate(liveSessions[_projectKey] || [], filters)); } -wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject); -wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject); -wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject); const autocomplete = async function (req, res) { - debug && console.log("[WS]looking for available LIVE sessions"); + debug && console.log("[WS]autocomplete"); let _projectKey = extractProjectKeyFromRequest(req); - let filters = extractPayloadFromRequest(req); + let filters = await extractPayloadFromRequest(req); let results = []; if (filters.query && Object.keys(filters.query).length > 0) { let rooms = await getAvailableRooms(); @@ -197,9 +194,8 @@ const autocomplete = async function (req, res) { } } } - respond(res, results); + respond(res, uniqueAutocomplete(results)); } -wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete); const findSessionSocketId = async (io, peerId) => { const connected_sockets = await io.in(peerId).fetchSockets(); @@ -270,6 +266,21 @@ function extractSessionInfo(socket) { } } +wsRouter.get(`/sockets-list`, socketsList); +wsRouter.post(`/sockets-list`, socketsList); +wsRouter.get(`/sockets-list/:projectKey/autocomplete`, autocomplete); +wsRouter.get(`/sockets-list/:projectKey`, socketsListByProject); +wsRouter.post(`/sockets-list/:projectKey`, socketsListByProject); +wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject); + +wsRouter.get(`/sockets-live`, socketsLive); +wsRouter.post(`/sockets-live`, socketsLive); +wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete); +wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject); +wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject); +wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject); + + module.exports = { wsRouter, start: (server, prefix) => { diff --git a/ee/utilities/utils/helper-ee.js b/ee/utilities/utils/helper-ee.js index 41fe456cb..dc821b94a 100644 --- a/ee/utilities/utils/helper-ee.js +++ b/ee/utilities/utils/helper-ee.js @@ -17,11 +17,11 @@ const getBodyFromUWSResponse = async function (res) { } catch (e) { console.error(e); /* res.close calls onAborted */ - try { - res.close(); - } catch (e2) { - console.error(e2); - } + // try { + // res.close(); + // } catch (e2) { + // console.error(e2); + // } json = {}; } resolve(json); @@ -59,30 +59,31 @@ const extractPayloadFromRequest = async function (req, res) { if (process.env.uws === "true") { if (req.getQuery("q")) { debug && console.log(`[WS]where q=${req.getQuery("q")}`); - filters.query.value = [req.getQuery("q")]; + filters.query.value = req.getQuery("q"); } if (req.getQuery("key")) { debug && console.log(`[WS]where key=${req.getQuery("key")}`); - filters.query.key = [req.getQuery("key")]; + filters.query.key = req.getQuery("key"); } if (req.getQuery("userId")) { debug && console.log(`[WS]where userId=${req.getQuery("userId")}`); - filters.userID = [req.getQuery("userId")]; + filters.filter.userID = [req.getQuery("userId")]; } - - let body = await getBodyFromUWSResponse(res); - filters = { - ...filters, - "sort": { - "key": body.sort && body.sort.key ? body.sort.key : undefined, - "order": body.sort && body.sort.order === "DESC" - }, - "pagination": { - "limit": body.pagination && body.pagination.limit ? body.pagination.limit : undefined, - "page": body.pagination && body.pagination.page ? body.pagination.page : undefined + if (!filters.query.value) { + let body = await getBodyFromUWSResponse(res); + filters = { + ...filters, + "sort": { + "key": body.sort && body.sort.key ? body.sort.key : undefined, + "order": body.sort && body.sort.order === "DESC" + }, + "pagination": { + "limit": body.pagination && body.pagination.limit ? body.pagination.limit : undefined, + "page": body.pagination && body.pagination.page ? body.pagination.page : undefined + } } + filters.filter = {...filters.filter, ...(body.filter || {})}; } - filters.filter = {...filters.filter, ...(body.filter || {})}; } else { return helper.extractPayloadFromRequest(req); } diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 59d221042..4feac9f3f 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -8,7 +8,9 @@ const { hasFilters, isValidSession, extractPayloadFromRequest, - sortPaginate + sortPaginate, + getValidAttributes, + uniqueAutocomplete } = require('../utils/helper'); const {geoip} = require('../utils/geoIP'); const wsRouter = express.Router(); @@ -71,8 +73,6 @@ const socketsList = async function (req, res) { } respond(res, liveSessions); } -wsRouter.get(`/sockets-list`, socketsList); -wsRouter.post(`/sockets-list`, socketsList); const socketsListByProject = async function (req, res) { debug && console.log("[WS]looking for available sessions"); @@ -100,9 +100,6 @@ const socketsListByProject = async function (req, res) { } respond(res, liveSessions[_projectKey] || []); } -wsRouter.get(`/sockets-list/:projectKey`, socketsListByProject); -wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject); -wsRouter.post(`/sockets-list/:projectKey`, socketsListByProject); const socketsLive = async function (req, res) { debug && console.log("[WS]looking for all available LIVE sessions"); @@ -129,18 +126,17 @@ const socketsLive = async function (req, res) { } respond(res, sortPaginate(liveSessions, filters)); } -wsRouter.get(`/sockets-live`, socketsLive); -wsRouter.post(`/sockets-live`, socketsLive); const socketsLiveByProject = async function (req, res) { debug && console.log("[WS]looking for available LIVE sessions"); let _projectKey = extractProjectKeyFromRequest(req); + let _sessionId = extractSessionIdFromRequest(req); let filters = extractPayloadFromRequest(req); let liveSessions = {}; let rooms = await getAvailableRooms(); for (let peerId of rooms) { - let {projectKey} = extractPeerId(peerId); - if (projectKey === _projectKey) { + let {projectKey, sessionId} = extractPeerId(peerId); + if (projectKey === _projectKey && (_sessionId === undefined || _sessionId === sessionId)) { let connected_sockets = await io.in(peerId).fetchSockets(); for (let item of connected_sockets) { if (item.handshake.query.identity === IDENTITIES.session) { @@ -158,11 +154,9 @@ const socketsLiveByProject = async function (req, res) { } respond(res, sortPaginate(liveSessions[_projectKey] || [], filters)); } -wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject); -wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject); const autocomplete = async function (req, res) { - debug && console.log("[WS]looking for available LIVE sessions"); + debug && console.log("[WS]autocomplete"); let _projectKey = extractProjectKeyFromRequest(req); let filters = extractPayloadFromRequest(req); let results = []; @@ -180,9 +174,9 @@ const autocomplete = async function (req, res) { } } } - respond(res, results); + respond(res, uniqueAutocomplete(results)); } -wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete); + const findSessionSocketId = async (io, peerId) => { const connected_sockets = await io.in(peerId).fetchSockets(); @@ -253,6 +247,20 @@ function extractSessionInfo(socket) { } } +wsRouter.get(`/sockets-list`, socketsList); +wsRouter.post(`/sockets-list`, socketsList); +wsRouter.get(`/sockets-list/:projectKey/autocomplete`, autocomplete); +wsRouter.get(`/sockets-list/:projectKey`, socketsListByProject); +wsRouter.get(`/sockets-list/:projectKey/:sessionId`, socketsListByProject); +wsRouter.post(`/sockets-list/:projectKey`, socketsListByProject); + +wsRouter.get(`/sockets-live`, socketsLive); +wsRouter.post(`/sockets-live`, socketsLive); +wsRouter.get(`/sockets-live/:projectKey/autocomplete`, autocomplete); +wsRouter.get(`/sockets-live/:projectKey`, socketsLiveByProject); +wsRouter.post(`/sockets-live/:projectKey`, socketsLiveByProject); +wsRouter.get(`/sockets-live/:projectKey/:sessionId`, socketsLiveByProject); + module.exports = { wsRouter, start: (server, prefix) => { diff --git a/utilities/utils/helper.js b/utilities/utils/helper.js index de002f89e..32232d36d 100644 --- a/utilities/utils/helper.js +++ b/utilities/utils/helper.js @@ -51,7 +51,7 @@ const isValidSession = function (sessionInfo, filters) { } } else if (skey.toLowerCase() === key.toLowerCase()) { for (let v of values) { - if (svalue.toLowerCase().indexOf(v.toLowerCase()) >= 0) { + if (String(svalue).toLowerCase().indexOf(v.toLowerCase()) >= 0) { found = true; break; } @@ -77,7 +77,7 @@ const getValidAttributes = function (sessionInfo, query) { if (typeof (svalue) === "object") { matches = [...matches, ...getValidAttributes(svalue, query)] } else if ((query.key === undefined || skey.toLowerCase() === query.key.toLowerCase()) - && svalue.toLowerCase().indexOf(query.value.toLowerCase()) >= 0 + && String(svalue).toLowerCase().indexOf(query.value.toLowerCase()) >= 0 && deduplicate.indexOf(skey + '_' + svalue) < 0) { matches.push({"type": skey, "value": svalue}); deduplicate.push(skey + '_' + svalue); @@ -121,11 +121,11 @@ const extractPayloadFromRequest = function (req) { }; if (req.query.q) { debug && console.log(`[WS]where q=${req.query.q}`); - filters.query.value = [req.query.q]; + filters.query.value = req.query.q; } if (req.query.key) { debug && console.log(`[WS]where key=${req.query.key}`); - filters.query.key = [req.query.key]; + filters.query.key = req.query.key; } if (req.query.userId) { debug && console.log(`[WS]where userId=${req.query.userId}`); @@ -160,6 +160,17 @@ const sortPaginate = function (list, filters) { } return list; } +const uniqueAutocomplete = function (list) { + let _list = []; + let deduplicate = []; + for (let e of list) { + if (deduplicate.indexOf(e.type + "_" + e.value) < 0) { + _list.push(e); + deduplicate.push(e.type + "_" + e.value) + } + } + return _list; +} module.exports = { extractPeerId, request_logger, @@ -170,5 +181,6 @@ module.exports = { hasFilters, objectToObjectOfArrays, extractPayloadFromRequest, - sortPaginate + sortPaginate, + uniqueAutocomplete }; \ No newline at end of file