diff --git a/api/chalicelib/core/metrics/custom_metrics.py b/api/chalicelib/core/metrics/custom_metrics.py index 84c7aab3c..8c02d2be3 100644 --- a/api/chalicelib/core/metrics/custom_metrics.py +++ b/api/chalicelib/core/metrics/custom_metrics.py @@ -378,21 +378,6 @@ def search_metrics(project_id, user_id, data: schemas.MetricSearchSchema, includ ) with pg_client.PostgresClient() as cur: - count_query = cur.mogrify( - f"""SELECT COUNT(*) - FROM metrics - LEFT JOIN LATERAL ( - SELECT email AS owner_email, name AS owner_name - FROM users - WHERE deleted_at ISNULL - AND users.user_id = metrics.user_id - ) AS owner ON (TRUE) - WHERE {" AND ".join(constraints)};""", - params - ) - cur.execute(count_query) - total = cur.fetchone()["count"] - sub_join = "" if include_series: sub_join = """LEFT JOIN LATERAL ( @@ -402,7 +387,8 @@ def search_metrics(project_id, user_id, data: schemas.MetricSearchSchema, includ AND metric_series.deleted_at ISNULL ) AS metric_series ON (TRUE)""" - sort_column = data.sort.field if data.sort.field is not None else "created_at" + sort_column = data.sort.field if data.sort.field is not None and len(data.sort.field) > 0 \ + else "created_at" # change ascend to asc and descend to desc sort_order = data.sort.order.value if hasattr(data.sort.order, "value") else data.sort.order if sort_order == "ascend": @@ -411,7 +397,7 @@ def search_metrics(project_id, user_id, data: schemas.MetricSearchSchema, includ sort_order = "desc" query = cur.mogrify( - f"""SELECT metric_id, project_id, user_id, name, is_public, created_at, edited_at, + f"""SELECT count(1) OVER () AS total,metric_id, project_id, user_id, name, is_public, created_at, edited_at, metric_type, metric_of, metric_format, metric_value, view_type, is_pinned, dashboards, owner_email, owner_name, default_config AS config, thumbnail FROM metrics @@ -441,15 +427,21 @@ def search_metrics(project_id, user_id, data: schemas.MetricSearchSchema, includ ) cur.execute(query) rows = cur.fetchall() - if include_series: - for r in rows: - for s in r.get("series", []): - s["filter"] = helper.old_search_payload_to_flat(s["filter"]) + if len(rows) > 0: + total = rows[0]["total"] + if include_series: + for r in rows: + r.pop("total") + for s in r.get("series", []): + s["filter"] = helper.old_search_payload_to_flat(s["filter"]) + else: + for r in rows: + r.pop("total") + r["created_at"] = TimeUTC.datetime_to_timestamp(r["created_at"]) + r["edited_at"] = TimeUTC.datetime_to_timestamp(r["edited_at"]) + rows = helper.list_to_camel_case(rows) else: - for r in rows: - r["created_at"] = TimeUTC.datetime_to_timestamp(r["created_at"]) - r["edited_at"] = TimeUTC.datetime_to_timestamp(r["edited_at"]) - rows = helper.list_to_camel_case(rows) + total = 0 return {"total": total, "list": rows} diff --git a/api/routers/subs/metrics.py b/api/routers/subs/metrics.py index 558175069..d60280c49 100644 --- a/api/routers/subs/metrics.py +++ b/api/routers/subs/metrics.py @@ -10,31 +10,22 @@ public_app, app, app_apikey = get_routers() @app.post("/{projectId}/dashboards", tags=["dashboard"]) -def create_dashboards( - projectId: int, - data: schemas.CreateDashboardSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def create_dashboards(projectId: int, data: schemas.CreateDashboardSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): 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) -): +def get_dashboards(projectId: int, context: schemas.CurrentContext = Depends(OR_context)): 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), -): +def get_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentContext = Depends(OR_context)): data = dashboards.get_dashboard( project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId ) @@ -44,12 +35,8 @@ def get_dashboard( @app.put("/{projectId}/dashboards/{dashboardId}", tags=["dashboard"]) -def update_dashboard( - projectId: int, - dashboardId: int, - data: schemas.EditDashboardSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def update_dashboard(projectId: int, dashboardId: int, data: schemas.EditDashboardSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return { "data": dashboards.update_dashboard( project_id=projectId, @@ -61,23 +48,15 @@ def update_dashboard( @app.delete("/{projectId}/dashboards/{dashboardId}", tags=["dashboard"]) -def delete_dashboard( - projectId: int, - dashboardId: int, - _=Body(None), - context: schemas.CurrentContext = Depends(OR_context), -): +def delete_dashboard(projectId: int, dashboardId: int, _=Body(None), + context: schemas.CurrentContext = Depends(OR_context)): 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), -): +def pin_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentContext = Depends(OR_context)): return { "data": dashboards.pin_dashboard( project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId @@ -86,12 +65,8 @@ def pin_dashboard( @app.post("/{projectId}/dashboards/{dashboardId}/cards", tags=["cards"]) -def add_card_to_dashboard( - projectId: int, - dashboardId: int, - data: schemas.AddWidgetToDashboardPayloadSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def add_card_to_dashboard(projectId: int, dashboardId: int, data: schemas.AddWidgetToDashboardPayloadSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return { "data": dashboards.add_widget( project_id=projectId, @@ -104,12 +79,8 @@ def add_card_to_dashboard( @app.post("/{projectId}/dashboards/{dashboardId}/metrics", tags=["dashboard"]) # @app.put('/{projectId}/dashboards/{dashboardId}/metrics', tags=["dashboard"]) -def create_metric_and_add_to_dashboard( - projectId: int, - dashboardId: int, - data: schemas.CardSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def create_metric_and_add_to_dashboard(projectId: int, dashboardId: int, data: schemas.CardSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return { "data": dashboards.create_metric_add_widget( project=context.project, @@ -121,13 +92,9 @@ def create_metric_and_add_to_dashboard( @app.put("/{projectId}/dashboards/{dashboardId}/widgets/{widgetId}", tags=["dashboard"]) -def update_widget_in_dashboard( - projectId: int, - dashboardId: int, - widgetId: int, - data: schemas.UpdateWidgetPayloadSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def update_widget_in_dashboard(projectId: int, dashboardId: int, widgetId: int, + data: schemas.UpdateWidgetPayloadSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return dashboards.update_widget( project_id=projectId, user_id=context.user_id, @@ -137,16 +104,9 @@ def update_widget_in_dashboard( ) -@app.delete( - "/{projectId}/dashboards/{dashboardId}/widgets/{widgetId}", tags=["dashboard"] -) -def remove_widget_from_dashboard( - projectId: int, - dashboardId: int, - widgetId: int, - _=Body(None), - context: schemas.CurrentContext = Depends(OR_context), -): +@app.delete("/{projectId}/dashboards/{dashboardId}/widgets/{widgetId}", tags=["dashboard"]) +def remove_widget_from_dashboard(projectId: int, dashboardId: int, widgetId: int, _=Body(None), + context: schemas.CurrentContext = Depends(OR_context)): return dashboards.remove_widget( project_id=projectId, user_id=context.user_id, @@ -156,11 +116,8 @@ def remove_widget_from_dashboard( @app.post("/{projectId}/cards/try", tags=["cards"]) -def try_card( - projectId: int, - data: schemas.CardSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def try_card(projectId: int, data: schemas.CardSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return { "data": custom_metrics.get_chart( project=context.project, data=data, user_id=context.user_id @@ -169,11 +126,8 @@ def try_card( @app.post("/{projectId}/cards/try/sessions", tags=["cards"]) -def try_card_sessions( - projectId: int, - data: schemas.CardSessionsSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def try_card_sessions(projectId: int, data: schemas.CardSessionsSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): data = custom_metrics.get_sessions( project=context.project, user_id=context.user_id, data=data ) @@ -181,11 +135,8 @@ def try_card_sessions( @app.post("/{projectId}/cards/try/issues", tags=["cards"]) -def try_card_issues( - projectId: int, - data: schemas.CardSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def try_card_issues(projectId: int, data: schemas.CardSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return { "data": custom_metrics.get_issues( project=context.project, user_id=context.user_id, data=data @@ -201,22 +152,16 @@ def get_cards(projectId: int, context: schemas.CurrentContext = Depends(OR_conte @app.post("/{projectId}/cards", tags=["cards"]) -def create_card( - projectId: int, - data: schemas.CardSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def create_card(projectId: int, data: schemas.CardSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return custom_metrics.create_card( project=context.project, user_id=context.user_id, data=data ) @app.post("/{projectId}/cards/search", tags=["cards"]) -def search_cards( - projectId: int, - data: schemas.MetricSearchSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def search_cards(projectId: int, data: schemas.MetricSearchSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return { "data": custom_metrics.search_metrics( project_id=projectId, user_id=context.user_id, data=data @@ -225,11 +170,7 @@ def search_cards( @app.get("/{projectId}/cards/{metric_id}", tags=["cards"]) -def get_card( - projectId: int, - metric_id: Union[int, str], - context: schemas.CurrentContext = Depends(OR_context), -): +def get_card(projectId: int, metric_id: Union[int, str], context: schemas.CurrentContext = Depends(OR_context)): if metric_id.isnumeric(): metric_id = int(metric_id) else: @@ -243,12 +184,8 @@ def get_card( @app.post("/{projectId}/cards/{metric_id}/sessions", tags=["cards"]) -def get_card_sessions( - projectId: int, - metric_id: int, - data: schemas.CardSessionsSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def get_card_sessions(projectId: int, metric_id: int, data: schemas.CardSessionsSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): data = custom_metrics.get_sessions_by_card_id( project=context.project, user_id=context.user_id, metric_id=metric_id, data=data ) @@ -257,16 +194,10 @@ def get_card_sessions( return {"data": data} -@app.post( - "/{projectId}/cards/{metric_id}/issues/{issueId}/sessions", tags=["dashboard"] -) -def get_metric_funnel_issue_sessions( - projectId: int, - metric_id: int, - issueId: str, - data: schemas.CardSessionsSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +@app.post("/{projectId}/cards/{metric_id}/issues/{issueId}/sessions", tags=["dashboard"]) +def get_metric_funnel_issue_sessions(projectId: int, metric_id: int, issueId: str, + data: schemas.CardSessionsSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): data = custom_metrics.get_funnel_sessions_by_issue( project_id=projectId, user_id=context.user_id, @@ -280,12 +211,8 @@ def get_metric_funnel_issue_sessions( @app.post("/{projectId}/cards/{metric_id}/chart", tags=["card"]) -def get_card_chart( - projectId: int, - metric_id: int, - data: schemas.CardSessionsSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def get_card_chart(projectId: int, metric_id: int, data: schemas.CardSessionsSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): data = custom_metrics.make_chart_from_card( project=context.project, user_id=context.user_id, metric_id=metric_id, data=data ) @@ -293,12 +220,8 @@ def get_card_chart( @app.post("/{projectId}/cards/{metric_id}", tags=["dashboard"]) -def update_card( - projectId: int, - metric_id: int, - data: schemas.CardSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def update_card(projectId: int, metric_id: int, data: schemas.CardSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): data = custom_metrics.update_card( project_id=projectId, user_id=context.user_id, metric_id=metric_id, data=data ) @@ -308,12 +231,8 @@ def update_card( @app.post("/{projectId}/cards/{metric_id}/status", tags=["dashboard"]) -def update_card_state( - projectId: int, - metric_id: int, - data: schemas.UpdateCardStatusSchema = Body(...), - context: schemas.CurrentContext = Depends(OR_context), -): +def update_card_state(projectId: int, metric_id: int, data: schemas.UpdateCardStatusSchema = Body(...), + context: schemas.CurrentContext = Depends(OR_context)): return { "data": custom_metrics.change_state( project_id=projectId, @@ -325,12 +244,7 @@ def update_card_state( @app.delete("/{projectId}/cards/{metric_id}", tags=["dashboard"]) -def delete_card( - projectId: int, - metric_id: int, - _=Body(None), - context: schemas.CurrentContext = Depends(OR_context), -): +def delete_card(projectId: int, metric_id: int, _=Body(None), context: schemas.CurrentContext = Depends(OR_context)): return { "data": custom_metrics.delete_card( project_id=projectId, user_id=context.user_id, metric_id=metric_id