From dc6ba8f462f72261237645246592b52e709ac0a3 Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Fri, 28 Apr 2023 02:13:25 +0700 Subject: [PATCH] Improvements upon api and database api --- app.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++---- db_models.py | 2 +- dba.py | 34 +++++++++++++++++++++++++++-- models.py | 5 +++++ 4 files changed, 95 insertions(+), 7 deletions(-) diff --git a/app.py b/app.py index b920842..63c430c 100644 --- a/app.py +++ b/app.py @@ -13,6 +13,7 @@ import uvicorn from dba import * from models import ( + AssetUpdateDefinition, AuthModel, ColumnConditionCompat, CreateUserDefinition, @@ -719,6 +720,58 @@ async def itemsDelete( return OkResponse() +@app.get( + "/assets", + name="Get assets", + responses={ + 200: { + "model": list[Asset], + "description": "List of assets", + }, + 403: { + "model": ErrorResponse, + "description": "Requesting this endpoint requires admin access token", + }, + }, +) +async def getAssets(access_token: str | None = Header(default=None)): + is_admin = check_if_admin_access_token(connector, access_token) + if not is_admin: + return JSONResponse( + ErrorResponse(error="Not allowed").dict(), + status_code=status.HTTP_403_FORBIDDEN, + ) + + assets = get_assets(connector) + return assets + + +@app.get( + "/assets/tags", + name="Get assets tags", + responses={ + 200: { + "model": list[str], + "description": "List of assets tags", + }, + 403: { + "model": ErrorResponse, + "description": "Requesting this endpoint requires admin access token", + }, + }, +) +async def getAssetsTags(access_token: str | None = Header(default=None)): + is_admin = check_if_admin_access_token(connector, access_token) + if not is_admin: + return JSONResponse( + ErrorResponse(error="Not allowed").dict(), + status_code=status.HTTP_403_FORBIDDEN, + ) + + assets = get_assets_tags(connector) + return assets + + @app.get( "/assets/{fid}", name="Get asset", @@ -824,11 +877,11 @@ async def createAsset( @app.post( "/assets/{asset_id}/*", - name="Update asset description", + name="Update asset description and tags", responses={ 200: { "model": OkResponse, - "description": "Asset description updated successfully", + "description": "Asset description and tags updated successfully", }, 400: { "model": ErrorResponse, @@ -846,7 +899,7 @@ async def createAsset( ) async def updateAsset( asset_id: int, - asset_description: str, + asset_update: AssetUpdateDefinition, access_token: str | None = Header(default=None), ): user = get_user_by_access_token(connector, access_token) @@ -856,7 +909,7 @@ async def updateAsset( status_code=status.HTTP_403_FORBIDDEN, ) - ok, e = update_asset(connector, asset_id, asset_description) + ok, e = update_asset(connector, asset_id, asset_update.description, asset_update.tags) if not ok: if e: return JSONResponse( diff --git a/db_models.py b/db_models.py index 2f6de26..e2ce0bb 100644 --- a/db_models.py +++ b/db_models.py @@ -117,4 +117,4 @@ class Asset(BaseModel): name: str description: str fid: str - catalog: str + tags: str diff --git a/dba.py b/dba.py index bb228bc..89911e3 100644 --- a/dba.py +++ b/dba.py @@ -450,11 +450,16 @@ def create_asset(conn: DBConnector, name: str, description: str, fid: str): return False, None -def update_asset(conn: DBConnector, asset_id: int, asset_description: str): +def update_asset( + conn: DBConnector, asset_id: int, asset_description: str, asset_tags: list[str] +): try: conn.updateDataInTable( ASSETS_TABLE_NAME, - [ColumnUpdate("description", asset_description)], + [ + ColumnUpdate("description", asset_description), + ColumnUpdate("tags", ",".join(asset_tags)), + ], [ColumnCondition("id", "eq", asset_id)], ) return True, None @@ -527,3 +532,28 @@ def get_asset_by_id(conn: DBConnector, asset_id: int): except Exception as e: logger.exception(e) return None + + +def get_assets(conn: DBConnector) -> list[Asset]: + try: + assets = conn.selectFromTable(ASSETS_TABLE_NAME, ["*"]) + if not assets: + return [] + return [Asset.parse_obj(asset) for asset in assets] + except Exception as e: + logger.exception(e) + return [] + + +def get_assets_tags(conn: DBConnector) -> list[str]: + try: + with conn.connection as connection: + with connection.cursor() as cursor: + tags = cursor.execute( + f"SELECT DISTINCT unnest(string_to_array(tags, ',')) FROM {ASSETS_TABLE_NAME}" + ).fetchall() + + return [tag["unnest"] for tag in tags] + except Exception as e: + logger.exception(e) + return [] diff --git a/models.py b/models.py index 126a02a..bdfacad 100644 --- a/models.py +++ b/models.py @@ -55,3 +55,8 @@ class AccessTokenResponse(BaseModel): class CreateAssetResponse(BaseModel): ok: bool = True fid: str + + +class AssetUpdateDefinition(BaseModel): + description: str + tags: list[str]