diff --git a/admin_console/controllers/WidgetController.php b/admin_console/controllers/WidgetController.php index f094fe88148..261f642cb61 100644 --- a/admin_console/controllers/WidgetController.php +++ b/admin_console/controllers/WidgetController.php @@ -6,6 +6,7 @@ class WidgetController extends Zend_Controller_Action { const HTML5_URL = 'html5_url'; + const UI_CONF_STATUS_DELETED = 3; public function listAction() { $request = $this->getRequest(); @@ -187,11 +188,24 @@ public function duplicateAction() $id = $request->getParam('id'); $client = Infra_ClientHelper::getClient(); $adminConsolePlugin = Kaltura_Client_AdminConsole_Plugin::get($client); - + $uiConf = $adminConsolePlugin->uiConfAdmin->get($id); $uiConf->id = null; $uiConf = $adminConsolePlugin->uiConfAdmin->add($uiConf); - + + echo $this->_helper->json('ok', false); + } + + public function restoreAction() + { + $this->_helper->viewRenderer->setNoRender(); + $request = $this->getRequest(); + $id = $request->getParam('id'); + $client = Infra_ClientHelper::getClient(); + $adminConsolePlugin = Kaltura_Client_AdminConsole_Plugin::get($client); + + $adminConsolePlugin->uiConfAdmin->restore($id); + echo $this->_helper->json('ok', false); } diff --git a/admin_console/views/scripts/widget/list.phtml b/admin_console/views/scripts/widget/list.phtml index 1e720031699..bd2a7677df5 100644 --- a/admin_console/views/scripts/widget/list.phtml +++ b/admin_console/views/scripts/widget/list.phtml @@ -50,15 +50,21 @@ @@ -75,12 +81,12 @@ jQuery('#filter_type').change(function() if(this.value == "by-uiconf-type") { $("#filter_text").css("display","none"); - $("#filter_obj_type_input").css("display","inline"); - } + $("#filter_obj_type_input").css("display","inline"); + } else - { + { $("#filter_text").css("display","inline"); - $("#filter_obj_type_input").css("display","none"); + $("#filter_obj_type_input").css("display","none"); } }); @@ -191,6 +197,28 @@ function deleteWidget(id) { } } +function restoreWidget(id) { + var ok = confirm('translate('are you sure restore uiconf?'); ?>'); + + if (ok) { + var url = 'url(array('controller' => 'widget', 'action' => 'restore', 'id' => '')); ?>' + id; + + jQuery.ajax({ + url: url, + dataType: 'json', + success: function(result) { + if (result != 'ok') + return this.error(); + alert('translate('uiconf was restored');?>'); + jQuery('#frmPaginator1').submit(); + }, + error: function() { + alert('translate('uiconf was not restored');?>'); + } + }); + } +} + function duplicateWidget(id) { var url = 'url(array('controller' => 'widget', 'action' => 'duplicate', 'id' => '')); ?>' + id; diff --git a/deployment/permissions/service.adminconsole.uiconfadmin.ini b/deployment/permissions/service.adminconsole.uiconfadmin.ini index fa2935e8b36..1c7efeadfe5 100644 --- a/deployment/permissions/service.adminconsole.uiconfadmin.ini +++ b/deployment/permissions/service.adminconsole.uiconfadmin.ini @@ -38,9 +38,18 @@ permissionItem4.permissions = SYSTEM_ADMIN_WIDGET permissionItem5.service = adminconsole_uiconfadmin permissionItem5.action = delete permissionItem5.partnerId = -2 -permissionItem5.param3 = -permissionItem5.param4 = -permissionItem5.param5 = -permissionItem5.tags = +permissionItem5.param3 = +permissionItem5.param4 = +permissionItem5.param5 = +permissionItem5.tags = permissionItem5.permissions = SYSTEM_ADMIN_WIDGET +permissionItem6.service = adminconsole_uiconfadmin +permissionItem6.action = restore +permissionItem6.partnerId = -2 +permissionItem6.param3 = +permissionItem6.param4 = +permissionItem6.param5 = +permissionItem6.tags = +permissionItem6.permissions = SYSTEM_ADMIN_WIDGET + diff --git a/plugins/admin_console/lib/api/KalturaUiConfAdmin.php b/plugins/admin_console/lib/api/KalturaUiConfAdmin.php index afda80522ce..deaf465b6e5 100644 --- a/plugins/admin_console/lib/api/KalturaUiConfAdmin.php +++ b/plugins/admin_console/lib/api/KalturaUiConfAdmin.php @@ -9,7 +9,13 @@ class KalturaUiConfAdmin extends KalturaUiConf * @var bool */ public $isPublic; - + + /** + * @var int + * @readonly + */ + public $status; + public function doFromObject($source_object, KalturaDetachedResponseProfile $responseProfile = null) { if ($source_object instanceof uiConf) @@ -18,8 +24,10 @@ public function doFromObject($source_object, KalturaDetachedResponseProfile $res $this->isPublic = true; else $this->isPublic = false; + + $this->status = $source_object->getStatus(); } - + return parent::doFromObject($source_object, $responseProfile); } @@ -34,4 +42,4 @@ public function toObject($object_to_fill = null, $props_to_skip = array()) } return parent::toObject($object_to_fill, $props_to_skip); } -} \ No newline at end of file +} diff --git a/plugins/admin_console/lib/errors/KalturaAdminConsoleErrors.php b/plugins/admin_console/lib/errors/KalturaAdminConsoleErrors.php index e35dc9fa4a9..b2dab58fa12 100644 --- a/plugins/admin_console/lib/errors/KalturaAdminConsoleErrors.php +++ b/plugins/admin_console/lib/errors/KalturaAdminConsoleErrors.php @@ -6,4 +6,6 @@ class KalturaAdminConsoleErrors extends KalturaErrors { const ENTRY_ASSETS_WRONG_STATUS_FOR_RESTORE = "ENTRY_ASSETS_WRONG_STATUS_FOR_RESTORE;ENTRY_ID; Entry [@ENTRY_ID@] or one of its assets are not in status \"DELETED\""; + const UI_CONF_NOT_IN_DELETED_STATUS = "UI_CONF_NOT_IN_DELETED_STATUS;UI_CONF_ID;UIConf [@UI_CONF_ID@] is not in deleted status and cannot be restored"; + const UI_CONF_FILE_SYNC_MISSING = "UI_CONF_FILE_SYNC_MISSING;UI_CONF_ID,FILE;UIConf [@UI_CONF_ID@] file sync \"@FILE@\" was not found on disk and cannot be restored"; } \ No newline at end of file diff --git a/plugins/admin_console/services/UiConfAdminService.php b/plugins/admin_console/services/UiConfAdminService.php index 9d76c2a15fd..2899a299c50 100644 --- a/plugins/admin_console/services/UiConfAdminService.php +++ b/plugins/admin_console/services/UiConfAdminService.php @@ -116,37 +116,118 @@ function deleteAction($id) } /** - * Retrieve a list of available UIConfs with no partner limitation - * + * Restore a deleted UIConf and its file syncs + * + * @action restore + * @param int $id + * @return KalturaUiConfAdmin + * + * @throws APIErrors::INVALID_UI_CONF_ID + */ + function restoreAction($id) + { + uiConfPeer::setUseCriteriaFilter(false); + $dbUiConf = uiConfPeer::retrieveByPK($id); + uiConfPeer::setUseCriteriaFilter(true); + + if (!$dbUiConf) + throw new KalturaAPIException(APIErrors::INVALID_UI_CONF_ID, $id); + + if ($dbUiConf->getPartnerId() == PartnerPeer::GLOBAL_PARTNER && !kPermissionManager::isPermitted(self::PERMISSION_GLOBAL_PARTNER_UI_CONF_UPDTAE)) + throw new KalturaAPIException(APIErrors::INVALID_UI_CONF_ID, $id); + + if ($dbUiConf->getStatus() != uiConf::UI_CONF_STATUS_DELETED) + throw new KalturaAPIException(KalturaAdminConsoleErrors::UI_CONF_NOT_IN_DELETED_STATUS, $id); + + $fileSyncSubTypes = array( + uiConf::FILE_SYNC_UICONF_SUB_TYPE_DATA, + uiConf::FILE_SYNC_UICONF_SUB_TYPE_CONFIG, + uiConf::FILE_SYNC_UICONF_SUB_TYPE_FEATURES, + ); + + $fileSyncs = array(); + FileSyncPeer::setUseCriteriaFilter(false); + foreach ($fileSyncSubTypes as $subType) + { + $fileSync = kFileSyncUtils::getLocalFileSyncForKey($dbUiConf->getSyncKey($subType), false); + if ($fileSync) + $fileSyncs[] = $fileSync; + } + FileSyncPeer::setUseCriteriaFilter(true); + + if (empty($fileSyncs)) + throw new KalturaAPIException(KalturaAdminConsoleErrors::UI_CONF_FILE_SYNC_MISSING, $id, ''); + + foreach ($fileSyncs as $fileSync) + { + if (!file_exists($fileSync->getFullPath())) + throw new KalturaAPIException(KalturaAdminConsoleErrors::UI_CONF_FILE_SYNC_MISSING, $id, $fileSync->getFullPath()); + } + + foreach ($fileSyncs as $fileSync) + { + if (method_exists($fileSync, 'setDeletedId')) + $fileSync->setDeletedId(0); + $fileSync->setStatus(FileSync::FILE_SYNC_STATUS_READY); + $fileSync->save(); + } + + $dbUiConf->setStatus(uiConf::UI_CONF_STATUS_READY); + $dbUiConf->save(); + + $uiConf = new KalturaUiConfAdmin(); + $uiConf->fromObject($dbUiConf, $this->getResponseProfile()); + + return $uiConf; + } + + /** + * Retrieve a list of available UIConfs with no partner limitation. + * If the request comes from an admin console client, deleted UIConfs are included as well. + * * @action list * @param KalturaUiConfFilter $filter * @param KalturaFilterPager $pager * @return KalturaUiConfAdminListResponse - */ - function listAction( KalturaUiConfFilter $filter = null , KalturaFilterPager $pager = null) + */ + function listAction(KalturaUiConfFilter $filter = null, KalturaFilterPager $pager = null) + { + $clientTag = kCurrentContext::$client_lang ? strtolower(kCurrentContext::$client_lang) : ''; + $includeDeleted = ($clientTag === 'kaltura-admin'); + return $this->doList($filter, $pager, $includeDeleted); + } + + private function doList(KalturaUiConfFilter $filter = null, KalturaFilterPager $pager = null, $includeDeleted = false) { myDbHelper::$use_alternative_con = myDbHelper::DB_HELPER_CONN_PROPEL2; - + if (!$filter) $filter = new KalturaUiConfFilter(); - + $uiConfFilter = new uiConfFilter(); $filter->toObject($uiConfFilter); - + $c = new Criteria(); $uiConfFilter->attachToCriteria($c); + + if ($includeDeleted) + uiConfPeer::setUseCriteriaFilter(false); + $count = uiConfPeer::doCount($c); - if (! $pager) - $pager = new KalturaFilterPager (); + if (!$pager) + $pager = new KalturaFilterPager(); $pager->attachToCriteria($c); $list = uiConfPeer::doSelect($c); - + + if ($includeDeleted) + uiConfPeer::setUseCriteriaFilter(true); + $newList = KalturaUiConfAdminArray::fromDbArray($list, $this->getResponseProfile()); - + $response = new KalturaUiConfAdminListResponse(); $response->objects = $newList; $response->totalCount = $count; - + return $response; } } diff --git a/release-notes.md b/release-notes.md index 5b960040b1b..1b297ee2948 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,4 +1,10 @@ # West-23.5.0 +## Add permissions for uiConfAdmin restore +- Issue Type: Task +- Issue ID: SUP-52187 +### Deployment Scripts ### + php deployment/updates/scripts/add_permissions/2026_08_03_adminconsole_uiconfadmin_restore_permission.php +## Add DRM Key Management Policy service and permissions ## ## Add Learner Intelligence partner and permissions - Issue Type: Task - Issue ID: PLAT-26018