From 0790921124c54afeddbfa38f225eabc1c2699748 Mon Sep 17 00:00:00 2001 From: Kraiem Taha Yassine Date: Thu, 12 Aug 2021 17:26:31 +0200 Subject: [PATCH] Api v1.3.0changes (#140) * feat(api): get session: live flag checks for duration * feat(api): assist search by user_id * feat(api): assist limit results to 500 --- api/chalicelib/blueprints/bp_core.py | 9 +++++++++ api/chalicelib/core/assist.py | 28 +++++++++++++++++++++++----- api/chalicelib/core/sessions.py | 5 +++-- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/api/chalicelib/blueprints/bp_core.py b/api/chalicelib/blueprints/bp_core.py index 14110f383..e2ef487ed 100644 --- a/api/chalicelib/blueprints/bp_core.py +++ b/api/chalicelib/blueprints/bp_core.py @@ -884,6 +884,15 @@ def sessions_live(projectId, context): return {'data': data} +@app.route('/{projectId}/assist/sessions', methods=['POST']) +def sessions_live_search(projectId, context): + data = app.current_request.json_body + if data is None: + data = {} + data = assist.get_live_sessions(projectId, filters=data.get("filters")) + return {'data': data} + + @app.route('/{projectId}/heatmaps/url', methods=['POST']) def get_heatmaps_by_url(projectId, context): data = app.current_request.json_body diff --git a/api/chalicelib/core/assist.py b/api/chalicelib/core/assist.py index 2e17bd516..4a7dbe9b8 100644 --- a/api/chalicelib/core/assist.py +++ b/api/chalicelib/core/assist.py @@ -1,5 +1,5 @@ from chalicelib.utils import pg_client, helper -from chalicelib.core import projects +from chalicelib.core import projects, sessions, sessions_metas import requests from chalicelib.utils.helper import environ @@ -19,7 +19,7 @@ SESSION_PROJECTION_COLS = """s.project_id, """ -def get_live_sessions(project_id): +def get_live_sessions(project_id, filters=None): project_key = projects.get_project_key(project_id) connected_peers = requests.get(environ["peers"] + f"/{project_key}") if connected_peers.status_code != 200: @@ -31,13 +31,31 @@ def get_live_sessions(project_id): if len(connected_peers) == 0: return [] connected_peers = tuple(connected_peers) + extra_constraints = ["project_id = %(project_id)s", "session_id IN %(connected_peers)s"] + extra_params = {} + if filters is not None: + for i, f in enumerate(filters): + if not isinstance(f.get("value"), list): + f["value"] = [f.get("value")] + if len(f["value"]) == 0 or f["value"][0] is None: + continue + filter_type = f["type"].upper() + f["value"] = sessions.__get_sql_value_multiple(f["value"]) + if filter_type == sessions_metas.meta_type.USERID: + op = sessions.__get_sql_operator(f["operator"]) + extra_constraints.append(f"user_id {op} %(value_{i})s") + extra_params[f"value_{i}"] = helper.string_to_sql_like_with_op(f["value"][0], op) + with pg_client.PostgresClient() as cur: query = cur.mogrify(f"""\ SELECT {SESSION_PROJECTION_COLS}, %(project_key)s||'-'|| session_id AS peer_id FROM public.sessions AS s - WHERE s.project_id = %(project_id)s - AND session_id IN %(connected_peers)s;""", - {"project_id": project_id, "connected_peers": connected_peers, "project_key": project_key}) + WHERE {" AND ".join(extra_constraints)} + LIMIT 500;""", + {"project_id": project_id, + "connected_peers": connected_peers, + "project_key": project_key, + **extra_params}) cur.execute(query) results = cur.fetchall() return helper.list_to_camel_case(results) diff --git a/api/chalicelib/core/sessions.py b/api/chalicelib/core/sessions.py index 8663aa89a..84ddd7d83 100644 --- a/api/chalicelib/core/sessions.py +++ b/api/chalicelib/core/sessions.py @@ -99,8 +99,9 @@ def get_by_id2_pg(project_id, session_id, user_id, full_data=False, include_fav_ data['metadata'] = __group_metadata(project_metadata=data.pop("projectMetadata"), session=data) data['issues'] = issues.get_by_session_id(session_id=session_id) - data['live'] = assist.is_live(project_id=project_id, session_id=session_id, - project_key=data["projectKey"]) + data['live'] = data["duration"] in [None, 0] and assist.is_live(project_id=project_id, + session_id=session_id, + project_key=data["projectKey"]) return data return None