feat(assist): full autocomplete

feat(assist): solved endpoints conflicts
feat(api): live sessions full autocomplete
This commit is contained in:
Taha Yassine Kraiem 2022-06-15 22:44:41 +02:00
parent c6b719b9fa
commit c254aab413
8 changed files with 122 additions and 75 deletions

View file

@ -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():

View file

@ -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:

View file

@ -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);

View file

@ -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
}
};

View file

@ -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) => {

View file

@ -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);
}

View file

@ -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) => {

View file

@ -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
};