PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.18.0
GiveWP – Donation Plugin and Fundraising Platform v4.18.0
4.18.0 4.17.0 4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 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 All 257 releases
give / src / Campaigns / Repositories / CampaignPageRepository.php

CampaignPageRepository.php in GiveWP – Donation Plugin and Fundraising Platform 4.18.0, at src/Campaigns/Repositories/CampaignPageRepository.php

236 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Give\Campaigns\Repositories;
4
5 use Give\Campaigns\Actions\CreateDefaultLayoutForCampaignPage;
6 use Give\Campaigns\Models\CampaignPage;
7 use Give\Campaigns\ValueObjects\CampaignPageMetaKeys;
8 use Give\Campaigns\ValueObjects\CampaignPageStatus;
9 use Give\Framework\Database\DB;
10 use Give\Framework\Exceptions\Primitives\Exception;
11 use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
12 use Give\Framework\Models\ModelQueryBuilder;
13 use Give\Framework\Support\Facades\DateTime\Temporal;
14 use Give\Helpers\Hooks;
15 use Give\Log\Log;
16
17 /**
18 * @since 4.0.0
19 */
20 class CampaignPageRepository
21 {
22 /**
23 * @since 4.0.0
24 */
25 protected $requiredProperties = [
26 'campaignId',
27 ];
28
29 /**
30 * @since 4.0.0
31 */
32 public function getById(int $id): ?CampaignPage
33 {
34 return $this->prepareQuery()
35 ->where('id', $id)
36 ->get();
37 }
38
39 /**
40 * @since 4.0.0
41 */
42 public function queryByCampaignId(int $campaignId): ModelQueryBuilder
43 {
44 return $this->prepareQuery()
45 ->where('post_status', CampaignPageStatus::TRASH()->getValue(), '!=')
46 ->where('postmeta_attach_meta_campaignId.meta_value', $campaignId);
47 }
48
49 /**
50 * @since 4.0.0
51 */
52 public function findByCampaignId(int $campaignId): ?CampaignPage
53 {
54 return $this->queryByCampaignId($campaignId)->get();
55 }
56
57 /**
58 * @since 4.18.0 Keep the original error as the previous exception when the write fails.
59 * @since 4.0.0
60 * @throws Exception
61 */
62 public function insert(CampaignPage $campaignPage): void
63 {
64 $this->validate($campaignPage);
65
66 Hooks::doAction('givewp_campaign_page_creating', $campaignPage);
67
68 $dateCreated = Temporal::withoutMicroseconds($campaignPage->createdAt ?: Temporal::getCurrentDateTime());
69 $dateCreatedFormatted = Temporal::getFormattedDateTime($dateCreated);
70 $dateUpdated = $campaignPage->updatedAt ?? $dateCreated;
71 $dateUpdatedFormatted = Temporal::getFormattedDateTime($dateUpdated);
72 $status = $campaignPage->status ?? CampaignPageStatus::DRAFT();
73 $campaign = $campaignPage->campaign();
74
75 if (!$campaign) {
76 throw new Exception('Campaign not found');
77 }
78
79 DB::query('START TRANSACTION');
80
81 try {
82 $campaignPage->id = wp_insert_post([
83 'post_title' => $campaign->title,
84 'post_name' => sanitize_title($campaign->title),
85 'post_date' => $dateCreatedFormatted,
86 'post_modified' => $dateUpdatedFormatted,
87 'post_status' => $status->getValue(),
88 'post_type' => 'page',
89 'post_content' => $campaignPage->content ?? give(CreateDefaultLayoutForCampaignPage::class)(
90 $campaign->id,
91 $campaign->shortDescription
92 ),
93 ]);
94
95 if (!$campaignPage->id) {
96 throw new Exception('Failed creating a campaign page');
97 }
98
99 $campaignPage->createdAt = $dateCreated;
100 $campaignPage->updatedAt = $dateUpdated;
101 $campaignPage->status = $status;
102
103 update_post_meta($campaignPage->id, CampaignPageMetaKeys::CAMPAIGN_ID, $campaignPage->campaignId);
104
105 if ($campaign->image && $imageId = attachment_url_to_postid($campaign->image)) {
106 set_post_thumbnail($campaignPage->id, $imageId);
107 }
108 } catch (Exception $exception) {
109 DB::query('ROLLBACK');
110
111 Log::error('Failed creating a campaign page', [$campaignPage]);
112
113 throw new Exception('Failed creating a campaign page', 0, $exception);
114 }
115
116 DB::query('COMMIT');
117
118 Hooks::doAction('givewp_campaign_page_created', $campaignPage);
119 }
120
121 /**
122 * @since 4.18.0 Keep the original error as the previous exception when the write fails.
123 * @since 4.0.0
124 * @throws Exception
125 */
126 public function update(CampaignPage $campaignPage): void
127 {
128 $this->validate($campaignPage);
129
130 Hooks::doAction('givewp_campaign_page_updating', $campaignPage);
131
132 $now = Temporal::withoutMicroseconds(Temporal::getCurrentDateTime());
133 $nowFormatted = Temporal::getFormattedDateTime($now);
134 $status = $campaignPage->status ?? CampaignPageStatus::PUBLISH();
135
136 DB::query('START TRANSACTION');
137
138 try {
139 DB::table('posts')
140 ->where('ID', $campaignPage->id)
141 ->update([
142 'post_modified' => $nowFormatted,
143 'post_modified_gmt' => get_gmt_from_date($nowFormatted),
144 'post_status' => $status->getValue(),
145 'post_content' => $campaignPage->content,
146 ]);
147
148 $campaignPage->updatedAt = $now;
149 $campaignPage->status = $status;
150
151 update_post_meta($campaignPage->id, CampaignPageMetaKeys::CAMPAIGN_ID, $campaignPage->campaignId);
152 } catch (Exception $exception) {
153 DB::query('ROLLBACK');
154
155 Log::error('Failed updating a campaign page', [$campaignPage]);
156
157 throw new Exception('Failed updating a campaign page', 0, $exception);
158 }
159
160 DB::query('COMMIT');
161
162 Hooks::doAction('givewp_campaign_page_updated', $campaignPage);
163 }
164
165 /**
166 * @since 4.18.0 Keep the original error as the previous exception when the write fails.
167 * @since 4.0.0
168 * @throws Exception
169 */
170 public function delete(CampaignPage $campaignPage): bool
171 {
172 DB::query('START TRANSACTION');
173
174 Hooks::doAction('givewp_campaign_page_deleting', $campaignPage);
175
176 try {
177 DB::table('posts')
178 ->where('id', $campaignPage->id)
179 ->delete();
180
181 DB::table('postmeta')
182 ->where('post_id', $campaignPage->id)
183 ->delete();
184 } catch (Exception $exception) {
185 DB::query('ROLLBACK');
186
187 Log::error('Failed deleting a campaign page', [$campaignPage]);
188
189 throw new Exception('Failed deleting a campaign page', 0, $exception);
190 }
191
192 DB::query('COMMIT');
193
194 Hooks::doAction('givewp_campaign_page_deleted', $campaignPage);
195
196 return true;
197 }
198
199 /**
200 * @since 4.0.0
201 *
202 * @return ModelQueryBuilder<CampaignPage>
203 */
204 public function prepareQuery(): ModelQueryBuilder
205 {
206 $builder = new ModelQueryBuilder(CampaignPage::class);
207
208 return $builder->from('posts')
209 ->select(
210 ['ID', 'id'],
211 ['post_date', 'createdAt'],
212 ['post_modified', 'updatedAt'],
213 ['post_status', 'status'],
214 ['post_content', 'content']
215 )
216 ->attachMeta(
217 'postmeta',
218 'ID',
219 'post_id',
220 ...CampaignPageMetaKeys::getColumnsForAttachMetaQuery()
221 );
222 }
223
224 /**
225 * @since 4.0.0
226 */
227 public function validate(CampaignPage $campaignPage)
228 {
229 foreach ($this->requiredProperties as $key) {
230 if (!isset($campaignPage->$key)) {
231 throw new InvalidArgumentException("'$key' is required.");
232 }
233 }
234 }
235 }
236