PluginProbe
The Innovative Form Builder – IvyForms / 1.5
The Innovative Form Builder – IvyForms v1.5
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
ivyforms / backend / src / Factory / Notification / NotificationFactory.php

NotificationFactory.php in The Innovative Form Builder – IvyForms 1.5, at backend/src/Factory/Notification/NotificationFactory.php

184 lines 5.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace IvyForms\Factory\Notification;
4
5 use IvyForms\Common\Exceptions\InvalidArgumentException;
6 use IvyForms\Entity\Notification\Notification as NotificationEntity;
7 use IvyForms\ValueObjects\Notification\Notification;
8 use IvyForms\ValueObjects\Notification\NotificationContact;
9
10 /**
11 * Class NotificationFactory
12 *
13 * @package IvyForms\Factory\Notification
14 */
15 class NotificationFactory
16 {
17 /**
18 * Lite-owned keys; everything else is treated as extension data (Pro / add-ons).
19 *
20 * @var string[]
21 */
22 private const KNOWN_NOTIFICATION_DATA_KEYS = [
23 'id',
24 'name',
25 'sender',
26 'replyTo',
27 'receiver',
28 'enabled',
29 'subject',
30 'message',
31 'showEmptyFields',
32 'smartLogic',
33 'formId',
34 ];
35
36 /**
37 * Create a NotificationEntity from an array of data.
38 *
39 * @param array<string, mixed> $data
40 *
41 * @return NotificationEntity
42 * @throws InvalidArgumentException
43 */
44 public static function create(array $data): NotificationEntity
45 {
46 /**
47 * Normalize/augment notification factory input (e.g. Pro attachment fields from DB).
48 *
49 * @since 1.2.0
50 *
51 * @param array<string, mixed> $data
52 */
53 $data = apply_filters('ivyforms/notification/factory_data', $data);
54
55 $smartLogic = self::normalizeSmartLogic($data['smartLogic'] ?? false);
56
57 $contact = new NotificationContact(
58 $data['sender'] ?? '',
59 $data['receiver'] ?? '',
60 $data['replyTo'] ?? '',
61 $data['cc'] ?? '',
62 $data['bcc'] ?? ''
63 );
64
65 $notificationValueObject = new Notification(
66 $data['id'] ?? 0,
67 $data['name'] ?? '',
68 $contact,
69 $data['enabled'] ?? true,
70 $data['subject'] ?? '',
71 $data['message'] ?? '',
72 (bool) ($data['showEmptyFields'] ?? false),
73 $smartLogic,
74 $data['formId'] ?? 0
75 );
76
77 $notificationEntity = new NotificationEntity($notificationValueObject);
78
79 if (isset($data['id'])) {
80 $notificationEntity->setId($data['id']);
81 }
82
83 if (isset($data['name'])) {
84 $notificationEntity->setName($data['name']);
85 }
86
87 if (isset($data['sender'])) {
88 $notificationEntity->getNotificationContact()->setSender($data['sender']);
89 }
90
91 if (isset($data['replyTo'])) {
92 $notificationEntity->getNotificationContact()->setReplyTo($data['replyTo']);
93 }
94
95 if (isset($data['receiver'])) {
96 $notificationEntity->getNotificationContact()->setReceiver($data['receiver']);
97 }
98
99 if (isset($data['cc'])) {
100 $notificationEntity->getNotificationContact()->setCc($data['cc']);
101 }
102
103 if (isset($data['bcc'])) {
104 $notificationEntity->getNotificationContact()->setBcc($data['bcc']);
105 }
106
107 if (isset($data['enabled'])) {
108 $notificationEntity->setEnabled($data['enabled']);
109 }
110
111 if (isset($data['subject'])) {
112 $notificationEntity->setSubject($data['subject']);
113 }
114
115 if (isset($data['message'])) {
116 $notificationEntity->setMessage(wp_unslash($data['message']));
117 }
118
119 if (isset($data['showEmptyFields'])) {
120 $notificationEntity->setShowEmptyFields((bool) $data['showEmptyFields']);
121 }
122
123 if (isset($data['smartLogic'])) {
124 $notificationEntity->setSmartLogic($smartLogic);
125 }
126
127 if (isset($data['formId'])) {
128 $notificationEntity->setFormId($data['formId']);
129 }
130
131 $notificationEntity->setExtensionData(self::extractExtensionData($data));
132
133 return $notificationEntity;
134 }
135
136 /**
137 * Keys in $data that are not owned by Lite.
138 *
139 * @param array<string, mixed> $data
140 * @return array<string, mixed>
141 */
142 private static function extractExtensionData(array $data): array
143 {
144 return array_diff_key($data, array_flip(self::KNOWN_NOTIFICATION_DATA_KEYS));
145 }
146
147 /**
148 * Normalize smartLogic from DB/API payload.
149 *
150 * @param mixed $smartLogic
151 * @return array<string, mixed>
152 */
153 private static function normalizeSmartLogic($smartLogic): array
154 {
155 if (is_array($smartLogic)) {
156 $match = $smartLogic['match'] ?? 'any';
157
158 return [
159 'enabled' => (bool)($smartLogic['enabled'] ?? false),
160 'match' => in_array($match, ['any', 'all'], true) ? $match : 'any',
161 'rules' => is_array($smartLogic['rules'] ?? null) ? $smartLogic['rules'] : [],
162 ];
163 }
164
165 if (is_string($smartLogic)) {
166 $decoded = json_decode($smartLogic, true);
167 if (is_array($decoded)) {
168 return self::normalizeSmartLogic($decoded);
169 }
170 return [
171 'enabled' => in_array(strtolower($smartLogic), ['1', 'true'], true),
172 'match' => 'any',
173 'rules' => [],
174 ];
175 }
176
177 return [
178 'enabled' => (bool)$smartLogic,
179 'match' => 'any',
180 'rules' => [],
181 ];
182 }
183 }
184