2222 MkdirInput ,
2323 MoveFileInput ,
2424 SearchVFoldersInput ,
25+ UpdateVFolderInput ,
2526 VFolderFilter ,
2627 VFolderOrder ,
2728)
4142 MoveFilePayload ,
4243 PurgeVFolderPayload ,
4344 SearchVFoldersPayload ,
45+ UpdateVFolderPayload ,
4446 VFolderNode ,
4547)
4648from ai .backend .common .dto .manager .v2 .vfolder .types import (
9597 combine_conditions_or ,
9698 negate_conditions ,
9799)
100+ from ai .backend .manager .repositories .base .updater import Updater
98101from ai .backend .manager .repositories .vfolder .types import (
99102 ProjectVFolderSearchScope ,
100103 UserVFolderSearchScope ,
101104)
105+ from ai .backend .manager .repositories .vfolder .updaters import VFolderAttributeUpdaterSpec
102106from ai .backend .manager .services .deployment .actions .create_deployment import CreateDeploymentAction
103107from ai .backend .manager .services .vfolder .actions .admin_search_vfolders import (
104108 AdminSearchVFoldersAction ,
105109)
110+ from ai .backend .manager .services .vfolder .actions .base import UpdateVFolderAttributeAction
106111from ai .backend .manager .services .vfolder .actions .batch_load_by_ids import (
107112 BatchLoadVFoldersByIdsAction ,
108113)
126131 CreateUploadSessionV2Action ,
127132)
128133from ai .backend .manager .services .vfolder .actions .vfolder_in_project import (
129- BulkDeleteVFoldersInProjectAction ,
130134 CreateVFolderInProjectAction ,
131- DeleteVFolderInProjectAction ,
132135)
133136from ai .backend .manager .services .vfolder .actions .vfolder_v2 import (
134137 DeleteVFolderV2Action ,
135138 PurgeVFolderV2Action ,
136139)
140+ from ai .backend .manager .types import OptionalState
137141
138142from .base import BaseAdapter
139143
@@ -392,38 +396,6 @@ async def create_in_project(
392396 result = await self ._processors .vfolder .create_vfolder_in_project .wait_for_complete (action )
393397 return CreateVFolderPayload (vfolder = self ._vfolder_data_to_node (result .vfolder ))
394398
395- async def delete_in_project (
396- self ,
397- project_id : UUID ,
398- vfolder_id : UUID ,
399- ) -> DeleteVFolderPayload :
400- """Soft-delete a vfolder belonging to ``project_id``.
401-
402- Uses ``DeleteVFolderInProjectAction`` which is PROJECT-scoped so the
403- caller must hold DELETE permission on the project.
404- """
405- action = DeleteVFolderInProjectAction (
406- project_id = project_id ,
407- vfolder_id = vfolder_id ,
408- )
409- await self ._processors .vfolder .delete_vfolder_in_project .wait_for_complete (action )
410- return DeleteVFolderPayload (id = vfolder_id )
411-
412- async def bulk_delete_in_project (
413- self ,
414- project_id : UUID ,
415- input : BulkDeleteVFoldersInput ,
416- ) -> BulkDeleteVFoldersPayload :
417- """Soft-delete multiple vfolders that all belong to ``project_id``."""
418- action = BulkDeleteVFoldersInProjectAction (
419- project_id = project_id ,
420- vfolder_ids = list (input .ids ),
421- )
422- result = await self ._processors .vfolder .bulk_delete_vfolders_in_project .wait_for_complete (
423- action
424- )
425- return BulkDeleteVFoldersPayload (deleted_count = len (result .deleted_vfolder_ids ))
426-
427399 async def create_upload_session (
428400 self , vfolder_id : UUID , input : CreateUploadSessionInput
429401 ) -> CreateUploadSessionPayload :
@@ -447,21 +419,39 @@ async def get(self, vfolder_id: UUID) -> VFolderNode:
447419 )
448420 return self ._vfolder_data_to_node (result .vfolder )
449421
450- async def delete (self , vfolder_id : UUID ) -> DeleteVFolderPayload :
451- """Soft-delete a vfolder (move to trash) ."""
422+ async def update (self , vfolder_id : UUID , input : UpdateVFolderInput ) -> UpdateVFolderPayload :
423+ """Update vfolder attributes. RBAC enforced ."""
452424 me = current_user ()
453425 if me is None :
454426 raise UnreachableError ("User context is not available" )
455- action = DeleteVFolderV2Action (user_id = me .user_id , vfolder_id = vfolder_id )
427+ spec = VFolderAttributeUpdaterSpec ()
428+ if isinstance (input .name , str ):
429+ spec .name = OptionalState .update (input .name )
430+ if input .cloneable is not None :
431+ spec .cloneable = OptionalState .update (input .cloneable )
432+ if input .permission is not None :
433+ spec .mount_permission = OptionalState .update (VFolderPermission (input .permission .value ))
434+ updater = Updater (spec = spec , pk_value = vfolder_id )
435+ action = UpdateVFolderAttributeAction (
436+ user_uuid = me .user_id ,
437+ vfolder_uuid = vfolder_id ,
438+ updater = updater ,
439+ )
440+ await self ._processors .vfolder .update_vfolder_attribute .wait_for_complete (action )
441+ vfolder_data = await self ._processors .vfolder .get_v2 .wait_for_complete (
442+ GetVFolderV2Action (vfolder_uuid = vfolder_id )
443+ )
444+ return UpdateVFolderPayload (vfolder = self ._vfolder_data_to_node (vfolder_data .vfolder ))
445+
446+ async def delete (self , vfolder_id : UUID ) -> DeleteVFolderPayload :
447+ """Soft-delete a vfolder (move to trash). RBAC enforced."""
448+ action = DeleteVFolderV2Action (vfolder_id = vfolder_id )
456449 await self ._processors .vfolder .delete_v2 .wait_for_complete (action )
457450 return DeleteVFolderPayload (id = vfolder_id )
458451
459452 async def purge (self , vfolder_id : UUID ) -> PurgeVFolderPayload :
460- """Permanently delete a vfolder."""
461- me = current_user ()
462- if me is None :
463- raise UnreachableError ("User context is not available" )
464- action = PurgeVFolderV2Action (user_id = me .user_id , vfolder_id = vfolder_id )
453+ """Permanently delete a vfolder. RBAC enforced."""
454+ action = PurgeVFolderV2Action (vfolder_id = vfolder_id )
465455 await self ._processors .vfolder .purge_v2 .wait_for_complete (action )
466456 return PurgeVFolderPayload (id = vfolder_id )
467457
@@ -545,22 +535,16 @@ async def deploy(
545535 )
546536
547537 async def bulk_delete (self , input : BulkDeleteVFoldersInput ) -> BulkDeleteVFoldersPayload :
548- """Soft-delete multiple vfolders."""
549- me = current_user ()
550- if me is None :
551- raise UnreachableError ("User context is not available" )
538+ """Soft-delete multiple vfolders. RBAC enforced per item."""
552539 for vfolder_id in input .ids :
553- action = DeleteVFolderV2Action (user_id = me . user_id , vfolder_id = vfolder_id )
540+ action = DeleteVFolderV2Action (vfolder_id = vfolder_id )
554541 await self ._processors .vfolder .delete_v2 .wait_for_complete (action )
555542 return BulkDeleteVFoldersPayload (deleted_count = len (input .ids ))
556543
557544 async def bulk_purge (self , input : BulkPurgeVFoldersInput ) -> BulkPurgeVFoldersPayload :
558- """Permanently purge multiple vfolders."""
559- me = current_user ()
560- if me is None :
561- raise UnreachableError ("User context is not available" )
545+ """Permanently purge multiple vfolders. RBAC enforced per item."""
562546 for vfolder_id in input .ids :
563- action = PurgeVFolderV2Action (user_id = me . user_id , vfolder_id = vfolder_id )
547+ action = PurgeVFolderV2Action (vfolder_id = vfolder_id )
564548 await self ._processors .vfolder .purge_v2 .wait_for_complete (action )
565549 return BulkPurgeVFoldersPayload (purged_count = len (input .ids ))
566550
0 commit comments