diff --git a/alpha/apps/kaltura/lib/kObjectDeleteHandler.php b/alpha/apps/kaltura/lib/kObjectDeleteHandler.php index 6c9d093db60..fe15e96ebfe 100644 --- a/alpha/apps/kaltura/lib/kObjectDeleteHandler.php +++ b/alpha/apps/kaltura/lib/kObjectDeleteHandler.php @@ -167,7 +167,7 @@ protected function kuserDelete(kuser $kuser) // remove user from groups KuserKgroupPeer::deleteByKuserId($kuser->getId()); } - elseif ($kuser->getType() == KuserType::GROUP){ + elseif ($kuser->getType() == KuserType::GROUP || $kuser->getType() == KuserType::APPLICATIVE_GROUP){ // remove users from group $filter = new KuserKgroupFilter(); $filter->setGroupIdEqual($kuser->getPuserId()); diff --git a/alpha/lib/enums/GroupType.php b/alpha/lib/enums/GroupType.php new file mode 100644 index 00000000000..b336ca477eb --- /dev/null +++ b/alpha/lib/enums/GroupType.php @@ -0,0 +1,11 @@ +getFromCustomData(self::GROUP_USER_ROLE, null, GroupUserRole::MEMBER); } + + public function setGroupType($v) + { + $this->putInCustomData(self::GROUP_TYPE, $v); + } + + public function getGroupType() + { + return $this->getFromCustomData(self::GROUP_TYPE, null, GroupType::GROUP); + } } diff --git a/api_v3/lib/types/KalturaGroupUser.php b/api_v3/lib/types/KalturaGroupUser.php index 70b2af19bba..267758fdac6 100644 --- a/api_v3/lib/types/KalturaGroupUser.php +++ b/api_v3/lib/types/KalturaGroupUser.php @@ -68,6 +68,11 @@ class KalturaGroupUser extends KalturaObject implements IRelatedFilterable */ public $userRole; + /** + * @var KalturaGroupType + */ + public $groupType; + private static $map_between_objects = array ( "id", @@ -78,7 +83,8 @@ class KalturaGroupUser extends KalturaObject implements IRelatedFilterable "createdAt", "updatedAt", "creationMode", - "userRole" + "userRole", + "groupType", ); public function getMapBetweenObjects ( ) @@ -103,4 +109,4 @@ public function getFilterDocs() { return array(); } -} \ No newline at end of file +} diff --git a/api_v3/lib/types/KalturaUserAppRole.php b/api_v3/lib/types/KalturaUserAppRole.php index 683754bdd6c..2353459c067 100644 --- a/api_v3/lib/types/KalturaUserAppRole.php +++ b/api_v3/lib/types/KalturaUserAppRole.php @@ -136,7 +136,7 @@ private function verifyMandatoryParams($puserId, $appGuid ,$userRoleId) private static function isValidForInsert(kuser $kuser, $appGuid, $userRoleId) { // groups are not supported - if ($kuser->getType() === KuserType::GROUP) + if ($kuser->getType() === KuserType::GROUP || $kuser->getType() == KuserType::APPLICATIVE_GROUP) { throw new KalturaAPIException(KalturaErrors::USER_APP_ROLE_NOT_ALLOWED_FOR_GROUP); } diff --git a/api_v3/lib/types/enums/KalturaGroupType.php b/api_v3/lib/types/enums/KalturaGroupType.php new file mode 100644 index 00000000000..bd7f10423e4 --- /dev/null +++ b/api_v3/lib/types/enums/KalturaGroupType.php @@ -0,0 +1,10 @@ +userIdEqual && !$this->userIdIn && !$this->groupIdEqual && !$this->groupIdIn) @@ -42,7 +45,7 @@ public function getListResponse(KalturaFilterPager $pager, KalturaDetachedRespon $c = new Criteria(); $c->add(kuserPeer::PARTNER_ID, $partnerId); $c->add(kuserPeer::PUSER_ID, $this->groupIdEqual); - $c->add(kuserPeer::TYPE, KuserType::GROUP); + $c->add(kuserPeer::TYPE, $this->groupType); if (kCurrentContext::$ks_partner_id == Partner::BATCH_PARTNER_ID) //batch should be able to get categoryUser of deleted users. kuserPeer::setUseCriteriaFilter(false); @@ -124,7 +127,7 @@ public function getListResponse(KalturaFilterPager $pager, KalturaDetachedRespon $c = new Criteria(); $c->add(kuserPeer::PARTNER_ID, $partnerId, Criteria::EQUAL); $c->add(kuserPeer::PUSER_ID, $groupIdIn, Criteria::IN); - $c->add(kuserPeer::TYPE, KuserType::GROUP); + $c->add(kuserPeer::TYPE, $this->groupType); $kusers = kuserPeer::doSelect($c); if (!$kusers) diff --git a/api_v3/services/GroupUserService.php b/api_v3/services/GroupUserService.php index 0f7e5e0571c..12bf0e54b04 100644 --- a/api_v3/services/GroupUserService.php +++ b/api_v3/services/GroupUserService.php @@ -37,8 +37,11 @@ function addAction(KalturaGroupUser $groupUser) //verify kgroup exists $kgroup = kuserPeer::getKuserByPartnerAndUid( $partnerId, $groupUser->groupId); - if ( !$kgroup || $kgroup->getType() != KuserType::GROUP) + $groupTypes = array(KuserType::GROUP, KuserType::APPLICATIVE_GROUP); + if (!$kgroup || !in_array($kgroup->getType(), $groupTypes)) + { throw new KalturaAPIException ( KalturaErrors::GROUP_NOT_FOUND, $groupUser->userId ); + } //verify kuser does not belongs to kgroup $kuserKgroup = KuserKgroupPeer::retrieveByKuserIdAndKgroupId($kuser->getId(), $kgroup->getId()); @@ -431,21 +434,52 @@ protected function validateKuserkGroupCoExistence(kuser $kGroup, $kuserId) protected function validateMaxGroupsPerUser($partnerId, $kuserId) { - $criteria = new Criteria(); - $criteria->add(KuserKgroupPeer::KUSER_ID, $kuserId); - $criteria->add(KuserKgroupPeer::STATUS, KuserKgroupStatus::ACTIVE); + $maxGroupsPerUser = $this->getPartnerMaximumGroupsPerUser($partnerId); + + $kuserGroupList = $this->retrieveActiveGroupsForKuser($kuserId); + if (count($kuserGroupList) < $maxGroupsPerUser) + { + return; + } + + $countLimitedGroups = $this->countLimitedGroups($kuserGroupList); + if ($countLimitedGroups >= $maxGroupsPerUser) + { + throw new KalturaAPIException (KalturaErrors::USER_EXCEEDED_MAX_GROUPS); + } + } - $maxGroupsPerUser = GroupUserService::DEFAULT_MAX_NUMBER_OF_GROUPS_PER_USER; + protected function getPartnerMaximumGroupsPerUser($partnerId) + { $groupUserCountLimitMap = kConf::get('group_user_count_limit', 'local', array()); $partnersList = array_keys($groupUserCountLimitMap); if (in_array($partnerId, $partnersList)) { - $maxGroupsPerUser = $groupUserCountLimitMap[$partnerId]; + return $groupUserCountLimitMap[$partnerId]; } - if (KuserKgroupPeer::doCount($criteria) >= $maxGroupsPerUser) + return GroupUserService::DEFAULT_MAX_NUMBER_OF_GROUPS_PER_USER; + } + + protected function retrieveActiveGroupsForKuser($kuserId) + { + $criteria = new Criteria(); + $criteria->add(KuserKgroupPeer::KUSER_ID, $kuserId); + $criteria->add(KuserKgroupPeer::STATUS, KuserKgroupStatus::ACTIVE); + return KuserKgroupPeer::doSelect($criteria); + } + + protected function countLimitedGroups($kuserGroupList) + { + $countLimitedGroups = 0; + foreach ($kuserGroupList as $kuserGroup) { - throw new KalturaAPIException (KalturaErrors::USER_EXCEEDED_MAX_GROUPS); + /** @var KuserKgroup $kuserGroup */ + if ($kuserGroup->getGroupType() == GroupType::GROUP) + { + $countLimitedGroups += 1; + } } + return $countLimitedGroups; } } diff --git a/plugins/bulk_upload/csv/lib/model/kBulkGroupUserSyncCsv.php b/plugins/bulk_upload/csv/lib/model/kBulkGroupUserSyncCsv.php index aa9d78109dd..3131587e846 100644 --- a/plugins/bulk_upload/csv/lib/model/kBulkGroupUserSyncCsv.php +++ b/plugins/bulk_upload/csv/lib/model/kBulkGroupUserSyncCsv.php @@ -47,6 +47,11 @@ protected function buildUserMap($users) foreach ($users as $user) { /**@var kuser $user*/ + if ($user->getType() == KuserType::APPLICATIVE_GROUP) + { + continue; + } + $this->userMap[$user->getId()][self::MODE] = $user->getUserMode(); $this->userMap[trim($user->getPuserId())][self::MODE] = $user->getUserMode(); $this->userMap[$user->getId()][self::TYPE] = $user->getType(); @@ -59,11 +64,9 @@ public function getSyncGroupUsers($removeFromExistingGroups, $createNewGroups) $requestGroupIds = array_map('trim', $this->groupIds); $partnerId = $this->kuser->getPartnerId(); $currentUserGroups = KuserKgroupPeer::retrieveByKuserIds(array($this->kuser->getId())); - $currentKgroupsIds = array(); $currentPgroupsIds = array(); foreach ($currentUserGroups as $currentUserGroup) { - $currentKgroupsIds[] = $currentUserGroup->getKgroupId(); $currentPgroupsIds[] = $currentUserGroup->getPgroupId(); } diff --git a/plugins/group/lib/api/KalturaGroup.php b/plugins/group/lib/api/KalturaGroup.php index 6512cd24f9a..ba4acf701ba 100644 --- a/plugins/group/lib/api/KalturaGroup.php +++ b/plugins/group/lib/api/KalturaGroup.php @@ -17,6 +17,11 @@ class KalturaGroup extends KalturaBaseUser */ public $processStatus; + /** + * @var KalturaGroupType + */ + public $groupType; + private static $names = array('fullName' => 'getFullName', 'screenName' => 'getScreenName'); private static $map_between_objects = array @@ -35,7 +40,8 @@ public function toObject($dbObject = null, $skip = array()) if (is_null($dbObject)) { $dbObject = new kuser(); - $dbObject->setType(KuserType::GROUP); + $groupType = $this->groupType ?? KuserType::GROUP; + $dbObject->setType($groupType); } parent::toObject($dbObject, $skip); return $dbObject; @@ -74,5 +80,4 @@ public function clonedObject($dbOriginalGroup, $newGroupId, $newGroupName) $dbObject->setPartnerId($dbOriginalGroup->getPartnerId()); return $dbObject; } - -} \ No newline at end of file +} diff --git a/plugins/group/lib/api/KalturaGroupFilter.php b/plugins/group/lib/api/KalturaGroupFilter.php index cb25ac3d732..b2833ea7346 100644 --- a/plugins/group/lib/api/KalturaGroupFilter.php +++ b/plugins/group/lib/api/KalturaGroupFilter.php @@ -5,12 +5,18 @@ */ class KalturaGroupFilter extends KalturaUserFilter { + /** + * @var KalturaGroupType + */ + public $groupType; + public function getListResponse(KalturaFilterPager $pager, KalturaDetachedResponseProfile $responseProfile = null) { $c = KalturaCriteria::create(kuserPeer::OM_CLASS); $groupFilter = $this->toObject(); $groupFilter->attachToCriteria($c); - $c->addAnd(kuserPeer::TYPE,KuserType::GROUP); + $groupType = $this->groupType ?? KuserType::GROUP; + $c->addAnd(kuserPeer::TYPE, $groupType); $c->addAnd(kuserPeer::PUSER_ID, NULL, KalturaCriteria::ISNOTNULL); $pager->attachToCriteria($c); $list = kuserPeer::doSelect($c); @@ -21,4 +27,4 @@ public function getListResponse(KalturaFilterPager $pager, KalturaDetachedRespon $response->totalCount = $totalCount; return $response; } -} \ No newline at end of file +} diff --git a/plugins/group/services/GroupService.php b/plugins/group/services/GroupService.php index e5b83fd32d9..821ac28452d 100644 --- a/plugins/group/services/GroupService.php +++ b/plugins/group/services/GroupService.php @@ -125,7 +125,8 @@ public function listAction(KalturaGroupFilter $filter = null, KalturaFilterPager protected function getGroup($groupId) { $dbGroup = kuserPeer::getKuserByPartnerAndUid($this->getPartnerId(), $groupId); - if(!$dbGroup || $dbGroup->getType() != KuserType::GROUP) + $groupTypes = array(KuserType::GROUP, KuserType::APPLICATIVE_GROUP); + if(!$dbGroup || !in_array($dbGroup->getType(), $groupTypes)) { throw new KalturaAPIException(KalturaGroupErrors::INVALID_GROUP_ID); } @@ -258,4 +259,4 @@ protected function getKusersFromKuserKgroup($groupUsers) } return $kusers; } -} \ No newline at end of file +} diff --git a/plugins/virtual_event/services/VirtualEventService.php b/plugins/virtual_event/services/VirtualEventService.php index 6becf37a97d..974da93f07f 100644 --- a/plugins/virtual_event/services/VirtualEventService.php +++ b/plugins/virtual_event/services/VirtualEventService.php @@ -183,7 +183,8 @@ protected function validateGroups (KalturaVirtualEvent $virtualEvent) protected function isValidGroup($groupId) { $dbGroup = kuserPeer::getKuserByPartnerAndUid($this->getPartnerId(), $groupId); - if(!$dbGroup || $dbGroup->getType() != KuserType::GROUP) + $groupTypes = array(KuserType::GROUP, KuserType::APPLICATIVE_GROUP); + if(!$dbGroup || !in_array($dbGroup->getType(), $groupTypes)) { throw new KalturaAPIException(KalturaGroupErrors::INVALID_GROUP_ID, $groupId); }