PluginProbe ʕ •ᴥ•ʔ
FAPI Member / trunk
FAPI Member vtrunk
2.2.35 2.2.34 2.2.33 2.2.32 trunk 1.9.47 2.1.18 2.2.24 2.2.25 2.2.26 2.2.28 2.2.29 2.2.30 2.2.31
fapi-member / src / Api / RequestHandler.php
fapi-member / src / Api Last commit date
V1 1 year ago V2 1 month ago RequestHandler.php 2 years ago
RequestHandler.php
323 lines
1 <?php
2
3 namespace FapiMember\Api;
4
5 use FapiMember\Container\Container;
6 use FapiMember\FapiMemberPlugin;
7 use FapiMember\Model\Enums\Keys\OptionKey;
8 use FapiMember\Repository\LevelRepository;
9 use FapiMember\Service\ApiService;
10 use FapiMember\Service\EmailService;
11 use FapiMember\Service\LevelService;
12 use FapiMember\Service\MembershipService;
13 use FapiMember\Service\UserService;
14 use WP_REST_Request;
15
16 class RequestHandler
17 {
18 private MembershipService $membershipService;
19 private EmailService $emailService;
20 private ApiService $apiService;
21 private LevelService $levelService;
22 private UserService $userService;
23 private LevelRepository $levelRepository;
24
25 public function __construct()
26 {
27 $this->emailService = Container::get(EmailService::class);
28 $this->membershipService = Container::get(MembershipService::class);
29 $this->apiService = Container::get(ApiService::class);
30 $this->levelService = Container::get(LevelService::class);
31 $this->userService = Container::get(UserService::class);
32 $this->levelRepository = Container::get(LevelRepository::class);
33 }
34
35 public function handleApiSections(WP_REST_Request $request): void
36 {
37 $sections = $this->levelRepository->getAllSections();
38 $array = [];
39
40 foreach ($sections as $section) {
41 $array[] = $section->toArray();
42 }
43
44 wp_send_json($array);
45 }
46
47 public function handleApiSectionsSimple(WP_REST_Request $request): void
48 {
49 $params = $request->get_query_params();
50 $limit = null;
51
52 if (isset($params['limit']) && is_numeric($params['limit'])) {
53 $limit = (int) $params['limit'];
54 }
55
56 $sections = $this->levelRepository->getAllSections();
57 $simplifiedSections = [];
58
59 $iterator = 0;
60
61 foreach ($sections as $section) {
62 if ($iterator === $limit) {
63 break;
64 }
65
66 $iterator++;
67
68 $simplifiedSections[] = [
69 'id' => $section->getId(),
70 'name' => $section->getName(),
71 ];
72
73 foreach ($section->getLevels() as $level) {
74 $simplifiedSections[] = [
75 'id' => $level->getId(),
76 'name' => $section->getName() . ' - ' . $level->getName(),
77 ];
78 }
79 }
80
81 wp_send_json($simplifiedSections);
82 }
83
84 public function handleApiCallback(WP_REST_Request $request): void
85 {
86 $params = $request->get_params();
87 $body = $request->get_body();
88 $data = [];
89 parse_str($body, $data);
90
91 if (!isset($params['level'])) {
92 $this->apiService->callbackError([
93 'class'=> self::class,
94 'description' => 'Level parameter missing in get params.',
95 ]);
96 }
97
98 if (is_array($params['level'])) {
99 $levelIds = [];
100
101 foreach ($params['level'] as $level) {
102 $levelIds[] = (int) $level;
103 }
104 } else {
105 $levelIds = [(int) $params['level']];
106 }
107
108 foreach ($levelIds as $levelId) {
109 $level = $this->levelRepository->getLevelById((int) $levelId);
110
111 if ($level === null) {
112 $this->apiService->callbackError([
113 'class' => self::class,
114 'description' => sprintf(
115 'Section or level with ID %s, does not exist.',
116 $levelId,
117 ),
118 ]);
119 }
120 }
121
122 if (isset($data['voucher'])) {
123 $userData = $this->emailService->getEmailFromValidVoucher($data);
124 } elseif (isset($data['id'])) {
125 $userData = $this->emailService->getEmailFromPaidInvoice($data);
126 } elseif (isset($data['token'])) {
127 $userData = $this->emailService->getEmailFromBodyWithValidToken($data);
128 } else {
129 $this->apiService->callbackError([
130 'class' => self::class,
131 'description' => 'Invalid notification received. Missing voucher, id or token.',
132 ]);
133 }
134
135 if (!is_email($userData['email'])) {
136 $this->apiService->callbackError([
137 'class' => self::class,
138 'description' => 'Invalid email provided. Email given: ' . $userData['email'],
139 ]);
140 }
141
142
143 if (isset($params['days'])) {
144 $days = (int) $params['days'];
145 } else {
146 $days = null;
147 }
148
149 if (isset($data['id']) && $days !== null) {
150 $invoice = $this->apiService->getInvoice((int) $data['id']);
151 $repaymentNumber = $invoice['repayment_number'] ?? 1;
152 $repaymentInvoices = $this->apiService->getAllInvoicesInRepayment((int) $data['id']);
153 $highestRepayment = 1;
154
155 if ($repaymentNumber !== 0 && $repaymentNumber !== null) {
156 foreach ($repaymentInvoices as $repaymentInvoice) {
157 if (
158 isset($repaymentInvoice['repayment_number']) &&
159 $repaymentInvoice['repayment_number'] > $highestRepayment
160 ) {
161 $highestRepayment = $repaymentInvoice['repayment_number'];
162 }
163 }
164
165 $repaymentDays = intdiv($days, $highestRepayment);
166
167 if ($repaymentNumber === 1) {
168 $repaymentDays += $days % $highestRepayment;
169 }
170
171 $days = $repaymentDays;
172 }
173 }
174
175 $isUnlimited = $days === null;
176 $props = [];
177 $user = $this->userService->getOrCreateUser($userData, $props);
178
179 if ($user === null) {
180 $this->apiService->callbackError([
181 'class' => self::class,
182 'description' => 'Failed to create user.',
183 ]);
184 }
185
186 foreach ($levelIds as $levelId) {
187 $props = $this->membershipService->createOrProlongMembership(
188 $user->getId(),
189 $levelId,
190 $isUnlimited,
191 $days
192 ) + $props;
193 $props = $this->enhanceProps($props) + $props;
194 }
195
196 $wasUserCreatedNow = isset($props['new_user']) && $props['new_user'] === true;
197 $levels = $this->levelRepository->getLevelsByIds($levelIds);
198
199 $emailsToSend = $this->emailService->findEmailsToSend($user->getId(), $levels, $wasUserCreatedNow);
200
201 foreach ($emailsToSend as $emailToSend) {
202 [$type, $level] = $emailToSend;
203
204 $this->emailService->sendEmail($user->getEmail(), $type, $level->getId(), $props);
205 }
206
207 wp_send_json_success([FapiMemberPlugin::FAPI_MEMBER_PLUGIN_VERSION_KEY => FAPI_MEMBER_PLUGIN_VERSION]);
208
209 die;
210 }
211
212 /**
213 * @param array<mixed> $props
214 * @return array<mixed>
215 */
216 public function enhanceProps(array $props): array
217 {
218 if ( isset( $props['membership_level_added_level'] ) ) {
219 $props['membership_level_added_level_name'] = $this->levelRepository
220 ->getLevelById($props['membership_level_added_level'])->getName();
221 }
222
223 if ( isset( $props['membership_prolonged_level'] ) ) {
224 $props['membership_prolonged_level_name'] = $this->levelRepository
225 ->getLevelById($props['membership_prolonged_level'])->getName();
226 }
227
228 if (isset($props['membership_level_added_level'])) {
229 $loginUrl = $this->levelService->getLoginUrl($props['membership_level_added_level']);
230 } else {
231 $loginUrl = $this->levelService->getLoginUrl();
232 }
233
234 $props['login_link'] = sprintf( '<a href="%s">zde</a>', $loginUrl);
235 $props['login_link_url'] = $loginUrl;
236
237 return $props;
238 }
239
240 public function handleApiCheckConnectionCallback(WP_REST_Request $request) {
241 $body = $request->get_body();
242 $data = [];
243 parse_str($body, $data);
244
245 $token = get_option(OptionKey::TOKEN);
246
247 if (!isset($data['token'])) {
248 $this->apiService->callbackError([
249 'class' => self::class,
250 'description' => 'Missing token.',
251 ]);
252 }
253
254 if ($token !== $data['token']) {
255 $this->apiService->callbackError([
256 'class' => self::class,
257 'description' => 'Invalid token provided. Check token correctness.',
258 ]);
259 }
260
261 wp_send_json_success();
262 }
263
264 public function handleApiUsernamesCallback(WP_REST_Request $request): void
265 {
266 $credentials = json_decode(get_option(OptionKey::API_CREDENTIALS));
267 foreach ($credentials as $credential) {
268 $usernames[] = [
269 'label' => $credential->username,
270 'value' => $credential->username,
271 ];
272 }
273 wp_send_json(json_encode($usernames));
274 }
275
276 public function handleApiListFormsCallback(WP_REST_Request $request): void
277 {
278 $user = (($request->get_param('user') === 'all')
279 ? 'all'
280 : is_email($request->get_param('user')))
281 ? $request->get_param('user')
282 : null;
283
284 $forms = [];
285 $out = [];
286 $apiClients = $this->apiService->getApiClients();
287
288 if ($user === 'all' || empty($user)) {
289 foreach ($apiClients as $apiClient) {
290 array_push($forms, $apiClient->getForms());
291 }
292
293 foreach ($forms as $singleClientForms) {
294 foreach ($singleClientForms as $form) {
295 $out[] = array(
296 'label' => $form['name'],
297 'value' => $form['path'],
298 );
299 }
300 }
301
302 wp_send_json($out);
303 exit;
304 }
305
306 foreach ($apiClients as $apiClient) {
307 if ($apiClient->getConnection()->getApiUser() === $user) {
308 $forms = $apiClient->getForms();
309 break;
310 }
311 }
312
313 foreach ($forms as $form) {
314 $out[] = array(
315 'label' => $form['name'],
316 'value' => $form['path'],
317 );
318 }
319
320 wp_send_json($out);
321 }
322 }
323