89 lines
5 KiB
Python
89 lines
5 KiB
Python
import json
|
|
|
|
import schemas
|
|
from chalicelib.utils import helper
|
|
from chalicelib.utils import pg_client
|
|
|
|
|
|
def create_dashboard(project_id, user_id, data: schemas.CreateDashboardSchema):
|
|
with pg_client.PostgresClient() as cur:
|
|
pg_query = f"""INSERT INTO dashboards(project_id, user_id, name, is_public, is_pinned)
|
|
VALUES(%(projectId)s, %(userId)s, %(name)s, %(is_public)s, %(is_pinned)s)
|
|
RETURNING *;"""
|
|
params = {"userId": user_id, "projectId": project_id, **data.dict()}
|
|
cur.execute(cur.mogrify(pg_query, params))
|
|
row = cur.fetchone()
|
|
return helper.dict_to_camel_case(row)
|
|
|
|
|
|
def get_dashboards(project_id, user_id):
|
|
with pg_client.PostgresClient() as cur:
|
|
pg_query = f"""SELECT *
|
|
FROM dashboards
|
|
WHERE deleted_at ISNULL
|
|
AND project_id = %(projectId)s
|
|
AND (user_id = %(userId)s OR is_public);"""
|
|
params = {"userId": user_id, "projectId": project_id}
|
|
cur.execute(cur.mogrify(pg_query, params))
|
|
rows = cur.fetchall()
|
|
return helper.list_to_camel_case(rows)
|
|
|
|
|
|
def get_dashboard(project_id, user_id, dashboard_id):
|
|
with pg_client.PostgresClient() as cur:
|
|
pg_query = """SELECT dashboards.*, all_template_widgets.widgets AS template_widgets, all_metric_widgets.widgets AS metric_widgets
|
|
FROM dashboards
|
|
LEFT JOIN LATERAL (SELECT COALESCE(JSONB_AGG(templates), '[]'::jsonb) AS widgets
|
|
FROM templates
|
|
INNER JOIN dashboard_widgets USING (template_id)
|
|
WHERE dashboard_widgets.dashboard_id = dashboards.dashboard_id
|
|
) AS all_template_widgets ON (TRUE)
|
|
LEFT JOIN LATERAL (SELECT COALESCE(JSONB_AGG(raw_metrics), '[]') AS widgets
|
|
FROM (SELECT metrics.*, metric_series.series
|
|
FROM metrics
|
|
INNER JOIN dashboard_widgets USING (metric_id)
|
|
LEFT JOIN LATERAL (SELECT JSONB_AGG(metric_series.* ORDER BY index) AS series
|
|
FROM metric_series
|
|
WHERE metric_series.metric_id = metrics.metric_id
|
|
AND metric_series.deleted_at ISNULL
|
|
) AS metric_series ON (TRUE)
|
|
WHERE dashboard_widgets.dashboard_id = dashboards.dashboard_id
|
|
AND metrics.deleted_at ISNULL
|
|
AND metrics.project_id = %(projectId)s) AS raw_metrics
|
|
) AS all_metric_widgets ON (TRUE)
|
|
WHERE dashboards.deleted_at ISNULL
|
|
AND dashboards.project_id = %(projectId)s
|
|
AND dashboard_id = %(dashboard_id)s
|
|
AND (dashboards.user_id = %(userId)s OR is_public);"""
|
|
params = {"userId": user_id, "projectId": project_id, "dashboard_id": dashboard_id}
|
|
print(cur.mogrify(pg_query, params))
|
|
cur.execute(cur.mogrify(pg_query, params))
|
|
row = cur.fetchone()
|
|
row["widgets"] = row.pop("template_widgets") + row.pop("metric_widgets")
|
|
return helper.dict_to_camel_case(row)
|
|
|
|
|
|
def add_widget(project_id, user_id, dashboard_id, data: schemas.AddWidgetToDashboardPayloadSchema):
|
|
ref_key = "metric_id"
|
|
if data.template_id is not None:
|
|
ref_key = "template_id"
|
|
with pg_client.PostgresClient() as cur:
|
|
pg_query = f"""INSERT INTO dashboard_widgets(dashboard_id, {ref_key}, user_id, configuration, name)
|
|
VALUES (%(dashboard_id)s, %({ref_key})s, %(userId)s, %(configuration)s::jsonb, %(name)s)
|
|
RETURNING *;"""
|
|
params = {"userId": user_id, "projectId": project_id, "dashboard_id": dashboard_id, **data.dict()}
|
|
params["configuration"] = json.dumps(params.get("configuration", {}))
|
|
cur.execute(cur.mogrify(pg_query, params))
|
|
row = cur.fetchone()
|
|
return helper.dict_to_camel_case(row)
|
|
|
|
# def get_widgets(project_id):
|
|
# with pg_client.PostgresClient() as cur:
|
|
# pg_query = f"""SELECT *
|
|
# FROM widgets
|
|
# WHERE deleted_at ISNULL
|
|
# AND project_id = %(projectId)s;"""
|
|
# params = {"projectId": project_id}
|
|
# cur.execute(cur.mogrify(pg_query, params))
|
|
# rows = cur.fetchall()
|
|
# return helper.list_to_camel_case(rows)
|