* feat(DB): rearranged queries feat(DB): ready for v1.15.0 * 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 * fix(chalice): pull rebase dev * 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(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
111 lines
4.1 KiB
Python
111 lines
4.1 KiB
Python
import json
|
|
|
|
import schemas
|
|
from chalicelib.utils import helper, pg_client
|
|
from chalicelib.utils.TimeUTC import TimeUTC
|
|
|
|
|
|
def create(project_id, user_id, data: schemas.SavedSearchSchema):
|
|
with pg_client.PostgresClient() as cur:
|
|
data = data.model_dump()
|
|
data["filter"] = json.dumps(data["filter"])
|
|
query = cur.mogrify("""\
|
|
INSERT INTO public.searches (project_id, user_id, name, filter,is_public)
|
|
VALUES (%(project_id)s, %(user_id)s, %(name)s, %(filter)s::jsonb,%(is_public)s)
|
|
RETURNING *;""", {"user_id": user_id, "project_id": project_id, **data})
|
|
cur.execute(
|
|
query
|
|
)
|
|
r = cur.fetchone()
|
|
r["created_at"] = TimeUTC.datetime_to_timestamp(r["created_at"])
|
|
r["filter"] = helper.old_search_payload_to_flat(r["filter"])
|
|
r = helper.dict_to_camel_case(r)
|
|
return {"data": r}
|
|
|
|
|
|
def update(search_id, project_id, user_id, data: schemas.SavedSearchSchema):
|
|
with pg_client.PostgresClient() as cur:
|
|
data = data.model_dump()
|
|
data["filter"] = json.dumps(data["filter"])
|
|
query = cur.mogrify(f"""\
|
|
UPDATE public.searches
|
|
SET name = %(name)s,
|
|
filter = %(filter)s,
|
|
is_public = %(is_public)s
|
|
WHERE search_id=%(search_id)s
|
|
AND project_id= %(project_id)s
|
|
AND (user_id = %(user_id)s OR is_public)
|
|
RETURNING *;""", {"search_id": search_id, "project_id": project_id, "user_id": user_id, **data})
|
|
cur.execute(
|
|
query
|
|
)
|
|
r = cur.fetchone()
|
|
r["created_at"] = TimeUTC.datetime_to_timestamp(r["created_at"])
|
|
r["filter"] = helper.old_search_payload_to_flat(r["filter"])
|
|
r = helper.dict_to_camel_case(r)
|
|
return r
|
|
|
|
|
|
def get_all(project_id, user_id, details=False):
|
|
with pg_client.PostgresClient() as cur:
|
|
cur.execute(
|
|
cur.mogrify(
|
|
f"""\
|
|
SELECT search_id, project_id, user_id, name, created_at, deleted_at, is_public
|
|
{",filter" if details else ""}
|
|
FROM public.searches
|
|
WHERE project_id = %(project_id)s
|
|
AND deleted_at IS NULL
|
|
AND (user_id = %(user_id)s OR is_public);""",
|
|
{"project_id": project_id, "user_id": user_id}
|
|
)
|
|
)
|
|
|
|
rows = cur.fetchall()
|
|
rows = helper.list_to_camel_case(rows)
|
|
for row in rows:
|
|
row["createdAt"] = TimeUTC.datetime_to_timestamp(row["createdAt"])
|
|
if details:
|
|
if isinstance(row["filter"], list) and len(row["filter"]) == 0:
|
|
row["filter"] = {}
|
|
row["filter"] = helper.old_search_payload_to_flat(row["filter"])
|
|
return rows
|
|
|
|
|
|
def delete(project_id, search_id, user_id):
|
|
with pg_client.PostgresClient() as cur:
|
|
cur.execute(
|
|
cur.mogrify("""\
|
|
UPDATE public.searches
|
|
SET deleted_at = timezone('utc'::text, now())
|
|
WHERE project_id = %(project_id)s
|
|
AND search_id = %(search_id)s
|
|
AND (user_id = %(user_id)s OR is_public);""",
|
|
{"search_id": search_id, "project_id": project_id, "user_id": user_id})
|
|
)
|
|
|
|
return {"state": "success"}
|
|
|
|
|
|
def get(search_id, project_id, user_id):
|
|
with pg_client.PostgresClient() as cur:
|
|
cur.execute(
|
|
cur.mogrify(
|
|
"""SELECT
|
|
*
|
|
FROM public.searches
|
|
WHERE project_id = %(project_id)s
|
|
AND deleted_at IS NULL
|
|
AND search_id = %(search_id)s
|
|
AND (user_id = %(user_id)s OR is_public);""",
|
|
{"search_id": search_id, "project_id": project_id, "user_id": user_id}
|
|
)
|
|
)
|
|
|
|
f = helper.dict_to_camel_case(cur.fetchone())
|
|
if f is None:
|
|
return None
|
|
|
|
f["createdAt"] = TimeUTC.datetime_to_timestamp(f["createdAt"])
|
|
f["filter"] = helper.old_search_payload_to_flat(f["filter"])
|
|
return f
|