* refactor(chalice): upgraded dependencies refactor(crons): upgraded dependencies refactor(alerts): upgraded dependencies * fix(chalice): return error when updating inexistant webhook * feat(chalice): fixed delete webhook response * feat(chalice): limit webhooks name length * feat(chalice): upgraded dependencies feat(alerts): upgraded dependencies feat(crons): upgraded dependencies * fix(chalice): remove urllib3 dependency * feat(chalice): remove FOSS to pydantic v2 * fix(chalice): freeze urllib3 to not have conflicts between boto3 and requests * feat(chalice): refactoring schema in progress * feat(chalice): refactoring schema in progress * feat(chalice): refactoring schema in progress * feat(chalice): refactoring schema in progress feat(chalice): upgraded dependencies * feat(chalice): refactored schema * feat(DB): transfer size support * feat(chalice): support service account * feat(chalice): support service account * fix(chalice): fixed refactored PayloadSchema-name * feat(chalice): path analysis * feat(chalice): support service account 1/2 * feat(DB): timezone support * feat(chalice): upgraded dependencies feat(alerts): upgraded dependencies feat(crons): upgraded dependencies feat(assist): upgraded dependencies feat(sourcemaps): upgraded dependencies * feat(chalice): path analysis schema changes * feat(chalice): path analysis query change * feat(chalice): path analysis query change * feat(chalice): ios replay support * feat(chalice): ios replay support * feat(chalice): path analysis changes * feat(DB): ios events * feat(chalice): upgraded dependencies * feat(chalice): simple hide minor paths * feat(chalice): path analysis density * feat(chalice): session's replay ios events * feat(chalice): fixed typo * feat(chalice): support project's platform * feat(DB): support project's platform * feat(chalice): path analysis EE in progress * feat(chalice): project's platform API * feat(chalice): fixed create project * feat(chalice): EE path analysis in progress * feat(chalice): EE path analysis refactor(chalice): support specific database name for clickhouse-client * feat(chalice): upgraded dependencies feat(chalice): path analysis specific event type for startPoint feat(chalice): path analysis specific event type for endPoint feat(chalice): path analysis specific event type for exclude * refactoring(chalice): changed IOS click event type * refactoring(chalice): upgraded dependencies refactoring(alerts): upgraded dependencies refactoring(crons): upgraded dependencies refactoring(peers): upgraded dependencies refactoring(assist): upgraded dependencies refactoring(sourcemaps-reader): upgraded dependencies * refactoring(chalice): upgraded dependencies refactoring(alerts): upgraded dependencies refactoring(crons): upgraded dependencies refactoring(peers): upgraded dependencies refactoring(assist): upgraded dependencies refactoring(sourcemaps-reader): upgraded dependencies * feat(chalice): upgraded dependencies feat(alerts): upgraded dependencies feat(crons): upgraded dependencies * refactoring(chalice): refactored cards refactoring(chalice): upgraded dependencies * feat(chalice): get path-analysis issues list * feat(chalice): changed crash_ios feat(DB): changed crash_ios * fix(chalice): fix crashlooping * feat(chalice): support tap-rage feat(DB): support tap-rage * feat(chalice): Exp search support click-selector feat(DB): CH support click-selector * feat(chalice): refresh token feat(DB): refresh token * feat(chalice): refresh token changes * feat(chalice): fixed authorizer context attribute changes * feat(chalice): fixed refresh token path&age * feat(chalice): fixed refresh token RTR * feat(chalice): EE refresh token feat(DB): EE refresh token * feat(chalice): migrated EE refresh token * feat(chalice): fixed crashing changes * feat(chalice): fixed instant expiration * feat(chalice): fix * feat(chalice): fix * feat(chalice): fix * feat(chalice): refresh token debug * feat(chalice): refresh token debug * feat(chalice): refresh token debug * feat(chalice): fix refresh token path * feat(chalice): refresh token on signup * feat(DB): refresh token
270 lines
15 KiB
Python
270 lines
15 KiB
Python
from typing import Union
|
|
|
|
from fastapi import Body, Depends, Request
|
|
|
|
import schemas
|
|
from chalicelib.core import dashboards, custom_metrics, funnels
|
|
from or_dependencies import OR_context
|
|
from routers.base import get_routers
|
|
|
|
public_app, app, app_apikey = get_routers()
|
|
|
|
|
|
@app.post('/{projectId}/dashboards', tags=["dashboard"])
|
|
# @app.put('/{projectId}/dashboards', tags=["dashboard"])
|
|
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)):
|
|
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 = 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}
|
|
|
|
|
|
# @app.post('/{projectId}/dashboards/{dashboardId}', tags=["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)):
|
|
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, _=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)):
|
|
return {"data": dashboards.pin_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId)}
|
|
|
|
|
|
@app.post('/{projectId}/dashboards/{dashboardId}/cards', tags=["cards"])
|
|
# @app.post('/{projectId}/dashboards/{dashboardId}/widgets', tags=["dashboard"])
|
|
# @app.put('/{projectId}/dashboards/{dashboardId}/widgets', tags=["dashboard"])
|
|
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, user_id=context.user_id, dashboard_id=dashboardId,
|
|
data=data)}
|
|
|
|
|
|
@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)):
|
|
return {"data": dashboards.create_metric_add_widget(project_id=projectId, user_id=context.user_id,
|
|
dashboard_id=dashboardId, data=data)}
|
|
|
|
|
|
@app.post('/{projectId}/dashboards/{dashboardId}/widgets/{widgetId}', tags=["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)):
|
|
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, _=Body(None),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
return dashboards.remove_widget(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId,
|
|
widget_id=widgetId)
|
|
|
|
|
|
# @app.post('/{projectId}/dashboards/{dashboardId}/widgets/{widgetId}/chart', tags=["dashboard"])
|
|
# def get_widget_chart(projectId: int, dashboardId: int, widgetId: int,
|
|
# data: schemas.CardChartSchema = Body(...),
|
|
# context: schemas.CurrentContext = Depends(OR_context)):
|
|
# 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"]}
|
|
# return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/try', tags=["cards"])
|
|
# @app.post('/{projectId}/metrics/try', tags=["dashboard"])
|
|
# @app.put('/{projectId}/metrics/try', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/try', tags=["customMetrics"])
|
|
# @app.put('/{projectId}/custom_metrics/try', tags=["customMetrics"])
|
|
def try_card(projectId: int, data: schemas.CardSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
return {"data": custom_metrics.get_chart(project_id=projectId, data=data, user_id=context.user_id)}
|
|
|
|
|
|
@app.post('/{projectId}/cards/try/sessions', tags=["cards"])
|
|
# @app.post('/{projectId}/metrics/try/sessions', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/try/sessions', tags=["customMetrics"])
|
|
def try_card_sessions(projectId: int, data: schemas.CardSessionsSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
data = custom_metrics.get_sessions(project_id=projectId, user_id=context.user_id, data=data)
|
|
return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/try/issues', tags=["cards"])
|
|
# @app.post('/{projectId}/metrics/try/issues', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/try/issues', tags=["customMetrics"])
|
|
def try_card_issues(projectId: int, data: schemas.CardSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
return {"data": custom_metrics.get_issues(project_id=projectId, user_id=context.user_id, data=data)}
|
|
|
|
|
|
@app.get('/{projectId}/cards', tags=["cards"])
|
|
# @app.get('/{projectId}/metrics', tags=["dashboard"])
|
|
# @app.get('/{projectId}/custom_metrics', tags=["customMetrics"])
|
|
def get_cards(projectId: int, context: schemas.CurrentContext = Depends(OR_context)):
|
|
return {"data": custom_metrics.get_all(project_id=projectId, user_id=context.user_id)}
|
|
|
|
|
|
@app.post('/{projectId}/cards', tags=["cards"])
|
|
# @app.post('/{projectId}/metrics', tags=["dashboard"])
|
|
# @app.put('/{projectId}/metrics', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics', tags=["customMetrics"])
|
|
# @app.put('/{projectId}/custom_metrics', tags=["customMetrics"])
|
|
def create_card(projectId: int, data: schemas.CardSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
return custom_metrics.create_card(project_id=projectId, user_id=context.user_id, data=data)
|
|
|
|
|
|
@app.post('/{projectId}/cards/search', tags=["cards"])
|
|
# @app.post('/{projectId}/metrics/search', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/search', tags=["customMetrics"])
|
|
def search_cards(projectId: int, data: schemas.SearchCardsSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
return {"data": custom_metrics.search_all(project_id=projectId, user_id=context.user_id, data=data)}
|
|
|
|
|
|
@app.get('/{projectId}/cards/{metric_id}', tags=["cards"])
|
|
# @app.get('/{projectId}/metrics/{metric_id}', tags=["dashboard"])
|
|
# @app.get('/{projectId}/custom_metrics/{metric_id}', tags=["customMetrics"])
|
|
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:
|
|
return {"errors": ["invalid card_id"]}
|
|
data = custom_metrics.get_card(project_id=projectId, user_id=context.user_id, metric_id=metric_id)
|
|
if data is None:
|
|
return {"errors": ["card not found"]}
|
|
return {"data": data}
|
|
|
|
|
|
# @app.get('/{projectId}/cards/{metric_id}/thumbnail', tags=["cards"])
|
|
# def sign_thumbnail_for_upload(projectId: int, metric_id: Union[int, str],
|
|
# context: schemas.CurrentContext = Depends(OR_context)):
|
|
# if not isinstance(metric_id, int):
|
|
# return {"errors": ["invalid card_id"]}
|
|
# return custom_metrics.add_thumbnail(metric_id=metric_id, user_id=context.user_id, project_id=projectId)
|
|
|
|
|
|
@app.post('/{projectId}/cards/{metric_id}/sessions', tags=["cards"])
|
|
# @app.post('/{projectId}/metrics/{metric_id}/sessions', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/{metric_id}/sessions', tags=["customMetrics"])
|
|
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_id=projectId, user_id=context.user_id, metric_id=metric_id,
|
|
data=data)
|
|
if data is None:
|
|
return {"errors": ["custom metric not found"]}
|
|
return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/{metric_id}/issues', tags=["cards"])
|
|
# @app.post('/{projectId}/metrics/{metric_id}/issues', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/{metric_id}/issues', tags=["customMetrics"])
|
|
def get_card_funnel_issues(projectId: int, metric_id: Union[int, str],
|
|
data: schemas.CardSessionsSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
if metric_id.isnumeric():
|
|
metric_id = int(metric_id)
|
|
else:
|
|
return {"errors": ["invalid card_id"]}
|
|
|
|
data = custom_metrics.get_funnel_issues(project_id=projectId, user_id=context.user_id, metric_id=metric_id,
|
|
data=data)
|
|
if data is None:
|
|
return {"errors": ["custom metric not found"]}
|
|
return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/{metric_id}/issues/{issueId}/sessions', tags=["dashboard"])
|
|
# @app.post('/{projectId}/metrics/{metric_id}/issues/{issueId}/sessions', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/{metric_id}/issues/{issueId}/sessions', tags=["customMetrics"])
|
|
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,
|
|
metric_id=metric_id, issue_id=issueId, data=data)
|
|
if data is None:
|
|
return {"errors": ["custom metric not found"]}
|
|
return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/{metric_id}/errors', tags=["dashboard"])
|
|
# @app.post('/{projectId}/metrics/{metric_id}/errors', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/{metric_id}/errors', tags=["customMetrics"])
|
|
def get_custom_metric_errors_list(projectId: int, metric_id: int,
|
|
data: schemas.CardSessionsSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
data = custom_metrics.get_errors_list(project_id=projectId, user_id=context.user_id,
|
|
metric_id=metric_id, data=data)
|
|
if data is None:
|
|
return {"errors": ["custom metric not found"]}
|
|
return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/{metric_id}/chart', tags=["card"])
|
|
# @app.post('/{projectId}/metrics/{metric_id}/chart', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/{metric_id}/chart', tags=["customMetrics"])
|
|
def get_card_chart(projectId: int, metric_id: int, request: Request, data: schemas.CardSessionsSchema = Body(...),
|
|
context: schemas.CurrentContext = Depends(OR_context)):
|
|
data = custom_metrics.make_chart_from_card(project_id=projectId, user_id=context.user_id, metric_id=metric_id,
|
|
data=data)
|
|
return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/{metric_id}', tags=["dashboard"])
|
|
# @app.post('/{projectId}/metrics/{metric_id}', tags=["dashboard"])
|
|
# @app.put('/{projectId}/metrics/{metric_id}', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/{metric_id}', tags=["customMetrics"])
|
|
# @app.put('/{projectId}/custom_metrics/{metric_id}', tags=["customMetrics"])
|
|
def update_custom_metric(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)
|
|
if data is None:
|
|
return {"errors": ["custom metric not found"]}
|
|
return {"data": data}
|
|
|
|
|
|
@app.post('/{projectId}/cards/{metric_id}/status', tags=["dashboard"])
|
|
# @app.post('/{projectId}/metrics/{metric_id}/status', tags=["dashboard"])
|
|
# @app.put('/{projectId}/metrics/{metric_id}/status', tags=["dashboard"])
|
|
# @app.post('/{projectId}/custom_metrics/{metric_id}/status', tags=["customMetrics"])
|
|
# @app.put('/{projectId}/custom_metrics/{metric_id}/status', tags=["customMetrics"])
|
|
def update_custom_metric_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, user_id=context.user_id, metric_id=metric_id,
|
|
status=data.active)}
|
|
|
|
|
|
@app.delete('/{projectId}/cards/{metric_id}', tags=["dashboard"])
|
|
# @app.delete('/{projectId}/metrics/{metric_id}', tags=["dashboard"])
|
|
# @app.delete('/{projectId}/custom_metrics/{metric_id}', tags=["customMetrics"])
|
|
def delete_custom_metric(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)}
|