Improvements upon api and database api

This commit is contained in:
Andrew 2023-04-28 02:13:25 +07:00
parent 34ae028698
commit dc6ba8f462
4 changed files with 95 additions and 7 deletions

61
app.py
View file

@ -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(

View file

@ -117,4 +117,4 @@ class Asset(BaseModel):
name: str
description: str
fid: str
catalog: str
tags: str

34
dba.py
View file

@ -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 []

View file

@ -55,3 +55,8 @@ class AccessTokenResponse(BaseModel):
class CreateAssetResponse(BaseModel):
ok: bool = True
fid: str
class AssetUpdateDefinition(BaseModel):
description: str
tags: list[str]