diff --git a/lib/Routes/Opencast/UserRoles.php b/lib/Routes/Opencast/UserRoles.php index 1e60256276bdc3bce109b43d897661b2fd053214..3dc1bf9cd33ae12c59a19c2ea87e575422372585 100644 --- a/lib/Routes/Opencast/UserRoles.php +++ b/lib/Routes/Opencast/UserRoles.php @@ -10,6 +10,8 @@ use Opencast\OpencastController; use Opencast\Models\VideosUserPerms; use Opencast\Models\VideosShares; use Opencast\Models\PlaylistsUserPerms; +use Opencast\Models\Config; +use Opencast\Helpers\PlaylistMigration; @@ -25,6 +27,12 @@ class UserRoles extends OpencastController // parse username, they are of the type lti:instid:1234567890acbdef $plugin_id = $this->container->get('plugin')->getPluginId(); + // Check whether all opencast configs support episode ID role access. + $episode_id_role_access = true; + foreach (Config::findBySQL('1') as $config) { + $episode_id_role_access &= $config->settings['episode_id_role_access'] ?? false; + } + $user_id = null; $share_uuid = null; $email = null; @@ -45,8 +53,11 @@ class UserRoles extends OpencastController if (!empty($share_uuid)) { $video_share = VideosShares::findByUuid($share_uuid); if (!empty($video_share)) { - $roles[] = $video_share->video->episode . '_read'; - $roles[] = 'ROLE_EPISODE_' . $video_share->video->episode . '_READ'; + if ($episode_id_role_access) { + $roles[] = 'ROLE_EPISODE_' . $video_share->video->episode . '_READ'; + } else { + $roles[] = $video_share->video->episode . '_read'; + } } else { throw new Error('Share not found', 404); } @@ -96,12 +107,18 @@ class UserRoles extends OpencastController if (!$vperm->video->episode) continue; if ($vperm->perm == 'owner' || $vperm->perm == 'write') { - $roles[$vperm->video->episode . '_write'] = $vperm->video->episode . '_write'; - $roles['ROLE_EPISODE_' . $vperm->video->episode . '_READ'] = 'ROLE_EPISODE_' . $vperm->video->episode . '_READ'; - $roles['ROLE_EPISODE_' . $vperm->video->episode . '_WRITE'] = 'ROLE_EPISODE_' . $vperm->video->episode . '_WRITE'; + if ($episode_id_role_access) { + $roles['ROLE_EPISODE_' . $vperm->video->episode . '_READ'] = 'ROLE_EPISODE_' . $vperm->video->episode . '_READ'; + $roles['ROLE_EPISODE_' . $vperm->video->episode . '_WRITE'] = 'ROLE_EPISODE_' . $vperm->video->episode . '_WRITE'; + } else { + $roles[$vperm->video->episode . '_write'] = $vperm->video->episode . '_write'; + } } else { - $roles[$vperm->video->episode . '_read'] = $vperm->video->episode . '_read'; - $roles['ROLE_EPISODE_' . $vperm->video->episode . '_READ'] = 'ROLE_EPISODE_' . $vperm->video->episode . '_READ'; + if ($episode_id_role_access) { + $roles['ROLE_EPISODE_' . $vperm->video->episode . '_READ'] = 'ROLE_EPISODE_' . $vperm->video->episode . '_READ'; + } else { + $roles[$vperm->video->episode . '_read'] = $vperm->video->episode . '_read'; + } } } @@ -114,8 +131,11 @@ class UserRoles extends OpencastController $stmt_courseware->execute([':user_id' => $user_id]); while($episode = $stmt_courseware->fetchColumn()) { - $roles[$episode . '_read'] = $episode . '_read'; - $roles['ROLE_EPISODE_' . $episode . '_READ'] = 'ROLE_EPISODE_' . $episode . '_READ'; + if ($episode_id_role_access) { + $roles['ROLE_EPISODE_' . $episode . '_READ'] = 'ROLE_EPISODE_' . $episode . '_READ'; + } else { + $roles[$episode . '_read'] = $episode . '_read'; + } } $stmt_courses = \DBManager::get()->prepare("SELECT seminar_id FROM seminar_user @@ -162,39 +182,41 @@ class UserRoles extends OpencastController // Handle playlist roles - // get all playlists the user has permissions on - foreach (PlaylistsUserPerms::findByUser_id($user_id) as $pperm) { - if ($pperm->perm == 'owner' || $pperm->perm == 'write') { - $roles[$pperm->playlist->service_playlist_id . '_write'] = 'PLAYLIST_' . $pperm->playlist->service_playlist_id . '_write'; - } else { - $roles[$pperm->playlist->service_playlist_id . '_read'] = 'PLAYLIST_' . $pperm->playlist->service_playlist_id . '_read'; + if (PlaylistMigration::isConverted()) { + // get all playlists the user has permissions on + foreach (PlaylistsUserPerms::findByUser_id($user_id) as $pperm) { + if ($pperm->perm == 'owner' || $pperm->perm == 'write') { + $roles[$pperm->playlist->service_playlist_id . '_write'] = 'PLAYLIST_' . $pperm->playlist->service_playlist_id . '_write'; + } else { + $roles[$pperm->playlist->service_playlist_id . '_read'] = 'PLAYLIST_' . $pperm->playlist->service_playlist_id . '_read'; + } } - } - // find playlists with write access - $stmt = \DBManager::get()->prepare('SELECT service_playlist_id FROM oc_playlist AS op + // find playlists with write access + $stmt = \DBManager::get()->prepare('SELECT service_playlist_id FROM oc_playlist AS op INNER JOIN oc_playlist_seminar AS ops ON (ops.playlist_id = op.id) WHERE ops.seminar_id IN (:courses)' - ); - $stmt->bindValue(':courses', $courses_write, \StudipPDO::PARAM_ARRAY); - $stmt->execute(); + ); + $stmt->bindValue(':courses', $courses_write, \StudipPDO::PARAM_ARRAY); + $stmt->execute(); - foreach ($stmt->fetchAll(\PDO::FETCH_COLUMN) as $service_playlist_id) { - $roles[$service_playlist_id . '_write'] = 'PLAYLIST_' . $service_playlist_id . '_write'; - } + foreach ($stmt->fetchAll(\PDO::FETCH_COLUMN) as $service_playlist_id) { + $roles[$service_playlist_id . '_write'] = 'PLAYLIST_' . $service_playlist_id . '_write'; + } - // find playlists with read access - $stmt = \DBManager::get()->prepare('SELECT service_playlist_id FROM oc_playlist AS op + // find playlists with read access + $stmt = \DBManager::get()->prepare('SELECT service_playlist_id FROM oc_playlist AS op INNER JOIN oc_playlist_seminar AS ops ON (ops.playlist_id = op.id) WHERE ops.seminar_id IN (:courses) AND ops.visibility = "visible"' - ); - $stmt->bindValue(':courses', $courses_read, \StudipPDO::PARAM_ARRAY); - $stmt->execute(); + ); + $stmt->bindValue(':courses', $courses_read, \StudipPDO::PARAM_ARRAY); + $stmt->execute(); - foreach ($stmt->fetchAll(\PDO::FETCH_COLUMN) as $service_playlist_id) { - // All seminar members have read permission on visible playlists - $roles[$service_playlist_id . '_read'] = 'PLAYLIST_' . $service_playlist_id . '_read'; + foreach ($stmt->fetchAll(\PDO::FETCH_COLUMN) as $service_playlist_id) { + // All seminar members have read permission on visible playlists + $roles[$service_playlist_id . '_read'] = 'PLAYLIST_' . $service_playlist_id . '_read'; + } } } } else {