PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.0
GiveWP – Donation Plugin and Fundraising Platform v4.16.0
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Subscriptions / Repositories / SubscriptionNotesRepository.php
give / src / Subscriptions / Repositories Last commit date
SubscriptionNotesRepository.php 9 months ago SubscriptionRepository.php 8 months ago
SubscriptionNotesRepository.php
258 lines
1 <?php
2
3 namespace Give\Subscriptions\Repositories;
4
5 use Give\Framework\Database\DB;
6 use Give\Framework\Exceptions\Primitives\Exception;
7 use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
8 use Give\Framework\Models\ModelQueryBuilder;
9 use Give\Framework\Support\Facades\DateTime\Temporal;
10 use Give\Helpers\Hooks;
11 use Give\Log\Log;
12 use Give\Subscriptions\Models\SubscriptionNote;
13 use Give\Subscriptions\ValueObjects\SubscriptionNoteMetaKeys;
14 use Give\Subscriptions\ValueObjects\SubscriptionNoteType;
15
16 /**
17 * NOTE: This repository is still using the old comments table.
18 * In the future, we will migrate to the new comments table.
19 *
20 * @since 4.8.0
21 */
22 class SubscriptionNotesRepository
23 {
24 /**
25 * @since 4.8.0
26 *
27 * @var string[]
28 */
29 private $requiredSubscriptionProperties = [
30 'subscriptionId',
31 'content',
32 ];
33
34 /**
35 * @since 4.8.0
36 */
37 private const COMMENT_TYPE = 'give_sub_note';
38
39 /**
40 * @since 4.8.0
41 */
42 public function getById(int $noteId): ?SubscriptionNote
43 {
44 return $this->prepareQuery()
45 ->where('comments.comment_ID', $noteId)
46 ->get();
47 }
48
49 /**
50 * @since 4.8.0
51 *
52 * @throws Exception|InvalidArgumentException
53 */
54 public function insert(SubscriptionNote $subscriptionNote): void
55 {
56 if (! $subscriptionNote->type) {
57 $subscriptionNote->type = SubscriptionNoteType::ADMIN();
58 }
59
60 $this->validateSubscriptionNote($subscriptionNote);
61
62 Hooks::doAction('givewp_subscription_note_creating', $subscriptionNote);
63
64 $dateCreated = Temporal::withoutMicroseconds($subscriptionNote->createdAt ?: Temporal::getCurrentDateTime());
65 $dateCreatedFormatted = Temporal::getFormattedDateTime($dateCreated);
66
67 DB::query('START TRANSACTION');
68
69 try {
70 DB::table('comments')
71 ->insert([
72 'comment_content' => $subscriptionNote->content,
73 'comment_date' => $dateCreatedFormatted,
74 'comment_date_gmt' => get_gmt_from_date($dateCreatedFormatted),
75 'comment_post_ID' => $subscriptionNote->subscriptionId,
76 'comment_type' => self::COMMENT_TYPE,
77 'user_id' => is_admin() ? get_current_user_id() : 0,
78 ]);
79
80 $commentId = DB::last_insert_id();
81
82 if ($subscriptionNote->type->isDonor()) {
83 DB::table('commentmeta')
84 ->insert([
85 'comment_ID' => $commentId,
86 'meta_key' => SubscriptionNoteMetaKeys::TYPE,
87 'meta_value' => SubscriptionNoteType::DONOR,
88 ]);
89 }
90 } catch (Exception $exception) {
91 DB::query('ROLLBACK');
92
93 Log::error('Failed creating a subscription note', compact('subscriptionNote'));
94
95 throw new $exception('Failed creating a subscription note');
96 }
97
98 DB::query('COMMIT');
99
100 $subscriptionNote->id = $commentId;
101 $subscriptionNote->createdAt = $dateCreated;
102
103 Hooks::doAction('givewp_subscription_note_created', $subscriptionNote);
104 }
105
106 /**
107 * @since 4.8.0
108 *
109 * @throws Exception|InvalidArgumentException
110 */
111 public function update(SubscriptionNote $subscriptionNote): void
112 {
113 $this->validateSubscriptionNote($subscriptionNote);
114
115 Hooks::doAction('givewp_subscription_note_updating', $subscriptionNote);
116
117 DB::query('START TRANSACTION');
118
119 try {
120 DB::table('comments')
121 ->where('comment_ID', $subscriptionNote->id)
122 ->update([
123 'comment_content' => $subscriptionNote->content,
124 'comment_post_ID' => $subscriptionNote->subscriptionId,
125 'comment_type' => self::COMMENT_TYPE,
126 'user_id' => is_admin() ? get_current_user_id() : 0,
127 ]);
128
129 if ($subscriptionNote->isDirty('type') && $subscriptionNote->type->isDonor()) {
130 $this->upsertSubscriptionNoteType($subscriptionNote);
131 }
132 } catch (Exception $exception) {
133 DB::query('ROLLBACK');
134
135 Log::error('Failed updating a subscription note', compact('subscriptionNote'));
136
137 throw new $exception('Failed updating a subscription note');
138 }
139
140 DB::query('COMMIT');
141
142 Hooks::doAction('givewp_subscription_note_updated', $subscriptionNote);
143 }
144
145 /**
146 * @since 4.8.0
147 *
148 * @throws Exception
149 */
150 public function delete(SubscriptionNote $subscriptionNote): bool
151 {
152 DB::query('START TRANSACTION');
153
154 Hooks::doAction('givewp_subscription_note_deleting', $subscriptionNote);
155
156 try {
157 DB::table('comments')
158 ->where('comment_ID', $subscriptionNote->id)
159 ->delete();
160
161 DB::table('commentmeta')
162 ->where('comment_ID', $subscriptionNote->id)
163 ->delete();
164 } catch (Exception $exception) {
165 DB::query('ROLLBACK');
166
167 Log::error('Failed deleting a subscription note', compact('subscriptionNote'));
168
169 throw new $exception('Failed deleting a subscription note');
170 }
171
172 DB::query('COMMIT');
173
174 Hooks::doAction('givewp_subscription_note_deleted', $subscriptionNote);
175
176 return true;
177 }
178
179 /**
180 * @since 4.8.0
181 */
182 public function queryBySubscriptionId(int $subscriptionId): ModelQueryBuilder
183 {
184 return $this->prepareQuery()
185 ->where('comments.comment_post_ID', $subscriptionId)
186 ->orderBy('comments.comment_ID', 'DESC');
187 }
188
189 /**
190 * @since 4.8.0
191 */
192 private function validateSubscriptionNote(SubscriptionNote $subscriptionNote): void
193 {
194 foreach ($this->requiredSubscriptionProperties as $key) {
195 if (! isset($subscriptionNote->$key)) {
196 throw new InvalidArgumentException("'$key' is required.");
197 }
198 }
199
200 if (! $subscriptionNote->subscription) {
201 throw new InvalidArgumentException('Invalid subscriptionId, Subscription does not exist');
202 }
203 }
204
205 /**
206 * @since 4.8.0
207 *
208 * @return ModelQueryBuilder<SubscriptionNote>
209 */
210 public function prepareQuery(): ModelQueryBuilder
211 {
212 $builder = new ModelQueryBuilder(SubscriptionNote::class);
213
214 return $builder->from('comments', 'comments')
215 ->select(
216 ['comments.comment_ID', 'id'],
217 ['comments.comment_post_ID', 'subscriptionId'],
218 ['comments.comment_content', 'content'],
219 ['comments.comment_date', 'createdAt']
220 )
221 ->attachMeta(
222 'commentmeta',
223 'comments.comment_ID',
224 'comment_ID',
225 ...SubscriptionNoteMetaKeys::getColumnsForAttachMetaQuery()
226 )
227 ->where('comments.comment_type', self::COMMENT_TYPE);
228 }
229
230 /**
231 * @since 4.8.0
232 */
233 private function upsertSubscriptionNoteType(SubscriptionNote $subscriptionNote): void
234 {
235 $table = DB::table('commentmeta');
236
237 $query = $table
238 ->where('comment_ID', $subscriptionNote->id)
239 ->where('meta_key', SubscriptionNoteMetaKeys::TYPE)
240 ->get();
241
242 if (! $query) {
243 $table->insert([
244 'comment_ID' => $subscriptionNote->id,
245 'meta_key' => SubscriptionNoteMetaKeys::TYPE,
246 'meta_value' => $subscriptionNote->type->getValue(),
247 ]);
248 } else {
249 $table
250 ->where('comment_ID', $subscriptionNote->id)
251 ->where('meta_key', SubscriptionNoteMetaKeys::TYPE)
252 ->update([
253 'meta_value' => $subscriptionNote->type->getValue(),
254 ]);
255 }
256 }
257 }
258