|
40 | 40 | MkdirPayload, |
41 | 41 | MoveFilePayload, |
42 | 42 | PurgeVFolderPayload, |
| 43 | + RestoreVFolderPayload, |
43 | 44 | SearchVFoldersPayload, |
44 | 45 | VFolderNode, |
45 | 46 | ) |
|
93 | 94 | combine_conditions_or, |
94 | 95 | negate_conditions, |
95 | 96 | ) |
| 97 | +from ai.backend.manager.repositories.base.updater import Updater |
96 | 98 | from ai.backend.manager.repositories.vfolder.types import ( |
97 | 99 | ProjectVFolderSearchScope, |
98 | 100 | UserVFolderSearchScope, |
99 | 101 | ) |
| 102 | +from ai.backend.manager.repositories.vfolder.updaters import VFolderTrashUpdaterSpec |
100 | 103 | from ai.backend.manager.services.deployment.actions.create_deployment import CreateDeploymentAction |
101 | 104 | from ai.backend.manager.services.vfolder.actions.admin_search_vfolders import ( |
102 | 105 | AdminSearchVFoldersAction, |
103 | 106 | ) |
| 107 | +from ai.backend.manager.services.vfolder.actions.base import ( |
| 108 | + RestoreVFolderFromTrashAction, |
| 109 | +) |
104 | 110 | from ai.backend.manager.services.vfolder.actions.batch_load_by_ids import ( |
105 | 111 | BatchLoadVFoldersByIdsAction, |
106 | 112 | ) |
|
127 | 133 | DeleteVFolderV2Action, |
128 | 134 | PurgeVFolderV2Action, |
129 | 135 | ) |
| 136 | +from ai.backend.manager.services.vfolder.actions.vfolder_v2_rbac import ( |
| 137 | + DeleteVFolderV2RBACAction, |
| 138 | +) |
130 | 139 |
|
131 | 140 | from .base import BaseAdapter |
132 | 141 |
|
@@ -383,13 +392,23 @@ async def get(self, vfolder_id: UUID) -> VFolderNode: |
383 | 392 | return self._vfolder_data_to_node(result.vfolder) |
384 | 393 |
|
385 | 394 | async def delete(self, vfolder_id: UUID) -> DeleteVFolderPayload: |
386 | | - """Soft-delete a vfolder (move to trash).""" |
| 395 | + """Soft-delete a vfolder (move to trash). RBAC enforced.""" |
| 396 | + updater = Updater(spec=VFolderTrashUpdaterSpec(), pk_value=vfolder_id) |
| 397 | + action = DeleteVFolderV2RBACAction(vfolder_id=vfolder_id, updater=updater) |
| 398 | + await self._processors.vfolder.delete_v2_rbac.wait_for_complete(action) |
| 399 | + return DeleteVFolderPayload(id=vfolder_id) |
| 400 | + |
| 401 | + async def restore(self, vfolder_id: UUID) -> RestoreVFolderPayload: |
| 402 | + """Restore a trashed vfolder. RBAC enforced.""" |
387 | 403 | me = current_user() |
388 | 404 | if me is None: |
389 | 405 | raise UnreachableError("User context is not available") |
390 | | - action = DeleteVFolderV2Action(user_id=me.user_id, vfolder_id=vfolder_id) |
391 | | - await self._processors.vfolder.delete_v2.wait_for_complete(action) |
392 | | - return DeleteVFolderPayload(id=vfolder_id) |
| 406 | + action = RestoreVFolderFromTrashAction( |
| 407 | + user_uuid=me.user_id, |
| 408 | + vfolder_uuid=vfolder_id, |
| 409 | + ) |
| 410 | + await self._processors.vfolder.restore_vfolder_from_trash.wait_for_complete(action) |
| 411 | + return RestoreVFolderPayload(id=vfolder_id) |
393 | 412 |
|
394 | 413 | async def purge(self, vfolder_id: UUID) -> PurgeVFolderPayload: |
395 | 414 | """Permanently delete a vfolder.""" |
|
0 commit comments