diff --git a/app/routers/v1/items/api_items.py b/app/routers/v1/items/api_items.py index 128b1ca..5300f48 100644 --- a/app/routers/v1/items/api_items.py +++ b/app/routers/v1/items/api_items.py @@ -48,7 +48,9 @@ from .crud_items import get_item_by_location from .crud_items import get_items_by_ids from .crud_items import get_items_by_location +from .crud_items import get_marked_items_by_username from .crud_items import mark_delete_item_by_id +from .crud_items import mark_restore_item_by_id from .crud_items import update_item from .crud_items import update_items from .dependencies import jwt_required @@ -151,18 +153,17 @@ async def mark_item_deleted( set_api_response_error(api_response, 'Failed to mark item as deleted', EAPIResponseCode.internal_error) return api_response.json_response() - @router.delete('batch/mark/') - async def mark_items_deleted( - self, ids: list[UUID] = Query(None), current_identity: dict = Depends(jwt_required) + @router.put('/mark/') + async def mark_item_restore( + self, id_: UUID = Query(None, alias='id'), current_identity: dict = Depends(jwt_required) ) -> JSONResponse: try: - api_response = DELETEItemResponse() - for id_ in ids: - mark_delete_item_by_id(id_, current_identity['username']) + api_response = PUTItemResponse() + mark_restore_item_by_id(id_) except EntityNotFoundException: - set_api_response_error(api_response, 'One or more items not found', EAPIResponseCode.not_found) + set_api_response_error(api_response, f'Failed to get item with id {id_}', EAPIResponseCode.not_found) except Exception: - set_api_response_error(api_response, 'Failed to mark items as deleted', EAPIResponseCode.internal_error) + set_api_response_error(api_response, 'Failed to mark item as deleted', EAPIResponseCode.internal_error) return api_response.json_response() @@ -234,6 +235,30 @@ async def delete_items_by_ids( set_api_response_error(api_response, 'Failed to delete items', EAPIResponseCode.not_found) return api_response.json_response() + @router_bulk.delete('/mark/') + async def mark_items_deleted( + self, ids: list[UUID] = Query(None), current_identity: dict = Depends(jwt_required) + ) -> JSONResponse: + try: + api_response = DELETEItemResponse() + for id_ in ids: + mark_delete_item_by_id(id_, current_identity['username']) + except EntityNotFoundException: + set_api_response_error(api_response, 'One or more items not found', EAPIResponseCode.not_found) + except Exception: + set_api_response_error(api_response, 'Failed to mark items as deleted', EAPIResponseCode.internal_error) + return api_response.json_response() + + @router_bulk.get('/mark/') + async def get_items_mark(self, current_identity: dict = Depends(jwt_required)) -> JSONResponse: + try: + api_response = GETItemResponse() + result = get_marked_items_by_username(current_identity['username']) + api_response.result = [combine_item_tables(item) for item in result] + except Exception: + set_api_response_error(api_response, 'Failed to get marked items', EAPIResponseCode.internal_error) + return api_response.json_response() + @router_bulk.put( '/batch/bequeath/', response_model=PUTItemsBequeathResponse, diff --git a/app/routers/v1/items/crud_items.py b/app/routers/v1/items/crud_items.py index c7bf2d5..e4efa20 100644 --- a/app/routers/v1/items/crud_items.py +++ b/app/routers/v1/items/crud_items.py @@ -212,6 +212,15 @@ def get_items_by_ids(params: GETItemsByIDs, ids: list[UUID], api_response: APIRe paginate(params, api_response, item_query, combine_item_tables) +def get_marked_items_by_username(deleted_by: str) -> list[tuple[ItemModel, StorageModel, ExtendedModel]]: + item_query = ( + db.session.query(ItemModel, StorageModel, ExtendedModel) + .join(StorageModel, ExtendedModel) + .filter(ItemModel.deleted_by == deleted_by, ItemModel.deleted.is_(True)) + ) + return item_query.all() + + async def get_items_by_location( # noqa: C901 params: GETItemsByLocation, api_response: APIResponse, current_identity: dict ): @@ -610,6 +619,17 @@ def mark_delete_item_by_id(id_: UUID, username: str): db.session.commit() +def mark_restore_item_by_id(id_: UUID): + item_query = db.session.query(ItemModel).filter(ItemModel.id == id_) + item_result = item_query.first() + if not item_result: + raise EntityNotFoundException() + item_result.deleted = False + item_result.deleted_by = None + item_result.deleted_at = None + db.session.commit() + + def delete_items_by_ids(ids: list[UUID], kafka_client: KafkaProducerClient, api_response: APIResponse): for id_ in ids: delete_item_by_id(id_, kafka_client, api_response) diff --git a/migrations/versions/b703f5750172_file_deletion.py b/migrations/versions/b703f5750172_file_deletion.py index 9c748d5..86b454b 100644 --- a/migrations/versions/b703f5750172_file_deletion.py +++ b/migrations/versions/b703f5750172_file_deletion.py @@ -35,7 +35,7 @@ def upgrade(): 'items', sa.Column( 'deleted_by', - sa.Boolean(), + sa.String(), nullable=True, server_default=sa.sql.null(), ), diff --git a/pyproject.toml b/pyproject.toml index 2ab5d6a..991e25f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "metadata" -version = "2.2.11" +version = "2.2.12" description = "Create and update file metadata" authors = ["Indoc Research"]