PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 / Donors / Repositories / DonorNotesRepository.php
give / src / Donors / Repositories Last commit date
DonorNotesRepository.php 1 year ago DonorRepository.php 8 months ago DonorRepositoryProxy.php 1 year ago
DonorNotesRepository.php
250 lines
1 <?php
2
3 namespace Give\Donors\Repositories;
4
5 use Exception;
6 use Give\Donors\Models\DonorNote;
7 use Give\Donors\ValueObjects\DonorNoteMetaKeys;
8 use Give\Donors\ValueObjects\DonorNoteType;
9 use Give\Framework\Database\DB;
10 use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
11 use Give\Framework\Models\ModelQueryBuilder;
12 use Give\Framework\Support\Facades\DateTime\Temporal;
13 use Give\Helpers\Hooks;
14 use Give\Log\Log;
15
16 /**
17 * @since 4.4.0
18 */
19 class DonorNotesRepository
20 {
21 /**
22 * @since 4.4.0
23 *
24 * @var string[]
25 */
26 private $requiredDonorProperties = [
27 'donorId',
28 'content',
29 ];
30
31 /**
32 * @since 4.4.0
33 */
34 public function getById(int $noteId): ?DonorNote
35 {
36 return $this->prepareQuery()
37 ->where('comment_ID', $noteId)
38 ->get();
39 }
40
41 /**
42 * @since 4.4.0
43 *
44 * @throws Exception
45 */
46 public function insert(DonorNote $donorNote)
47 {
48 if ( ! $donorNote->type) {
49 $donorNote->type = DonorNoteType::ADMIN();
50 }
51
52 $this->validateDonorNote($donorNote);
53
54 Hooks::doAction('givewp_donor_note_creating', $donorNote);
55
56 $dateCreated = Temporal::withoutMicroseconds($donorNote->createdAt ?: Temporal::getCurrentDateTime());
57 $dateCreatedFormatted = Temporal::getFormattedDateTime($dateCreated);
58
59
60 DB::beginTransaction();
61
62 try {
63 DB::table('give_comments')
64 ->insert([
65 'comment_content' => $donorNote->content,
66 'comment_date' => $dateCreatedFormatted,
67 'comment_date_gmt' => get_gmt_from_date($dateCreatedFormatted),
68 'comment_parent' => $donorNote->donorId,
69 'comment_type' => 'donor',
70 ]);
71
72 $commentId = DB::last_insert_id();
73
74 if ($donorNote->type->isDonor()) {
75 DB::table('give_commentmeta')
76 ->insert([
77 'give_comment_id' => $commentId,
78 'meta_key' => DonorNoteMetaKeys::TYPE,
79 'meta_value' => DonorNoteType::DONOR,
80 ]);
81 }
82 } catch (Exception $exception) {
83 DB::rollback();
84
85 Log::error('Failed creating a donor note', compact('donorNote'));
86
87 throw new $exception('Failed creating a donor note');
88 }
89
90 DB::commit();
91
92 $donorNote->id = $commentId;
93 $donorNote->createdAt = $dateCreated;
94
95 Hooks::doAction('givewp_donor_note_created', $donorNote);
96 }
97
98 /**
99 * @since 4.4.0
100 *
101 * @throws Exception
102 */
103 public function update(DonorNote $donorNote)
104 {
105 $this->validateDonorNote($donorNote);
106
107 Hooks::doAction('givewp_donor_note_updating', $donorNote);
108
109 DB::beginTransaction();
110
111 try {
112 DB::table('give_comments')
113 ->where('comment_ID', $donorNote->id)
114 ->update([
115 'comment_content' => $donorNote->content,
116 'comment_parent' => $donorNote->donorId,
117 'comment_type' => 'donor',
118 ]);
119 if ($donorNote->isDirty('type') && $donorNote->type->isDonor()) {
120 $this->upsertDonorNoteType($donorNote);
121 }
122 } catch (Exception $exception) {
123 DB::rollback();
124
125 Log::error('Failed updating a donor note', compact('donorNote'));
126
127 throw new $exception('Failed updating a donor note');
128 }
129
130 DB::commit();
131
132 Hooks::doAction('givewp_donor_note_updated', $donorNote);
133 }
134
135 /**
136 * @since 4.4.0
137 *
138 * @throws Exception
139 */
140 public function delete(DonorNote $donorNote): bool
141 {
142 DB::beginTransaction();
143
144 Hooks::doAction('givewp_donor_note_deleting', $donorNote);
145
146 try {
147 DB::table('give_comments')
148 ->where('comment_ID', $donorNote->id)
149 ->delete();
150
151 DB::table('give_commentmeta')
152 ->where('give_comment_id', $donorNote->id)
153 ->delete();
154 } catch (Exception $exception) {
155 DB::rollback();
156
157 Log::error('Failed deleting a donor note', compact('donorNote'));
158
159 throw new $exception('Failed deleting a donor note');
160 }
161
162 DB::commit();
163
164 Hooks::doAction('givewp_donor_note_deleted', $donorNote);
165
166 return true;
167 }
168
169 /**
170 * @since 4.4.0
171 */
172 public function queryByDonorId(int $donorId): ModelQueryBuilder
173 {
174 return $this->prepareQuery()
175 ->where('comment_parent', $donorId)
176 ->orderBy('comment_ID', 'DESC');
177 }
178
179 /**
180 * @since 4.4.0
181 *
182 * @return void
183 */
184 private function validateDonorNote(DonorNote $donorNote)
185 {
186 foreach ($this->requiredDonorProperties as $key) {
187 if ( ! isset($donorNote->$key)) {
188 throw new InvalidArgumentException("'$key' is required.");
189 }
190 }
191
192 if ( ! $donorNote->donor) {
193 throw new InvalidArgumentException('Invalid donorId, Donor does not exist');
194 }
195 }
196
197 /**
198 * @since 4.4.0
199 *
200 * @return ModelQueryBuilder<DonorNote>
201 */
202 public function prepareQuery(): ModelQueryBuilder
203 {
204 $builder = new ModelQueryBuilder(DonorNote::class);
205
206 return $builder->from('give_comments')
207 ->select(
208 ['comment_ID', 'id'],
209 ['comment_parent', 'donorId'],
210 ['comment_content', 'content'],
211 ['comment_date', 'createdAt']
212 )
213 ->attachMeta(
214 'give_commentmeta',
215 'comment_ID',
216 'give_comment_id',
217 ...DonorNoteMetaKeys::getColumnsForAttachMetaQuery()
218 )
219 ->where('comment_type', 'donor');
220 }
221
222 /**
223 * @since 4.4.0
224 */
225 private function upsertDonorNoteType(DonorNote $donorNote)
226 {
227 $table = DB::table('give_commentmeta');
228
229 $query = $table
230 ->where('give_comment_id', $donorNote->id)
231 ->where('meta_key', DonorNoteMetaKeys::TYPE)
232 ->get();
233
234 if ( ! $query) {
235 $table->insert([
236 'give_comment_id' => $donorNote->id,
237 'meta_key' => DonorNoteMetaKeys::TYPE,
238 'meta_value' => $donorNote->type->getValue(),
239 ]);
240 } else {
241 $table
242 ->where('give_comment_id', $donorNote->id)
243 ->where('meta_key', DonorNoteMetaKeys::TYPE)
244 ->update([
245 'meta_value' => $donorNote->type->getValue(),
246 ]);
247 }
248 }
249 }
250