ApiService.php
7 months ago
ElementService.php
7 months ago
EmailService.php
7 months ago
FormService.php
7 months ago
LevelOrderService.php
7 months ago
LevelService.php
7 months ago
MembershipService.php
7 months ago
RedirectService.php
7 months ago
SanitizationService.php
7 months ago
StatisticsService.php
7 months ago
UserService.php
7 months ago
RedirectService.php
271 lines
| 1 | <?php declare(strict_types=1); |
| 2 | |
| 3 | namespace FapiMember\Service; |
| 4 | |
| 5 | use FapiMember\Container\Container; |
| 6 | use FapiMember\Model\Enums\Keys\OptionKey; |
| 7 | use FapiMember\Model\Enums\Keys\SessionKey; |
| 8 | use FapiMember\Model\Enums\Types\LevelUnlockType; |
| 9 | use FapiMember\Model\Enums\UserPermission; |
| 10 | use FapiMember\Repository\LevelRepository; |
| 11 | use FapiMember\Repository\PageRepository; |
| 12 | use FapiMember\Repository\UserRepository; |
| 13 | use FapiMember\Utils\PostTypeHelper; |
| 14 | use JetBrains\PhpStorm\NoReturn; |
| 15 | use WP_Post; |
| 16 | |
| 17 | class RedirectService |
| 18 | { |
| 19 | private LevelRepository $levelRepository; |
| 20 | private MembershipService $membershipService; |
| 21 | private PageRepository $pageRepository; |
| 22 | private UserRepository $userRepository; |
| 23 | |
| 24 | public function __construct() |
| 25 | { |
| 26 | $this->levelRepository = Container::get(LevelRepository::class); |
| 27 | $this->membershipService = Container::get(MembershipService::class); |
| 28 | $this->pageRepository = Container::get(PageRepository::class); |
| 29 | $this->userRepository = Container::get(UserRepository::class); |
| 30 | } |
| 31 | |
| 32 | public function checkPageForRedirects(): bool |
| 33 | { |
| 34 | global $wp_query; |
| 35 | |
| 36 | if (!isset($wp_query->post) || |
| 37 | !($wp_query->post instanceof WP_Post) || |
| 38 | !in_array( $wp_query->post->post_type, PostTypeHelper::getSupportedPostTypes(), true) |
| 39 | ) { |
| 40 | return true; |
| 41 | } |
| 42 | |
| 43 | if (current_user_can(UserPermission::REQUIRED_CAPABILITY)) { |
| 44 | return true; |
| 45 | } |
| 46 | |
| 47 | $pageId = $wp_query->post->ID; |
| 48 | |
| 49 | if ($pageId === (int) get_option('page_on_front')) { |
| 50 | return true; |
| 51 | } |
| 52 | |
| 53 | $levels = $this->levelRepository->getAllAsLevels(); |
| 54 | $levelsForThisPage = []; |
| 55 | $post_type = $wp_query->post->post_type; |
| 56 | $all_stored_post_types = get_option(OptionKey::POST_TYPES, array()); |
| 57 | |
| 58 | foreach ($all_stored_post_types as $levelId => $post_types) { |
| 59 | if (is_string( $post_types)) { |
| 60 | $post_types = array($post_types); |
| 61 | } |
| 62 | |
| 63 | $level = $this->levelRepository->getLevelById($levelId); |
| 64 | |
| 65 | if (in_array( $post_type, $post_types, true) && $level !== null) { |
| 66 | $levelsForThisPage[] = $level; |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | foreach ($levels as $level) { |
| 71 | if ($level->getPageIds() === []) { |
| 72 | continue; |
| 73 | } |
| 74 | |
| 75 | foreach ($level->getPageIds() as $levelPageId) { |
| 76 | if ($pageId === $levelPageId) { |
| 77 | $levelsForThisPage[] = $level; |
| 78 | } |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | if (count($levelsForThisPage) === 0) { |
| 83 | return true; |
| 84 | } |
| 85 | |
| 86 | $firstLevel = $levelsForThisPage[0]; |
| 87 | |
| 88 | if (!is_user_logged_in()) { |
| 89 | $this->redirectToNoAccessPage($firstLevel->getId()); |
| 90 | } |
| 91 | |
| 92 | $memberships = $this->membershipService->getActiveWithAccessByUserId( |
| 93 | $this->userRepository->getCurrentUser()->getId() |
| 94 | ); |
| 95 | |
| 96 | foreach ($memberships as $membership) { |
| 97 | foreach ($levelsForThisPage as $levelForThisPage) { |
| 98 | if ($membership->getLevelId() == $levelForThisPage->getId()) { |
| 99 | return true; |
| 100 | } |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | if ($firstLevel->getUnlockType() !== null && $firstLevel->getUnlockType() !== LevelUnlockType::NONE) { |
| 105 | $this->redirectToTimedUnlockNoAccessPage(); |
| 106 | } |
| 107 | |
| 108 | $this->redirectToNoAccessPage($firstLevel->getId()); |
| 109 | |
| 110 | return false; |
| 111 | } |
| 112 | |
| 113 | public function redirectToNoAccessPage($levelId): void |
| 114 | { |
| 115 | global $wp_query; |
| 116 | |
| 117 | session_start(); |
| 118 | |
| 119 | $_SESSION[SessionKey::LAST_PAGE_ID] = $wp_query->post->ID; |
| 120 | |
| 121 | session_write_close(); |
| 122 | |
| 123 | $level = $this->levelRepository->getLevelById($levelId); |
| 124 | |
| 125 | if ($level?->getNoAccessPageId() !== null) { |
| 126 | $this->redirectToPage($level->getNoAccessPageId()); |
| 127 | } |
| 128 | |
| 129 | $this->redirectToHomePage(); |
| 130 | } |
| 131 | |
| 132 | public function redirectToTimedUnlockNoAccessPage(): void |
| 133 | { |
| 134 | $pageId = $this->pageRepository->getTimedUnlockNoAccessPageId(); |
| 135 | |
| 136 | if ($pageId !== null) { |
| 137 | $this->redirectToPage($pageId); |
| 138 | } |
| 139 | |
| 140 | $this->redirectToHomePage(); |
| 141 | } |
| 142 | |
| 143 | public function loginRedirect(int|null $userId) |
| 144 | { |
| 145 | if ($userId === null) { |
| 146 | return get_site_url(); |
| 147 | } |
| 148 | |
| 149 | if (user_can($userId, UserPermission::REQUIRED_CAPABILITY)) { |
| 150 | return admin_url(); |
| 151 | } |
| 152 | |
| 153 | $memberships = $this->membershipService->getActiveByUserIdAndUpdate($userId); |
| 154 | |
| 155 | $allowedPages = []; |
| 156 | |
| 157 | foreach ($memberships as $membership) { |
| 158 | $allowedPages = array_merge( |
| 159 | $this->pageRepository->getPageIdsByLevelId($membership->getLevelId()), |
| 160 | $allowedPages, |
| 161 | ); |
| 162 | } |
| 163 | |
| 164 | $allowedPages = array_unique(array_filter($allowedPages)); |
| 165 | $lastPageId = null; |
| 166 | session_start(); |
| 167 | |
| 168 | if ( |
| 169 | isset($_SESSION[SessionKey::LAST_PAGE_ID]) && |
| 170 | $_SESSION[SessionKey::LAST_PAGE_ID] !== null && |
| 171 | in_array($_SESSION[SessionKey::LAST_PAGE_ID], $allowedPages) |
| 172 | ) { |
| 173 | $lastPageId = $_SESSION[SessionKey::LAST_PAGE_ID]; |
| 174 | } |
| 175 | |
| 176 | $_SESSION[SessionKey::LAST_PAGE_ID] = null; |
| 177 | session_write_close(); |
| 178 | |
| 179 | if ($lastPageId !== null) { |
| 180 | $this->redirectToPage($lastPageId); |
| 181 | } |
| 182 | |
| 183 | $pages = array_map( |
| 184 | function ($membership) { |
| 185 | $level = $this->levelRepository->getLevelById($membership->getLevelId()); |
| 186 | return $level->getAfterLoginPageId(); |
| 187 | }, |
| 188 | $memberships, |
| 189 | ); |
| 190 | |
| 191 | $pages = array_unique(array_filter($pages)); |
| 192 | |
| 193 | if (count($pages) === 1) { |
| 194 | $pageId = array_shift($pages); |
| 195 | $pageUrl = $this->pageRepository->getPageUrlById($pageId); |
| 196 | |
| 197 | if ($pageUrl !== null) { |
| 198 | return $pageUrl; |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | $dashboardPageId = $this->pageRepository->getCommonDashboardPageId(); |
| 203 | $defaultDashboardUrl = $this->pageRepository->getPageUrlById($dashboardPageId); |
| 204 | |
| 205 | if ($defaultDashboardUrl !== null) { |
| 206 | return $defaultDashboardUrl; |
| 207 | } |
| 208 | |
| 209 | if (count($pages) > 1) { |
| 210 | define( 'FAPI_SHOWING_LEVEL_SELECTION', 1 ); |
| 211 | include __DIR__ . '/../Templates/levelSelection.php'; |
| 212 | |
| 213 | exit; |
| 214 | } |
| 215 | |
| 216 | return get_site_url(); |
| 217 | } |
| 218 | |
| 219 | /** @description Because of WPS hide login plugin */ |
| 220 | public function loggedInRedirect(): string |
| 221 | { |
| 222 | return $this->loginRedirect($this->userRepository->getCurrentUser()->getId()); |
| 223 | } |
| 224 | |
| 225 | #[NoReturn] |
| 226 | public function redirectToPage(int $pageId): void |
| 227 | { |
| 228 | wp_redirect(get_permalink($pageId)); |
| 229 | |
| 230 | exit; |
| 231 | } |
| 232 | |
| 233 | #[NoReturn] |
| 234 | public function redirectToHomePage(): void |
| 235 | { |
| 236 | wp_redirect(home_url()); |
| 237 | |
| 238 | exit; |
| 239 | } |
| 240 | |
| 241 | #[NoReturn] |
| 242 | public function redirect(string $subpage, string|null $alert = null, $params = array()): void |
| 243 | { |
| 244 | $tail = ''; |
| 245 | |
| 246 | foreach ($params as $key => $value ) { |
| 247 | $tail .= sprintf( '&%s=%s', $key, urlencode((string) $value)); |
| 248 | } |
| 249 | |
| 250 | if ($alert !== null) { |
| 251 | $alert = '&e=' . $alert; |
| 252 | } else { |
| 253 | $alert = ''; |
| 254 | } |
| 255 | |
| 256 | wp_redirect( |
| 257 | admin_url( |
| 258 | sprintf( |
| 259 | '/admin.php?page=fapi-member-options&subpage=%s%s%s', |
| 260 | $subpage, |
| 261 | $alert, |
| 262 | $tail |
| 263 | ) |
| 264 | ) |
| 265 | ); |
| 266 | |
| 267 | exit; |
| 268 | } |
| 269 | |
| 270 | } |
| 271 |