Now with some soft delete options for safer operations.

This commit is contained in:
Scott Idem
2026-01-05 19:49:28 -05:00
parent 3790983b5e
commit 314a031dd1
2 changed files with 43 additions and 10 deletions

View File

@@ -450,6 +450,7 @@ async def delete_obj(
response: Response,
obj_type_l1: str = Path(min_length=2, max_length=50),
obj_id: str = Path(min_length=11, max_length=22),
method: str = Query('delete', regex='^(delete|hide|disable)$', description="Deletion method: delete (hard), hide (soft), disable (soft)"),
account: AccountContext = Depends(get_account_context),
delay: DelayParams = Depends(get_delay_params),
):
@@ -457,8 +458,9 @@ async def delete_obj(
Delete a top-level object.
Soft Delete:
- Note that 'sql_delete' may implement soft-delete behavior depending on the
'method' query parameter (delete, disable, hide), matching legacy behavior.
- Use 'method=hide' to set 'hide=True'.
- Use 'method=disable' to set 'enable=False'.
- Default is 'method=delete' (hard database delete).
"""
if delay.sleep_time_s > 0:
await asyncio.sleep(delay.sleep_time_s)
@@ -480,10 +482,22 @@ async def delete_obj(
if not record_id:
return mk_resp(data=False, status_code=404, response=response, status_message=f"Object with ID '{obj_id}' not found.")
if sql_delete_result := sql_delete(table_name=table_name_delete, record_id=record_id):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{obj_id}' deleted successfully.")
if method == 'hide':
if sql_update(table_name=table_name_delete, record_id=record_id, data={'hide': True}):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{obj_id}' hidden successfully.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to hide object. It may not support the 'hide' field.")
elif method == 'disable':
if sql_update(table_name=table_name_delete, record_id=record_id, data={'enable': False}):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{obj_id}' disabled successfully.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to disable object. It may not support the 'enable' field.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to delete object in database. It may not have been found.")
# Default: hard delete
if sql_delete_result := sql_delete(table_name=table_name_delete, record_id=record_id):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{obj_id}' deleted successfully.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to delete object in database. It may not have been found.")
@router.get('/{parent_obj_type}/{parent_obj_id}/{child_obj_type}/', response_model=Resp_Body_Base)
@@ -811,6 +825,7 @@ async def delete_child_obj(
parent_obj_id: str = Path(min_length=11, max_length=22),
child_obj_type: str = Path(min_length=2, max_length=50),
child_obj_id: str = Path(min_length=11, max_length=22),
method: str = Query('delete', regex='^(delete|hide|disable)$', description="Deletion method: delete (hard), hide (soft), disable (soft)"),
account: AccountContext = Depends(get_account_context),
delay: DelayParams = Depends(get_delay_params),
):
@@ -819,6 +834,11 @@ async def delete_child_obj(
Safety:
- Enforces parentage verification before deletion to prevent unauthorized data removal.
Soft Delete:
- Use 'method=hide' to set 'hide=True'.
- Use 'method=disable' to set 'enable=False'.
- Default is 'method=delete' (hard database delete).
"""
if delay.sleep_time_s > 0:
await asyncio.sleep(delay.sleep_time_s)
@@ -859,11 +879,22 @@ async def delete_child_obj(
else:
return mk_resp(data=False, status_code=404, response=response, status_message=f"Child object '{child_obj_id}' not found.")
# If verification passes, delete the object
if sql_delete(table_name=table_name_delete, record_id=resolved_child_id):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{child_obj_id}' deleted successfully.")
if method == 'hide':
if sql_update(table_name=table_name_delete, record_id=resolved_child_id, data={'hide': True}):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{child_obj_id}' hidden successfully.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to hide object. It may not support the 'hide' field.")
elif method == 'disable':
if sql_update(table_name=table_name_delete, record_id=resolved_child_id, data={'enable': False}):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{child_obj_id}' disabled successfully.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to disable object. It may not support the 'enable' field.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to delete object in database.")
# Default: hard delete
if sql_delete(table_name=table_name_delete, record_id=resolved_child_id):
return mk_resp(data=True, response=response, status_message=f"Object with ID '{child_obj_id}' deleted successfully.")
else:
return mk_resp(data=False, status_code=400, response=response, status_message="Failed to delete object in database.")
log.setLevel(logging.WARNING)
log.debug(locals())