feat(chalice): fixed assist search

feat(assist): fixed search
This commit is contained in:
Taha Yassine Kraiem 2022-10-27 15:13:51 +02:00
parent fd490f4d13
commit 77e6093bd1
3 changed files with 56 additions and 18 deletions

View file

@ -39,9 +39,10 @@ def get_live_sessions_ws(project_id, body: schemas.LiveSessionsSearchPayloadSche
}
for f in body.filters:
if f.type == schemas.LiveFilterType.metadata:
data["filter"][f.source] = f.value
data["filter"][f.source] = {"values": f.value, "operator": f.operator}
else:
data["filter"][f.type.value] = f.value
data["filter"][f.type.value] = {"values": f.value, "operator": f.operator}
return __get_live_sessions_ws(project_id=project_id, data=data)

View file

@ -1025,13 +1025,15 @@ class LiveFilterType(str, Enum):
user_UUID = "USERUUID"
tracker_version = "TRACKERVERSION"
user_browser_version = "USERBROWSERVERSION"
user_device_type = "USERDEVICETYPE",
user_device_type = "USERDEVICETYPE"
class LiveSessionSearchFilterSchema(BaseModel):
value: Union[List[str], str] = Field(...)
type: LiveFilterType = Field(...)
source: Optional[str] = Field(None)
operator: Literal[SearchEventOperator._is.value,
SearchEventOperator._contains.value] = Field(SearchEventOperator._contains.value)
@root_validator
def validator(cls, values):

View file

@ -40,19 +40,20 @@ const extractSessionIdFromRequest = function (req) {
}
const isValidSession = function (sessionInfo, filters) {
let foundAll = true;
for (const [key, values] of Object.entries(filters)) {
for (const [key, body] of Object.entries(filters)) {
let found = false;
if (values !== undefined && values !== null) {
if (body.values !== undefined && body.values !== null) {
for (const [skey, svalue] of Object.entries(sessionInfo)) {
if (svalue !== undefined && svalue !== null) {
if (typeof (svalue) === "object") {
if (isValidSession(svalue, {[key]: values})) {
if (isValidSession(svalue, {[key]: body})) {
found = true;
break;
}
} else if (skey.toLowerCase() === key.toLowerCase()) {
for (let v of values) {
if (String(svalue).toLowerCase().indexOf(v.toLowerCase()) >= 0) {
for (let v of body["values"]) {
if (body.operator === "is" && String(svalue).toLowerCase() === v.toLowerCase()
|| body.operator !== "is" && String(svalue).toLowerCase().indexOf(v.toLowerCase()) >= 0) {
found = true;
break;
}
@ -97,21 +98,37 @@ const objectToObjectOfArrays = function (obj) {
for (let k of Object.keys(obj)) {
if (obj[k] !== undefined && obj[k] !== null) {
_obj[k] = obj[k];
if (!Array.isArray(_obj[k])) {
if (!Array.isArray(_obj[k].values)) {
_obj[k] = [_obj[k]];
}
for (let i = 0; i < _obj[k].length; i++) {
_obj[k][i] = String(_obj[k][i]);
for (let i = 0; i < _obj[k].values.length; i++) {
_obj[k].values[i] = String(_obj[k].values[i]);
}
}
}
}
return _obj;
}
const transformFilters = function (filter) {
for (let key of Object.keys(filter)) {
//To support old v1.7.0 payload
if (Array.isArray(filter[key]) || filter[key] === undefined || filter[key] === null) {
debug && console.log(`[WS]old format for key=${key}`);
filter[key] = {"values": filter[key]};
}
if (filter[key].operator) {
debug && console.log(`[WS]where operator=${filter[key].operator}`);
} else {
debug && console.log(`[WS]where operator=DEFAULT-contains`);
filter[key].operator = "contains";
}
}
return filter;
}
const extractPayloadFromRequest = function (req) {
let filters = {
"query": {},
"filter": {},
"query": {}, // for autocomplete
"filter": {}, // for sessions search
"sort": {
"key": req.body.sort && req.body.sort.key ? req.body.sort.key : undefined,
"order": req.body.sort && req.body.sort.order === "DESC"
@ -135,6 +152,7 @@ const extractPayloadFromRequest = function (req) {
}
filters.filter = objectToObjectOfArrays(filters.filter);
filters.filter = {...filters.filter, ...(req.body.filter || {})};
filters.filter = transformFilters(filters.filter);
debug && console.log("payload/filters:" + JSON.stringify(filters))
return filters;
}
@ -149,20 +167,36 @@ const getValue = function (obj, key) {
}
if (val !== undefined) {
return val;
return isNaN(val) ? val : Number(val);
}
}
}
return undefined;
}
const sortPaginate = function (list, filters) {
if (typeof (list) === "object" && !Array.isArray(list)) {
for (const [key, value] of Object.entries(list)) {
list[key] = sortPaginate(value, filters);
}
return list
}
const total = list.length;
list.sort((a, b) => {
const vA = getValue(a, filters.sort.key || "timestamp");
const vB = getValue(b, filters.sort.key || "timestamp");
return vA > vB ? 1 : vA < vB ? -1 : 0;
const tA = getValue(a, "timestamp");
const tB = getValue(b, "timestamp");
return tA < tB ? 1 : tA > tB ? -1 : 0;
});
if (filters.sort.order) {
list.reverse();
}
if ((filters.sort.key || "timestamp") !== "timestamp") {
list.sort((a, b) => {
const vA = getValue(a, filters.sort.key);
const vB = getValue(b, filters.sort.key);
return vA > vB ? 1 : vA < vB ? -1 : 0;
});
}
if (filters.sort.order) {
list.reverse();
}
@ -185,6 +219,7 @@ const uniqueAutocomplete = function (list) {
return _list;
}
module.exports = {
transformFilters,
extractPeerId,
request_logger,
getValidAttributes,