From 85446575d52ed42e36c145aff95e0619cb74f7c3 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Tue, 19 Apr 2022 19:45:57 +0200 Subject: [PATCH] feat(api): fixes --- api/chalicelib/core/assist.py | 4 +- api/chalicelib/core/dashboards.py | 90 ++++++++--------- api/routers/subs/dashboard.py | 154 ++++++++++++++--------------- api/routers/subs/metrics.py | 26 ++--- ee/api/app.py | 3 +- ee/api/chalicelib/core/errors.py | 4 +- ee/api/chalicelib/core/projects.py | 11 +++ 7 files changed, 151 insertions(+), 141 deletions(-) diff --git a/api/chalicelib/core/assist.py b/api/chalicelib/core/assist.py index 97bff84fd..1b6e8c405 100644 --- a/api/chalicelib/core/assist.py +++ b/api/chalicelib/core/assist.py @@ -1,9 +1,7 @@ import requests from decouple import config -import schemas -from chalicelib.core import projects, sessions -from chalicelib.utils import pg_client, helper +from chalicelib.core import projects SESSION_PROJECTION_COLS = """s.project_id, s.session_id::text AS session_id, diff --git a/api/chalicelib/core/dashboards.py b/api/chalicelib/core/dashboards.py index 3af8b01a0..7b7bfe252 100644 --- a/api/chalicelib/core/dashboards.py +++ b/api/chalicelib/core/dashboards.py @@ -242,51 +242,51 @@ def create_metric_add_widget(project_id, user_id, dashboard_id, data: schemas.Cr data=schemas.AddWidgetToDashboardPayloadSchema(metricId=metric_id)) -PREDEFINED = {schemas.TemplatePredefinedKeys.count_sessions: dashboard.get_processed_sessions, - schemas.TemplatePredefinedKeys.avg_image_load_time: dashboard.get_application_activity_avg_image_load_time, - schemas.TemplatePredefinedKeys.avg_page_load_time: dashboard.get_application_activity_avg_page_load_time, - schemas.TemplatePredefinedKeys.avg_request_load_time: dashboard.get_application_activity_avg_request_load_time, - schemas.TemplatePredefinedKeys.avg_dom_content_load_start: dashboard.get_page_metrics_avg_dom_content_load_start, - schemas.TemplatePredefinedKeys.avg_first_contentful_pixel: dashboard.get_page_metrics_avg_first_contentful_pixel, - schemas.TemplatePredefinedKeys.avg_visited_pages: dashboard.get_user_activity_avg_visited_pages, - schemas.TemplatePredefinedKeys.avg_session_duration: dashboard.get_user_activity_avg_session_duration, - schemas.TemplatePredefinedKeys.avg_pages_dom_buildtime: dashboard.get_pages_dom_build_time, - schemas.TemplatePredefinedKeys.avg_pages_response_time: dashboard.get_pages_response_time, - schemas.TemplatePredefinedKeys.avg_response_time: dashboard.get_top_metrics_avg_response_time, - schemas.TemplatePredefinedKeys.avg_first_paint: dashboard.get_top_metrics_avg_first_paint, - schemas.TemplatePredefinedKeys.avg_dom_content_loaded: dashboard.get_top_metrics_avg_dom_content_loaded, - schemas.TemplatePredefinedKeys.avg_till_first_bit: dashboard.get_top_metrics_avg_till_first_bit, - schemas.TemplatePredefinedKeys.avg_time_to_interactive: dashboard.get_top_metrics_avg_time_to_interactive, - schemas.TemplatePredefinedKeys.count_requests: dashboard.get_top_metrics_count_requests, - schemas.TemplatePredefinedKeys.avg_time_to_render: dashboard.get_time_to_render, - schemas.TemplatePredefinedKeys.avg_used_js_heap_size: dashboard.get_memory_consumption, - schemas.TemplatePredefinedKeys.avg_cpu: dashboard.get_avg_cpu, - schemas.TemplatePredefinedKeys.avg_fps: dashboard.get_avg_fps, - schemas.TemplatePredefinedKeys.impacted_sessions_by_js_errors: dashboard.get_impacted_sessions_by_js_errors, - schemas.TemplatePredefinedKeys.domains_errors_4xx: dashboard.get_domains_errors_4xx, - schemas.TemplatePredefinedKeys.domains_errors_5xx: dashboard.get_domains_errors_5xx, - schemas.TemplatePredefinedKeys.errors_per_domains: dashboard.get_errors_per_domains, - schemas.TemplatePredefinedKeys.calls_errors: dashboard.get_calls_errors, - schemas.TemplatePredefinedKeys.errors_by_type: dashboard.get_errors_per_type, - schemas.TemplatePredefinedKeys.errors_by_origin: dashboard.get_resources_by_party, - schemas.TemplatePredefinedKeys.speed_index_by_location: dashboard.get_speed_index_location, - schemas.TemplatePredefinedKeys.slowest_domains: dashboard.get_slowest_domains, - schemas.TemplatePredefinedKeys.sessions_per_browser: dashboard.get_sessions_per_browser, - schemas.TemplatePredefinedKeys.time_to_render: dashboard.get_time_to_render, - schemas.TemplatePredefinedKeys.impacted_sessions_by_slow_pages: dashboard.get_impacted_sessions_by_slow_pages, - schemas.TemplatePredefinedKeys.memory_consumption: dashboard.get_memory_consumption, - schemas.TemplatePredefinedKeys.cpu_load: dashboard.get_avg_cpu, - schemas.TemplatePredefinedKeys.frame_rate: dashboard.get_avg_fps, - schemas.TemplatePredefinedKeys.crashes: dashboard.get_crashes, - schemas.TemplatePredefinedKeys.resources_vs_visually_complete: dashboard.get_resources_vs_visually_complete, - schemas.TemplatePredefinedKeys.pages_dom_buildtime: dashboard.get_pages_dom_build_time, - schemas.TemplatePredefinedKeys.pages_response_time: dashboard.get_pages_response_time, - schemas.TemplatePredefinedKeys.pages_response_time_distribution: dashboard.get_pages_response_time_distribution, - schemas.TemplatePredefinedKeys.missing_resources: dashboard.get_missing_resources_trend, - schemas.TemplatePredefinedKeys.slowest_resources: dashboard.get_slowest_resources, - schemas.TemplatePredefinedKeys.resources_fetch_time: dashboard.get_resources_loading_time, - schemas.TemplatePredefinedKeys.resource_type_vs_response_end: dashboard.resource_type_vs_response_end, - schemas.TemplatePredefinedKeys.resources_count_by_type: dashboard.get_resources_count_by_type, +PREDEFINED = {schemas.TemplatePredefinedKeys.count_sessions: metrics.get_processed_sessions, + schemas.TemplatePredefinedKeys.avg_image_load_time: metrics.get_application_activity_avg_image_load_time, + schemas.TemplatePredefinedKeys.avg_page_load_time: metrics.get_application_activity_avg_page_load_time, + schemas.TemplatePredefinedKeys.avg_request_load_time: metrics.get_application_activity_avg_request_load_time, + schemas.TemplatePredefinedKeys.avg_dom_content_load_start: metrics.get_page_metrics_avg_dom_content_load_start, + schemas.TemplatePredefinedKeys.avg_first_contentful_pixel: metrics.get_page_metrics_avg_first_contentful_pixel, + schemas.TemplatePredefinedKeys.avg_visited_pages: metrics.get_user_activity_avg_visited_pages, + schemas.TemplatePredefinedKeys.avg_session_duration: metrics.get_user_activity_avg_session_duration, + schemas.TemplatePredefinedKeys.avg_pages_dom_buildtime: metrics.get_pages_dom_build_time, + schemas.TemplatePredefinedKeys.avg_pages_response_time: metrics.get_pages_response_time, + schemas.TemplatePredefinedKeys.avg_response_time: metrics.get_top_metrics_avg_response_time, + schemas.TemplatePredefinedKeys.avg_first_paint: metrics.get_top_metrics_avg_first_paint, + schemas.TemplatePredefinedKeys.avg_dom_content_loaded: metrics.get_top_metrics_avg_dom_content_loaded, + schemas.TemplatePredefinedKeys.avg_till_first_bit: metrics.get_top_metrics_avg_till_first_bit, + schemas.TemplatePredefinedKeys.avg_time_to_interactive: metrics.get_top_metrics_avg_time_to_interactive, + schemas.TemplatePredefinedKeys.count_requests: metrics.get_top_metrics_count_requests, + schemas.TemplatePredefinedKeys.avg_time_to_render: metrics.get_time_to_render, + schemas.TemplatePredefinedKeys.avg_used_js_heap_size: metrics.get_memory_consumption, + schemas.TemplatePredefinedKeys.avg_cpu: metrics.get_avg_cpu, + schemas.TemplatePredefinedKeys.avg_fps: metrics.get_avg_fps, + schemas.TemplatePredefinedKeys.impacted_sessions_by_js_errors: metrics.get_impacted_sessions_by_js_errors, + schemas.TemplatePredefinedKeys.domains_errors_4xx: metrics.get_domains_errors_4xx, + schemas.TemplatePredefinedKeys.domains_errors_5xx: metrics.get_domains_errors_5xx, + schemas.TemplatePredefinedKeys.errors_per_domains: metrics.get_errors_per_domains, + schemas.TemplatePredefinedKeys.calls_errors: metrics.get_calls_errors, + schemas.TemplatePredefinedKeys.errors_by_type: metrics.get_errors_per_type, + schemas.TemplatePredefinedKeys.errors_by_origin: metrics.get_resources_by_party, + schemas.TemplatePredefinedKeys.speed_index_by_location: metrics.get_speed_index_location, + schemas.TemplatePredefinedKeys.slowest_domains: metrics.get_slowest_domains, + schemas.TemplatePredefinedKeys.sessions_per_browser: metrics.get_sessions_per_browser, + schemas.TemplatePredefinedKeys.time_to_render: metrics.get_time_to_render, + schemas.TemplatePredefinedKeys.impacted_sessions_by_slow_pages: metrics.get_impacted_sessions_by_slow_pages, + schemas.TemplatePredefinedKeys.memory_consumption: metrics.get_memory_consumption, + schemas.TemplatePredefinedKeys.cpu_load: metrics.get_avg_cpu, + schemas.TemplatePredefinedKeys.frame_rate: metrics.get_avg_fps, + schemas.TemplatePredefinedKeys.crashes: metrics.get_crashes, + schemas.TemplatePredefinedKeys.resources_vs_visually_complete: metrics.get_resources_vs_visually_complete, + schemas.TemplatePredefinedKeys.pages_dom_buildtime: metrics.get_pages_dom_build_time, + schemas.TemplatePredefinedKeys.pages_response_time: metrics.get_pages_response_time, + schemas.TemplatePredefinedKeys.pages_response_time_distribution: metrics.get_pages_response_time_distribution, + schemas.TemplatePredefinedKeys.missing_resources: metrics.get_missing_resources_trend, + schemas.TemplatePredefinedKeys.slowest_resources: metrics.get_slowest_resources, + schemas.TemplatePredefinedKeys.resources_fetch_time: metrics.get_resources_loading_time, + schemas.TemplatePredefinedKeys.resource_type_vs_response_end: metrics.resource_type_vs_response_end, + schemas.TemplatePredefinedKeys.resources_count_by_type: metrics.get_resources_count_by_type, } diff --git a/api/routers/subs/dashboard.py b/api/routers/subs/dashboard.py index 3d27178cf..b167c4231 100644 --- a/api/routers/subs/dashboard.py +++ b/api/routers/subs/dashboard.py @@ -20,61 +20,61 @@ def get_metadata_map(projectId: int): @app.post('/{projectId}/dashboard/sessions', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/sessions', tags=["dashboard", "metrics"]) def get_dashboard_processed_sessions(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_processed_sessions(project_id=projectId, **data.dict())} + return {"data": metrics.get_processed_sessions(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/errors', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/errors', tags=["dashboard", "metrics"]) def get_dashboard_errors(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_errors(project_id=projectId, **data.dict())} + return {"data": metrics.get_errors(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/errors_trend', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/errors_trend', tags=["dashboard", "metrics"]) def get_dashboard_errors_trend(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_errors_trend(project_id=projectId, **data.dict())} + return {"data": metrics.get_errors_trend(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/application_activity', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/application_activity', tags=["dashboard", "metrics"]) def get_dashboard_application_activity(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_application_activity(project_id=projectId, **data.dict())} + return {"data": metrics.get_application_activity(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/page_metrics', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/page_metrics', tags=["dashboard", "metrics"]) def get_dashboard_page_metrics(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_page_metrics(project_id=projectId, **data.dict())} + return {"data": metrics.get_page_metrics(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/user_activity', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/user_activity', tags=["dashboard", "metrics"]) def get_dashboard_user_activity(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_user_activity(project_id=projectId, **data.dict())} + return {"data": metrics.get_user_activity(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/performance', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/performance', tags=["dashboard", "metrics"]) def get_dashboard_performance(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_performance(project_id=projectId, **data.dict())} + return {"data": metrics.get_performance(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/slowest_images', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/slowest_images', tags=["dashboard", "metrics"]) def get_dashboard_slowest_images(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_slowest_images(project_id=projectId, **data.dict())} + return {"data": metrics.get_slowest_images(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/missing_resources', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/missing_resources', tags=["dashboard", "metrics"]) def get_performance_sessions(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_missing_resources_trend(project_id=projectId, **data.dict())} + return {"data": metrics.get_missing_resources_trend(project_id=projectId, **data.dict())} @app.post('/{projectId}/dashboard/network', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/network', tags=["dashboard", "metrics"]) def get_network_widget(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_network(project_id=projectId, **data.dict())} + return {"data": metrics.get_network(project_id=projectId, **data.dict())} @app.get('/{projectId}/dashboard/{widget}/search', tags=["dashboard", "metrics"]) @@ -85,20 +85,20 @@ def get_dashboard_autocomplete(projectId: int, widget: str, q: str, type: str = q = '^' + q if widget in ['performance']: - data = dashboard.search(q, type, project_id=projectId, + data = metrics.search(q, type, project_id=projectId, platform=platform, performance=True) elif widget in ['pages', 'pages_dom_buildtime', 'top_metrics', 'time_to_render', 'impacted_sessions_by_slow_pages', 'pages_response_time']: - data = dashboard.search(q, type, project_id=projectId, + data = metrics.search(q, type, project_id=projectId, platform=platform, pages_only=True) elif widget in ['resources_loading_time']: - data = dashboard.search(q, type, project_id=projectId, + data = metrics.search(q, type, project_id=projectId, platform=platform, performance=False) elif widget in ['time_between_events', 'events']: - data = dashboard.search(q, type, project_id=projectId, + data = metrics.search(q, type, project_id=projectId, platform=platform, performance=False, events_only=True) elif widget in ['metadata']: - data = dashboard.search(q, None, project_id=projectId, + data = metrics.search(q, None, project_id=projectId, platform=platform, metadata=True, key=key) else: return {"errors": [f"unsupported widget: {widget}"]} @@ -109,210 +109,210 @@ def get_dashboard_autocomplete(projectId: int, widget: str, q: str, type: str = @app.post('/{projectId}/dashboard/slowest_resources', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/slowest_resources', tags=["dashboard", "metrics"]) def get_dashboard_slowest_resources(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_slowest_resources(project_id=projectId, **data.dict())} + return {"data": metrics.get_slowest_resources(project_id=projectId, **data.dict())} # 2 @app.post('/{projectId}/dashboard/resources_loading_time', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/resources_loading_time', tags=["dashboard", "metrics"]) def get_dashboard_resources(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_resources_loading_time(project_id=projectId, **data.dict())} + return {"data": metrics.get_resources_loading_time(project_id=projectId, **data.dict())} # 3 @app.post('/{projectId}/dashboard/pages_dom_buildtime', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/pages_dom_buildtime', tags=["dashboard", "metrics"]) def get_dashboard_pages_dom(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_pages_dom_build_time(project_id=projectId, **data.dict())} + return {"data": metrics.get_pages_dom_build_time(project_id=projectId, **data.dict())} # 4 @app.post('/{projectId}/dashboard/busiest_time_of_day', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/busiest_time_of_day', tags=["dashboard", "metrics"]) def get_dashboard_busiest_time_of_day(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_busiest_time_of_day(project_id=projectId, **data.dict())} + return {"data": metrics.get_busiest_time_of_day(project_id=projectId, **data.dict())} # 5 @app.post('/{projectId}/dashboard/sessions_location', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/sessions_location', tags=["dashboard", "metrics"]) def get_dashboard_sessions_location(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_sessions_location(project_id=projectId, **data.dict())} + return {"data": metrics.get_sessions_location(project_id=projectId, **data.dict())} # 6 @app.post('/{projectId}/dashboard/speed_location', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/speed_location', tags=["dashboard", "metrics"]) def get_dashboard_speed_location(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_speed_index_location(project_id=projectId, **data.dict())} + return {"data": metrics.get_speed_index_location(project_id=projectId, **data.dict())} # 7 @app.post('/{projectId}/dashboard/pages_response_time', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/pages_response_time', tags=["dashboard", "metrics"]) def get_dashboard_pages_response_time(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_pages_response_time(project_id=projectId, **data.dict())} + return {"data": metrics.get_pages_response_time(project_id=projectId, **data.dict())} # 8 @app.post('/{projectId}/dashboard/pages_response_time_distribution', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/pages_response_time_distribution', tags=["dashboard", "metrics"]) def get_dashboard_pages_response_time_distribution(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_pages_response_time_distribution(project_id=projectId, **data.dict())} + return {"data": metrics.get_pages_response_time_distribution(project_id=projectId, **data.dict())} # 9 @app.post('/{projectId}/dashboard/top_metrics', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/top_metrics', tags=["dashboard", "metrics"]) def get_dashboard_top_metrics(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_top_metrics(project_id=projectId, **data.dict())} + return {"data": metrics.get_top_metrics(project_id=projectId, **data.dict())} # 10 @app.post('/{projectId}/dashboard/time_to_render', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/time_to_render', tags=["dashboard", "metrics"]) def get_dashboard_time_to_render(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_time_to_render(project_id=projectId, **data.dict())} + return {"data": metrics.get_time_to_render(project_id=projectId, **data.dict())} # 11 @app.post('/{projectId}/dashboard/impacted_sessions_by_slow_pages', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/impacted_sessions_by_slow_pages', tags=["dashboard", "metrics"]) def get_dashboard_impacted_sessions_by_slow_pages(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_impacted_sessions_by_slow_pages(project_id=projectId, **data.dict())} + return {"data": metrics.get_impacted_sessions_by_slow_pages(project_id=projectId, **data.dict())} # 12 @app.post('/{projectId}/dashboard/memory_consumption', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/memory_consumption', tags=["dashboard", "metrics"]) def get_dashboard_memory_consumption(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_memory_consumption(project_id=projectId, **data.dict())} + return {"data": metrics.get_memory_consumption(project_id=projectId, **data.dict())} # 12.1 @app.post('/{projectId}/dashboard/fps', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/fps', tags=["dashboard", "metrics"]) def get_dashboard_avg_fps(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_avg_fps(project_id=projectId, **data.dict())} + return {"data": metrics.get_avg_fps(project_id=projectId, **data.dict())} # 12.2 @app.post('/{projectId}/dashboard/cpu', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/cpu', tags=["dashboard", "metrics"]) def get_dashboard_avg_cpu(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_avg_cpu(project_id=projectId, **data.dict())} + return {"data": metrics.get_avg_cpu(project_id=projectId, **data.dict())} # 13 @app.post('/{projectId}/dashboard/crashes', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/crashes', tags=["dashboard", "metrics"]) def get_dashboard_impacted_sessions_by_slow_pages(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_crashes(project_id=projectId, **data.dict())} + return {"data": metrics.get_crashes(project_id=projectId, **data.dict())} # 14 @app.post('/{projectId}/dashboard/domains_errors', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/domains_errors', tags=["dashboard", "metrics"]) def get_dashboard_domains_errors(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_domains_errors(project_id=projectId, **data.dict())} + return {"data": metrics.get_domains_errors(project_id=projectId, **data.dict())} # 14.1 @app.post('/{projectId}/dashboard/domains_errors_4xx', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/domains_errors_4xx', tags=["dashboard", "metrics"]) def get_dashboard_domains_errors_4xx(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_domains_errors_4xx(project_id=projectId, **data.dict())} + return {"data": metrics.get_domains_errors_4xx(project_id=projectId, **data.dict())} # 14.2 @app.post('/{projectId}/dashboard/domains_errors_5xx', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/domains_errors_5xx', tags=["dashboard", "metrics"]) def get_dashboard_domains_errors_5xx(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_domains_errors_5xx(project_id=projectId, **data.dict())} + return {"data": metrics.get_domains_errors_5xx(project_id=projectId, **data.dict())} # 15 @app.post('/{projectId}/dashboard/slowest_domains', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/slowest_domains', tags=["dashboard", "metrics"]) def get_dashboard_slowest_domains(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_slowest_domains(project_id=projectId, **data.dict())} + return {"data": metrics.get_slowest_domains(project_id=projectId, **data.dict())} # 16 @app.post('/{projectId}/dashboard/errors_per_domains', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/errors_per_domains', tags=["dashboard", "metrics"]) def get_dashboard_errors_per_domains(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_errors_per_domains(project_id=projectId, **data.dict())} + return {"data": metrics.get_errors_per_domains(project_id=projectId, **data.dict())} # 17 @app.post('/{projectId}/dashboard/sessions_per_browser', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/sessions_per_browser', tags=["dashboard", "metrics"]) def get_dashboard_sessions_per_browser(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_sessions_per_browser(project_id=projectId, **data.dict())} + return {"data": metrics.get_sessions_per_browser(project_id=projectId, **data.dict())} # 18 @app.post('/{projectId}/dashboard/calls_errors', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/calls_errors', tags=["dashboard", "metrics"]) def get_dashboard_calls_errors(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_calls_errors(project_id=projectId, **data.dict())} + return {"data": metrics.get_calls_errors(project_id=projectId, **data.dict())} # 18.1 @app.post('/{projectId}/dashboard/calls_errors_4xx', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/calls_errors_4xx', tags=["dashboard", "metrics"]) def get_dashboard_calls_errors_4xx(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_calls_errors_4xx(project_id=projectId, **data.dict())} + return {"data": metrics.get_calls_errors_4xx(project_id=projectId, **data.dict())} # 18.2 @app.post('/{projectId}/dashboard/calls_errors_5xx', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/calls_errors_5xx', tags=["dashboard", "metrics"]) def get_dashboard_calls_errors_5xx(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_calls_errors_5xx(project_id=projectId, **data.dict())} + return {"data": metrics.get_calls_errors_5xx(project_id=projectId, **data.dict())} # 19 @app.post('/{projectId}/dashboard/errors_per_type', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/errors_per_type', tags=["dashboard", "metrics"]) def get_dashboard_errors_per_type(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_errors_per_type(project_id=projectId, **data.dict())} + return {"data": metrics.get_errors_per_type(project_id=projectId, **data.dict())} # 20 @app.post('/{projectId}/dashboard/resources_by_party', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/resources_by_party', tags=["dashboard", "metrics"]) def get_dashboard_resources_by_party(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_resources_by_party(project_id=projectId, **data.dict())} + return {"data": metrics.get_resources_by_party(project_id=projectId, **data.dict())} # 21 @app.post('/{projectId}/dashboard/resource_type_vs_response_end', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/resource_type_vs_response_end', tags=["dashboard", "metrics"]) def get_dashboard_errors_per_resource_type(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.resource_type_vs_response_end(project_id=projectId, **data.dict())} + return {"data": metrics.resource_type_vs_response_end(project_id=projectId, **data.dict())} # 22 @app.post('/{projectId}/dashboard/resources_vs_visually_complete', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/resources_vs_visually_complete', tags=["dashboard", "metrics"]) def get_dashboard_resources_vs_visually_complete(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_resources_vs_visually_complete(project_id=projectId, **data.dict())} + return {"data": metrics.get_resources_vs_visually_complete(project_id=projectId, **data.dict())} # 23 @app.post('/{projectId}/dashboard/impacted_sessions_by_js_errors', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/impacted_sessions_by_js_errors', tags=["dashboard", "metrics"]) def get_dashboard_impacted_sessions_by_js_errors(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_impacted_sessions_by_js_errors(project_id=projectId, **data.dict())} + return {"data": metrics.get_impacted_sessions_by_js_errors(project_id=projectId, **data.dict())} # 24 @app.post('/{projectId}/dashboard/resources_count_by_type', tags=["dashboard", "metrics"]) @app.get('/{projectId}/dashboard/resources_count_by_type', tags=["dashboard", "metrics"]) def get_dashboard_resources_count_by_type(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): - return {"data": dashboard.get_resources_count_by_type(project_id=projectId, **data.dict())} + return {"data": metrics.get_resources_count_by_type(project_id=projectId, **data.dict())} # # 25 @@ -327,23 +327,23 @@ def get_dashboard_resources_count_by_type(projectId: int, data: schemas.MetricPa def get_dashboard_group(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): results = [ {"key": "count_sessions", - "data": dashboard.get_processed_sessions(project_id=projectId, **data.dict())}, - *helper.explode_widget(data={**dashboard.get_application_activity(project_id=projectId, **data.dict()), - "chart": dashboard.get_performance(project_id=projectId, **data.dict()) + "data": metrics.get_processed_sessions(project_id=projectId, **data.dict())}, + *helper.explode_widget(data={**metrics.get_application_activity(project_id=projectId, **data.dict()), + "chart": metrics.get_performance(project_id=projectId, **data.dict()) .get("chart", [])}), - *helper.explode_widget(data=dashboard.get_page_metrics(project_id=projectId, **data.dict())), - *helper.explode_widget(data=dashboard.get_user_activity(project_id=projectId, **data.dict())), + *helper.explode_widget(data=metrics.get_page_metrics(project_id=projectId, **data.dict())), + *helper.explode_widget(data=metrics.get_user_activity(project_id=projectId, **data.dict())), {"key": "avg_pages_dom_buildtime", - "data": dashboard.get_pages_dom_build_time(project_id=projectId, **data.dict())}, + "data": metrics.get_pages_dom_build_time(project_id=projectId, **data.dict())}, {"key": "avg_pages_response_time", - "data": dashboard.get_pages_response_time(project_id=projectId, **data.dict()) + "data": metrics.get_pages_response_time(project_id=projectId, **data.dict()) }, - *helper.explode_widget(dashboard.get_top_metrics(project_id=projectId, **data.dict())), - {"key": "avg_time_to_render", "data": dashboard.get_time_to_render(project_id=projectId, **data.dict())}, - {"key": "avg_used_js_heap_size", "data": dashboard.get_memory_consumption(project_id=projectId, **data.dict())}, - {"key": "avg_cpu", "data": dashboard.get_avg_cpu(project_id=projectId, **data.dict())}, + *helper.explode_widget(metrics.get_top_metrics(project_id=projectId, **data.dict())), + {"key": "avg_time_to_render", "data": metrics.get_time_to_render(project_id=projectId, **data.dict())}, + {"key": "avg_used_js_heap_size", "data": metrics.get_memory_consumption(project_id=projectId, **data.dict())}, + {"key": "avg_cpu", "data": metrics.get_avg_cpu(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_fps, - "data": dashboard.get_avg_fps(project_id=projectId, **data.dict())} + "data": metrics.get_avg_fps(project_id=projectId, **data.dict())} ] results = sorted(results, key=lambda r: r["key"]) return {"data": results} @@ -354,45 +354,45 @@ def get_dashboard_group(projectId: int, data: schemas.MetricPayloadSchema = Body def get_dashboard_group(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): results = [ {"key": schemas.TemplatePredefinedKeys.count_sessions, - "data": dashboard.get_processed_sessions(project_id=projectId, **data.dict())}, + "data": metrics.get_processed_sessions(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_image_load_time, - "data": dashboard.get_application_activity_avg_image_load_time(project_id=projectId, **data.dict())}, + "data": metrics.get_application_activity_avg_image_load_time(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_page_load_time, - "data": dashboard.get_application_activity_avg_page_load_time(project_id=projectId, **data.dict())}, + "data": metrics.get_application_activity_avg_page_load_time(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_request_load_time, - "data": dashboard.get_application_activity_avg_request_load_time(project_id=projectId, **data.dict())}, + "data": metrics.get_application_activity_avg_request_load_time(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_dom_content_load_start, - "data": dashboard.get_page_metrics_avg_dom_content_load_start(project_id=projectId, **data.dict())}, + "data": metrics.get_page_metrics_avg_dom_content_load_start(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_first_contentful_pixel, - "data": dashboard.get_page_metrics_avg_first_contentful_pixel(project_id=projectId, **data.dict())}, + "data": metrics.get_page_metrics_avg_first_contentful_pixel(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_visited_pages, - "data": dashboard.get_user_activity_avg_visited_pages(project_id=projectId, **data.dict())}, + "data": metrics.get_user_activity_avg_visited_pages(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_session_duration, - "data": dashboard.get_user_activity_avg_session_duration(project_id=projectId, **data.dict())}, + "data": metrics.get_user_activity_avg_session_duration(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_pages_dom_buildtime, - "data": dashboard.get_pages_dom_build_time(project_id=projectId, **data.dict())}, + "data": metrics.get_pages_dom_build_time(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_pages_response_time, - "data": dashboard.get_pages_response_time(project_id=projectId, **data.dict())}, + "data": metrics.get_pages_response_time(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_response_time, - "data": dashboard.get_top_metrics_avg_response_time(project_id=projectId, **data.dict())}, + "data": metrics.get_top_metrics_avg_response_time(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_first_paint, - "data": dashboard.get_top_metrics_avg_first_paint(project_id=projectId, **data.dict())}, + "data": metrics.get_top_metrics_avg_first_paint(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_dom_content_loaded, - "data": dashboard.get_top_metrics_avg_dom_content_loaded(project_id=projectId, **data.dict())}, + "data": metrics.get_top_metrics_avg_dom_content_loaded(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_till_first_bit, - "data": dashboard.get_top_metrics_avg_till_first_bit(project_id=projectId, **data.dict())}, + "data": metrics.get_top_metrics_avg_till_first_bit(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_time_to_interactive, - "data": dashboard.get_top_metrics_avg_time_to_interactive(project_id=projectId, **data.dict())}, + "data": metrics.get_top_metrics_avg_time_to_interactive(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.count_requests, - "data": dashboard.get_top_metrics_count_requests(project_id=projectId, **data.dict())}, + "data": metrics.get_top_metrics_count_requests(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_time_to_render, - "data": dashboard.get_time_to_render(project_id=projectId, **data.dict())}, + "data": metrics.get_time_to_render(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_used_js_heap_size, - "data": dashboard.get_memory_consumption(project_id=projectId, **data.dict())}, + "data": metrics.get_memory_consumption(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_cpu, - "data": dashboard.get_avg_cpu(project_id=projectId, **data.dict())}, + "data": metrics.get_avg_cpu(project_id=projectId, **data.dict())}, {"key": schemas.TemplatePredefinedKeys.avg_fps, - "data": dashboard.get_avg_fps(project_id=projectId, **data.dict())} + "data": metrics.get_avg_fps(project_id=projectId, **data.dict())} ] results = sorted(results, key=lambda r: r["key"]) return {"data": results} diff --git a/api/routers/subs/metrics.py b/api/routers/subs/metrics.py index a5a1cede5..89bd131e5 100644 --- a/api/routers/subs/metrics.py +++ b/api/routers/subs/metrics.py @@ -12,17 +12,17 @@ public_app, app, app_apikey = get_routers() @app.put('/{projectId}/dashboards', tags=["dashboard"]) def create_dashboards(projectId: int, data: schemas.CreateDashboardSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - return dashboards2.create_dashboard(project_id=projectId, user_id=context.user_id, data=data) + return dashboards.create_dashboard(project_id=projectId, user_id=context.user_id, data=data) @app.get('/{projectId}/dashboards', tags=["dashboard"]) def get_dashboards(projectId: int, context: schemas.CurrentContext = Depends(OR_context)): - return {"data": dashboards2.get_dashboards(project_id=projectId, user_id=context.user_id)} + return {"data": dashboards.get_dashboards(project_id=projectId, user_id=context.user_id)} @app.get('/{projectId}/dashboards/{dashboardId}', tags=["dashboard"]) def get_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentContext = Depends(OR_context)): - data = dashboards2.get_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId) + data = dashboards.get_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId) if data is None: return {"errors": ["dashboard not found"]} return {"data": data} @@ -32,18 +32,18 @@ def get_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentCont @app.put('/{projectId}/dashboards/{dashboardId}', tags=["dashboard"]) def update_dashboard(projectId: int, dashboardId: int, data: schemas.EditDashboardSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - return {"data": dashboards2.update_dashboard(project_id=projectId, user_id=context.user_id, + return {"data": dashboards.update_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, data=data)} @app.delete('/{projectId}/dashboards/{dashboardId}', tags=["dashboard"]) def delete_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentContext = Depends(OR_context)): - return dashboards2.delete_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId) + return dashboards.delete_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId) @app.get('/{projectId}/dashboards/{dashboardId}/pin', tags=["dashboard"]) def pin_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentContext = Depends(OR_context)): - return {"data": dashboards2.pin_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId)} + return {"data": dashboards.pin_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId)} @app.post('/{projectId}/dashboards/{dashboardId}/widgets', tags=["dashboard"]) @@ -51,7 +51,7 @@ def pin_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentCont def add_widget_to_dashboard(projectId: int, dashboardId: int, data: schemas.AddWidgetToDashboardPayloadSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - return {"data": dashboards2.add_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, + return {"data": dashboards.add_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, data=data)} @@ -60,7 +60,7 @@ def add_widget_to_dashboard(projectId: int, dashboardId: int, def create_metric_and_add_to_dashboard(projectId: int, dashboardId: int, data: schemas.CreateCustomMetricsSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - return {"data": dashboards2.create_metric_add_widget(project_id=projectId, user_id=context.user_id, + return {"data": dashboards.create_metric_add_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, data=data)} @@ -69,14 +69,14 @@ def create_metric_and_add_to_dashboard(projectId: int, dashboardId: int, def update_widget_in_dashboard(projectId: int, dashboardId: int, widgetId: int, data: schemas.UpdateWidgetPayloadSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - return dashboards2.update_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, + return dashboards.update_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, widget_id=widgetId, data=data) @app.delete('/{projectId}/dashboards/{dashboardId}/widgets/{widgetId}', tags=["dashboard"]) def remove_widget_from_dashboard(projectId: int, dashboardId: int, widgetId: int, context: schemas.CurrentContext = Depends(OR_context)): - return dashboards2.remove_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, + return dashboards.remove_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, widget_id=widgetId) @@ -84,7 +84,7 @@ def remove_widget_from_dashboard(projectId: int, dashboardId: int, widgetId: int def get_widget_chart(projectId: int, dashboardId: int, widgetId: int, data: schemas.CustomMetricChartPayloadSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - data = dashboards2.make_chart_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, + data = dashboards.make_chart_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, widget_id=widgetId, data=data) if data is None: return {"errors": ["widget not found"]} @@ -93,7 +93,7 @@ def get_widget_chart(projectId: int, dashboardId: int, widgetId: int, @app.get('/{projectId}/metrics/templates', tags=["dashboard"]) def get_templates(projectId: int, context: schemas.CurrentContext = Depends(OR_context)): - return {"data": dashboards2.get_templates(project_id=projectId, user_id=context.user_id)} + return {"data": dashboards.get_templates(project_id=projectId, user_id=context.user_id)} @app.post('/{projectId}/metrics/try', tags=["dashboard"]) @@ -144,7 +144,7 @@ def get_custom_metric_sessions(projectId: int, metric_id: int, @app.post('/{projectId}/custom_metrics/{metric_id}/chart', tags=["customMetrics"]) def get_custom_metric_chart(projectId: int, metric_id: int, data: schemas.CustomMetricChartPayloadSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - data = dashboards2.make_chart_metrics(project_id=projectId, user_id=context.user_id, metric_id=metric_id, + data = dashboards.make_chart_metrics(project_id=projectId, user_id=context.user_id, metric_id=metric_id, data=data) if data is None: return {"errors": ["custom metric not found"]} diff --git a/ee/api/app.py b/ee/api/app.py index ed2c01aa4..0041ec12e 100644 --- a/ee/api/app.py +++ b/ee/api/app.py @@ -14,7 +14,7 @@ from routers import core, core_dynamic, ee, saml from routers.subs import v1_api from routers.crons import core_crons from routers.crons import core_dynamic_crons -from routers.subs import dashboard, insights, v1_api_ee +from routers.subs import dashboard, insights, metrics, v1_api_ee app = FastAPI() @@ -65,6 +65,7 @@ app.include_router(saml.public_app) app.include_router(saml.app) app.include_router(saml.app_apikey) app.include_router(dashboard.app) +app.include_router(metrics.app) app.include_router(insights.app) app.include_router(v1_api.app_apikey) app.include_router(v1_api_ee.app_apikey) diff --git a/ee/api/chalicelib/core/errors.py b/ee/api/chalicelib/core/errors.py index 84beb0c30..c7e066f8b 100644 --- a/ee/api/chalicelib/core/errors.py +++ b/ee/api/chalicelib/core/errors.py @@ -82,7 +82,7 @@ def __rearrange_chart_details(start_at, end_at, density, chart): chart = list(chart) for i in range(len(chart)): chart[i] = {"timestamp": chart[i][0], "count": chart[i][1]} - chart = dashboard.__complete_missing_steps(rows=chart, start_time=start_at, end_time=end_at, density=density, + chart = metrics.__complete_missing_steps(rows=chart, start_time=start_at, end_time=end_at, density=density, neutral={"count": 0}) return chart @@ -788,7 +788,7 @@ def search_deprecated(data: schemas.SearchErrorsSchema, project_id, user_id, flo r["chart"] = list(r["chart"]) for i in range(len(r["chart"])): r["chart"][i] = {"timestamp": r["chart"][i][0], "count": r["chart"][i][1]} - r["chart"] = dashboard.__complete_missing_steps(rows=r["chart"], start_time=data.startDate, + r["chart"] = metrics.__complete_missing_steps(rows=r["chart"], start_time=data.startDate, end_time=data.endDate, density=data.density, neutral={"count": 0}) offset = len(rows) diff --git a/ee/api/chalicelib/core/projects.py b/ee/api/chalicelib/core/projects.py index 0f2b62cc9..af5e0948e 100644 --- a/ee/api/chalicelib/core/projects.py +++ b/ee/api/chalicelib/core/projects.py @@ -187,6 +187,17 @@ def edit(tenant_id, user_id, project_id, data: schemas.CreateProjectSchema): changes={"name": data.name})} +def count_by_tenant(tenant_id): + with pg_client.PostgresClient() as cur: + cur.execute(cur.mogrify("""\ + SELECT + count(s.project_id) + FROM public.projects AS s + WHERE s.deleted_at IS NULL + AND tenant_id= %(tenant_id)s;""", {"tenant_id": tenant_id})) + return cur.fetchone()["count"] + + def delete(tenant_id, user_id, project_id): admin = users.get(user_id=user_id, tenant_id=tenant_id)