From 3d5355ef52191f2c060ba9121d271d40fafeff7d Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 18 Nov 2022 12:22:45 +0100 Subject: [PATCH] feat(chalice): changed save record logic feat(chalice): fixed update record --- ee/api/chalicelib/core/assist_records.py | 35 +++++++++++++++++------- ee/api/routers/ee.py | 11 ++++++-- ee/api/schemas_ee.py | 4 +++ 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/ee/api/chalicelib/core/assist_records.py b/ee/api/chalicelib/core/assist_records.py index c7311eb07..145c97c47 100644 --- a/ee/api/chalicelib/core/assist_records.py +++ b/ee/api/chalicelib/core/assist_records.py @@ -6,18 +6,29 @@ from chalicelib.utils import s3, pg_client, helper from chalicelib.utils.TimeUTC import TimeUTC -def presign_records(project_id, data: schemas_ee.AssistRecordPayloadSchema, context: schemas_ee.CurrentContext): - params = {"user_id": context.user_id, "project_id": project_id, **data.dict()} - +def presign_record(project_id, data: schemas_ee.AssistRecordPayloadSchema, context: schemas_ee.CurrentContext): key = s3.generate_file_key(project_id=project_id, key=f"{TimeUTC.now()}-{data.name}") presigned_url = s3.get_presigned_url_for_upload(bucket=config('ASSIST_RECORDS_BUCKET'), expires_in=1800, key=key) - params["key"] = key + return {"URL": presigned_url, "key": presigned_url} + + +def save_record(project_id, data: schemas_ee.AssistRecordSavePayloadSchema, context: schemas_ee.CurrentContext): + params = {"user_id": context.user_id, "project_id": project_id, **data.dict()} with pg_client.PostgresClient() as cur: - query = cur.mogrify(f"""INSERT INTO assist_records(project_id, user_id, name, file_key, duration, session_id) - VALUES (%(project_id)s, %(user_id)s, %(name)s, %(key)s, - %(duration)s, %(session_id)s);""", params) + query = cur.mogrify( + f"""INSERT INTO assist_records(project_id, user_id, name, file_key, duration, session_id) + VALUES (%(project_id)s, %(user_id)s, %(name)s, %(key)s,%(duration)s, %(session_id)s) + RETURNING record_id, user_id, session_id, created_at, name, duration, + (SELECT name FROM users WHERE users.user_id = %(user_id)s LIMIT 1) AS created_by, file_key;""", + params) cur.execute(query) - return presigned_url + result = helper.dict_to_camel_case(cur.fetchone()) + result["URL"] = s3.client.generate_presigned_url( + 'get_object', + Params={'Bucket': config("ASSIST_RECORDS_BUCKET"), 'Key': result.pop("fileKey")}, + ExpiresIn=config("PRESIGNED_URL_EXPIRATION", cast=int, default=900) + ) + return result def search_records(project_id, data: schemas_ee.AssistRecordSearchPayloadSchema, context: schemas_ee.CurrentContext): @@ -84,10 +95,14 @@ def update_record(project_id, record_id, data: schemas_ee.AssistRecordUpdatePayl with pg_client.PostgresClient() as cur: query = cur.mogrify(f"""UPDATE assist_records SET name= %(name)s + FROM (SELECT users.name AS created_by + FROM assist_records INNER JOIN users USING (user_id) + WHERE record_id = %(record_id)s + AND assist_records.deleted_at ISNULL + LIMIT 1) AS users WHERE {" AND ".join(conditions)} RETURNING record_id, user_id, session_id, assist_records.created_at, - assist_records.name, duration, users.name AS created_by, - file_key;""", params) + assist_records.name, duration, created_by, file_key;""", params) cur.execute(query) result = helper.dict_to_camel_case(cur.fetchone()) if not result: diff --git a/ee/api/routers/ee.py b/ee/api/routers/ee.py index 076f4fd36..b56ddd370 100644 --- a/ee/api/routers/ee.py +++ b/ee/api/routers/ee.py @@ -74,13 +74,20 @@ def get_available_trail_actions(context: schemas_ee.CurrentContext = Depends(OR_ return {'data': traces.get_available_actions(tenant_id=context.tenant_id)} -@app.put('/{projectId}/assist/save/', tags=["assist"]) @app.put('/{projectId}/assist/save', tags=["assist"]) def sign_record_for_upload(projectId: int, data: schemas_ee.AssistRecordPayloadSchema = Body(...), context: schemas_ee.CurrentContext = Depends(OR_context)): if not sessions.session_exists(project_id=projectId, session_id=data.session_id): return {"errors": ["Session not found"]} - return {"data": {"URL": assist_records.presign_records(project_id=projectId, data=data, context=context)}} + return {"data": assist_records.presign_record(project_id=projectId, data=data, context=context)} + + +@app.put('/{projectId}/assist/save/done', tags=["assist"]) +def save_record_after_upload(projectId: int, data: schemas_ee.AssistRecordSavePayloadSchema = Body(...), + context: schemas_ee.CurrentContext = Depends(OR_context)): + if not sessions.session_exists(project_id=projectId, session_id=data.session_id): + return {"errors": ["Session not found"]} + return {"data": {"URL": assist_records.save_record(project_id=projectId, data=data, context=context)}} @app.post('/{projectId}/assist/records', tags=["assist"]) diff --git a/ee/api/schemas_ee.py b/ee/api/schemas_ee.py index 22712a29f..afa4230b6 100644 --- a/ee/api/schemas_ee.py +++ b/ee/api/schemas_ee.py @@ -95,6 +95,10 @@ class AssistRecordPayloadSchema(AssistRecordUpdatePayloadSchema): alias_generator = schemas.attribute_to_camel_case +class AssistRecordSavePayloadSchema(AssistRecordPayloadSchema): + key: str = Field(...) + + class AssistRecordSearchPayloadSchema(schemas._PaginatedSchema): limit: int = Field(default=200, gt=0) startDate: int = Field(default=TimeUTC.now(-7))