PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.0.0
GiveWP – Donation Plugin and Fundraising Platform v4.0.0
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 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 / Campaigns / Controllers / CampaignRequestController.php
give / src / Campaigns / Controllers Last commit date
CampaignRequestController.php 1 year ago
CampaignRequestController.php
306 lines
1 <?php
2
3 namespace Give\Campaigns\Controllers;
4
5 use Exception;
6 use Give\Campaigns\Models\Campaign;
7 use Give\Campaigns\Models\CampaignPage;
8 use Give\Campaigns\Repositories\CampaignRepository;
9 use Give\Campaigns\Repositories\CampaignsDataRepository;
10 use Give\Campaigns\ValueObjects\CampaignGoalType;
11 use Give\Campaigns\ValueObjects\CampaignPageStatus;
12 use Give\Campaigns\ValueObjects\CampaignRoute;
13 use Give\Campaigns\ValueObjects\CampaignStatus;
14 use Give\Campaigns\ValueObjects\CampaignType;
15 use Give\Campaigns\ViewModels\CampaignViewModel;
16 use Give\Donations\ValueObjects\DonationMetaKeys;
17 use Give\Framework\Database\DB;
18 use Give\Framework\Models\ModelQueryBuilder;
19 use WP_Error;
20 use WP_REST_Request;
21 use WP_REST_Response;
22
23 /**
24 * @since 4.0.0
25 */
26 class CampaignRequestController
27 {
28 /**
29 * @since 4.0.0
30 *
31 * @return WP_Error | WP_REST_Response
32 */
33 public function getCampaign(WP_REST_Request $request)
34 {
35 $campaign = Campaign::find($request->get_param('id'));
36
37 if (!$campaign) {
38 return new WP_Error('campaign_not_found', __('Campaign not found', 'give'), ['status' => 404]);
39 }
40
41 return new WP_REST_Response((new CampaignViewModel($campaign))->exports());
42 }
43
44 /**
45 * @since 4.0.0
46 */
47 public function getCampaigns(WP_REST_Request $request): WP_REST_Response
48 {
49 $ids = $request->get_param('ids');
50 $page = $request->get_param('page');
51 $perPage = $request->get_param('per_page');
52 $status = $request->get_param('status');
53 $sortBy = $request->get_param('sortBy');
54 $orderBy = $request->get_param('orderBy');
55
56 $query = Campaign::query();
57
58 $query->whereIn('status', $status);
59
60 if (!empty($ids)) {
61 $query->whereIn('id', $ids);
62 }
63
64 $totalQuery = clone $query;
65
66 $query
67 ->limit($perPage)
68 ->offset(($page - 1) * $perPage);
69
70 $this->orderCampaigns($query, $sortBy, $orderBy);
71
72 $campaigns = $query->getAll() ?? [];
73 $totalCampaigns = empty($campaigns) ? 0 : $totalQuery->count();
74 $totalPages = $totalCampaigns === 0 ? 0 : (int)ceil($totalCampaigns / $perPage);
75
76 $ids = array_map(function ($campaign) {
77 return $campaign->id;
78 }, $campaigns);
79
80 // We don't have to optimize if the number of campaigns is less than 3
81 $campaignsData = count($ids) >= 3
82 ? CampaignsDataRepository::campaigns($ids)
83 : null;
84
85 $campaigns = array_map(function ($campaign) use ($campaignsData) {
86 $view = new CampaignViewModel($campaign);
87
88 if ($campaignsData) {
89 $view->setData($campaignsData);
90 }
91
92 return $view->exports();
93 }, $campaigns);
94
95 $response = rest_ensure_response($campaigns);
96 $response->header('X-WP-Total', $totalCampaigns);
97 $response->header('X-WP-TotalPages', $totalPages);
98
99 $base = add_query_arg(
100 map_deep($request->get_query_params(), function ($value) {
101 if (is_bool($value)) {
102 $value = $value ? 'true' : 'false';
103 }
104
105 return urlencode($value);
106 }),
107 rest_url(CampaignRoute::CAMPAIGNS)
108 );
109
110 if ($page > 1) {
111 $prevPage = $page - 1;
112
113 if ($prevPage > $totalPages) {
114 $prevPage = $totalPages;
115 }
116
117 $response->link_header('prev', add_query_arg('page', $prevPage, $base));
118 }
119
120 if ($totalPages > $page) {
121 $nextPage = $page + 1;
122 $response->link_header('next', add_query_arg('page', $nextPage, $base));
123 }
124
125 return $response;
126 }
127
128 /**
129 * @since 4.0.0
130 *
131 * @return WP_Error | WP_REST_Response
132 *
133 * @throws Exception
134 */
135 public function updateCampaign(WP_REST_Request $request)
136 {
137 $campaign = Campaign::find($request->get_param('id'));
138
139 if (!$campaign) {
140 return new WP_Error('campaign_not_found', __('Campaign not found', 'give'), ['status' => 404]);
141 }
142
143 $statusMap = [
144 'archived' => CampaignStatus::ARCHIVED(),
145 'draft' => CampaignStatus::DRAFT(),
146 'active' => CampaignStatus::ACTIVE(),
147 ];
148
149 foreach ($request->get_params() as $key => $value) {
150 switch ($key) {
151 case 'id':
152 break;
153 case 'status':
154 $status = array_key_exists($value, $statusMap)
155 ? $statusMap[$value]
156 : CampaignStatus::DRAFT();
157
158 $campaign->status = $status;
159
160 break;
161 case 'goal':
162 $campaign->goal = (int)$value;
163 break;
164 case 'goalType':
165 $campaign->goalType = new CampaignGoalType($value);
166 break;
167 case 'defaultFormId':
168 give(CampaignRepository::class)->updateDefaultCampaignForm(
169 $campaign,
170 $request->get_param('defaultFormId')
171 );
172 break;
173 case 'pageId':
174 $campaign->pageId = (int)$value;
175 break;
176 default:
177 if ($campaign->hasProperty($key)) {
178 $campaign->$key = $value;
179 }
180 }
181 }
182
183 if ($campaign->isDirty()) {
184 $campaign->save();
185 }
186
187 return new WP_REST_Response((new CampaignViewModel($campaign))->exports());
188 }
189
190 /**
191 * @since 4.0.0
192 *
193 * @throws Exception
194 * @return WP_Error | WP_REST_Response
195 */
196 public function mergeCampaigns(WP_REST_Request $request)
197 {
198 $destinationCampaign = Campaign::find($request->get_param('id'));
199
200 if (!$destinationCampaign) {
201 return new WP_Error('campaign_not_found', __('Campaign not found', 'give'), ['status' => 404]);
202 }
203
204 $campaignsToMerge = Campaign::query()->whereIn('id', $request->get_param('campaignsToMergeIds'))->getAll();
205
206 $campaignsMerged = $destinationCampaign->merge(...$campaignsToMerge);
207
208 return new WP_REST_Response($campaignsMerged);
209 }
210
211
212 /**
213 * @since 4.0.0
214 *
215 * @throws Exception
216 */
217 public function createCampaign(WP_REST_Request $request): WP_REST_Response
218 {
219 $campaign = Campaign::create([
220 'type' => CampaignType::CORE(),
221 'title' => $request->get_param('title'),
222 'shortDescription' => $request->get_param('shortDescription') ?? '',
223 'longDescription' => '',
224 'logo' => '',
225 'image' => $request->get_param('image') ?? '',
226 'primaryColor' => '#0b72d9',
227 'secondaryColor' => '#27ae60',
228 'goal' => (int)$request->get_param('goal'),
229 'goalType' => new CampaignGoalType($request->get_param('goalType')),
230 'status' => CampaignStatus::ACTIVE(),
231 'startDate' => $request->get_param('startDateTime'),
232 'endDate' => $request->get_param('endDateTime'),
233 ]);
234
235 return new WP_REST_Response((new CampaignViewModel($campaign))->exports(), 201);
236 }
237
238 /**
239 * @since 4.0.0
240 *
241 * @throws Exception
242 */
243 public function createCampaignPage(WP_REST_Request $request): WP_REST_Response
244 {
245 $campaignPage = CampaignPage::create([
246 'campaignId' => (int)$request->get_param('id'),
247 'status' => CampaignPageStatus::DRAFT(),
248 ]);
249
250 return new WP_REST_Response($campaignPage->toArray(), 201);
251 }
252
253 /**
254 * @since 4.0.0
255 */
256 private function orderCampaigns(ModelQueryBuilder $query, $sortBy, $orderBy)
257 {
258 switch ($sortBy) {
259 case 'date':
260 $query->orderBy('date_created', $orderBy);
261
262 break;
263 case 'amount':
264 $query
265 ->selectRaw(
266 '(SELECT SUM(amount) FROM %1s WHERE campaign_id = campaigns.id) AS amount',
267 DB::prefix('give_revenue')
268 )
269 ->orderBy('amount', $orderBy);
270
271 break;
272 case 'donations':
273 $query
274 ->selectRaw(
275 '(SELECT COUNT(donation_id) FROM %1s WHERE campaign_id = campaigns.id) AS donationsCount',
276 DB::prefix('give_revenue')
277 )
278 ->orderBy('donationsCount', $orderBy);
279
280 break;
281 case 'donors':
282
283 $postsTable = DB::prefix('posts');
284 $metaTable = DB::prefix('give_donationmeta');
285 $campaignIdKey = DonationMetaKeys::CAMPAIGN_ID;
286 $donorIdKey = DonationMetaKeys::DONOR_ID;
287
288 $query
289 ->selectRaw(
290 "(
291 SELECT COUNT(DISTINCT donorId.meta_value)
292 FROM {$postsTable} AS donation
293 LEFT JOIN {$metaTable} campaignId ON donation.ID = campaignId.donation_id AND campaignId.meta_key = '{$campaignIdKey}'
294 LEFT JOIN {$metaTable} donorId ON donation.ID = donorId.donation_id AND donorId.meta_key = '{$donorIdKey}'
295 WHERE post_type = 'give_payment'
296 AND donation.post_status IN ('publish', 'give_subscription')
297 AND campaignId.meta_value = campaigns.id
298 ) AS donorsCount"
299 )
300 ->orderBy('donorsCount', $orderBy);
301
302 break;
303 }
304 }
305 }
306