PluginProbe
The Innovative Form Builder – IvyForms / 1.5.1
The Innovative Form Builder – IvyForms v1.5.1
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
← All changes | backend/src/Factory/Notification/NotificationFactory.php +183 -0 0.6.1 → 1.5.1 View file →
@@ -1,0 +1,183 @@
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 +}