From 16abda087cebe622441b68cfb9fa0c71bdba9138 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Mon, 20 Dec 2021 13:06:49 +0100 Subject: [PATCH] feat(api): last_tracker_version as a parameter to GET /projects --- api/chalicelib/core/projects.py | 17 ++++++++++++++--- api/routers/core.py | 7 ++++--- ee/api/chalicelib/core/projects.py | 17 ++++++++++++++--- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/api/chalicelib/core/projects.py b/api/chalicelib/core/projects.py index 1dad5eeb7..5bd16dbea 100644 --- a/api/chalicelib/core/projects.py +++ b/api/chalicelib/core/projects.py @@ -42,18 +42,29 @@ def __create(tenant_id, name): @dev.timed -def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, stack_integrations=False,version=False): +def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, stack_integrations=False, version=False, + last_tracker_version=None): with pg_client.PostgresClient() as cur: + tracker_query = "" + if last_tracker_version is not None and len(last_tracker_version)>0: + tracker_query = cur.mogrify( + """,(SELECT tracker_version FROM public.sessions + WHERE sessions.project_id = s.project_id + AND tracker_version=%(version)s AND tracker_version IS NOT NULL LIMIT 1) AS tracker_version""", + {"version": last_tracker_version}).decode('UTF-8') + elif version: + tracker_query = ",(SELECT tracker_version FROM public.sessions WHERE sessions.project_id = s.project_id ORDER BY start_ts DESC LIMIT 1) AS tracker_version" + cur.execute(f"""\ SELECT s.project_id, s.name, s.project_key {',s.gdpr' if gdpr else ''} {',COALESCE((SELECT TRUE FROM public.sessions WHERE sessions.project_id = s.project_id LIMIT 1), FALSE) AS recorded' if recorded else ''} {',stack_integrations.count>0 AS stack_integrations' if stack_integrations else ''} - {',(SELECT tracker_version FROM public.sessions WHERE sessions.project_id = s.project_id ORDER BY start_ts DESC LIMIT 1) AS tracker_version' if version else ''} + {tracker_query} FROM public.projects AS s {'LEFT JOIN LATERAL (SELECT COUNT(*) AS count FROM public.integrations WHERE s.project_id = integrations.project_id LIMIT 1) AS stack_integrations ON TRUE' if stack_integrations else ''} - where s.deleted_at IS NULL + WHERE s.deleted_at IS NULL ORDER BY s.project_id;""" ) rows = cur.fetchall() diff --git a/api/routers/core.py b/api/routers/core.py index 84b414950..800a59765 100644 --- a/api/routers/core.py +++ b/api/routers/core.py @@ -1,4 +1,4 @@ -from typing import Union +from typing import Union, Optional from decouple import config from fastapi import Depends, Body @@ -848,9 +848,10 @@ def signup_handler(data: schemas.UserSignupSchema = Body(...)): @app.get('/projects', tags=['projects']) -def get_projects(context: schemas.CurrentContext = Depends(OR_context)): +def get_projects(last_tracker_version: Optional[str] = None, context: schemas.CurrentContext = Depends(OR_context)): return {"data": projects.get_projects(tenant_id=context.tenant_id, recording_state=True, gdpr=True, recorded=True, - stack_integrations=True, version=True)} + stack_integrations=True, version=True, + last_tracker_version=last_tracker_version)} @app.post('/projects', tags=['projects']) diff --git a/ee/api/chalicelib/core/projects.py b/ee/api/chalicelib/core/projects.py index 915502700..15f766381 100644 --- a/ee/api/chalicelib/core/projects.py +++ b/ee/api/chalicelib/core/projects.py @@ -40,8 +40,19 @@ def __create(tenant_id, name): return get_project(tenant_id=tenant_id, project_id=project_id, include_gdpr=True) -def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, stack_integrations=False, version=False): +def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, stack_integrations=False, version=False, + last_tracker_version=None): with pg_client.PostgresClient() as cur: + tracker_query = "" + if last_tracker_version is not None and len(last_tracker_version) > 0: + tracker_query = cur.mogrify( + """,(SELECT tracker_version FROM public.sessions + WHERE sessions.project_id = s.project_id + AND tracker_version=%(version)s AND tracker_version IS NOT NULL LIMIT 1) AS tracker_version""", + {"version": last_tracker_version}).decode('UTF-8') + elif version: + tracker_query = ",(SELECT tracker_version FROM public.sessions WHERE sessions.project_id = s.project_id ORDER BY start_ts DESC LIMIT 1) AS tracker_version" + cur.execute( cur.mogrify(f"""\ SELECT @@ -49,10 +60,10 @@ def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, st {',s.gdpr' if gdpr else ''} {',COALESCE((SELECT TRUE FROM public.sessions WHERE sessions.project_id = s.project_id LIMIT 1), FALSE) AS recorded' if recorded else ''} {',stack_integrations.count>0 AS stack_integrations' if stack_integrations else ''} - {',(SELECT tracker_version FROM public.sessions WHERE sessions.project_id = s.project_id ORDER BY start_ts DESC LIMIT 1) AS tracker_version' if version else ''} + {tracker_query} FROM public.projects AS s {'LEFT JOIN LATERAL (SELECT COUNT(*) AS count FROM public.integrations WHERE s.project_id = integrations.project_id LIMIT 1) AS stack_integrations ON TRUE' if stack_integrations else ''} - where s.tenant_id =%(tenant_id)s + WHERE s.tenant_id =%(tenant_id)s AND s.deleted_at IS NULL ORDER BY s.project_id;""", {"tenant_id": tenant_id})