PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.13.1
GiveWP – Donation Plugin and Fundraising Platform v4.13.1
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 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 / ListTable / Routes / GetCampaignsListTable.php
give / src / Campaigns / ListTable / Routes Last commit date
DeleteCampaignListTable.php 1 year ago GetCampaignsListTable.php 8 months ago
GetCampaignsListTable.php
245 lines
1 <?php
2
3 namespace Give\Campaigns\ListTable\Routes;
4
5 use Give\API\REST\V3\Routes\Campaigns\ValueObjects\CampaignRoute;
6 use Give\API\RestRoute;
7 use Give\Campaigns\ListTable\CampaignsListTable;
8 use Give\Campaigns\ListTable\Columns\RevenueColumn;
9 use Give\Campaigns\Models\Campaign;
10 use Give\Campaigns\Repositories\CampaignRepository;
11 use Give\Campaigns\Repositories\CampaignsDataRepository;
12 use Give\Framework\QueryBuilder\QueryBuilder;
13 use WP_Error;
14 use WP_REST_Request;
15 use WP_REST_Response;
16 use WP_REST_Server;
17
18 /**
19 * @since 4.0.0
20 */
21 class GetCampaignsListTable implements RestRoute
22 {
23 /**
24 * @var string
25 */
26 protected $endpoint = 'campaigns/list-table';
27
28 /**
29 * @var WP_REST_Request
30 */
31 protected $request;
32
33 /**
34 * @var CampaignsListTable
35 */
36 protected $listTable;
37
38 /**
39 * @since 4.0.0
40 */
41 public function registerRoute(): void
42 {
43 register_rest_route(
44 CampaignRoute::NAMESPACE,
45 $this->endpoint,
46 [
47 [
48 'methods' => WP_REST_Server::READABLE,
49 'callback' => [$this, 'handleRequest'],
50 'permission_callback' => [$this, 'permissionsCheck'],
51 ],
52 'args' => [
53 'page' => [
54 'type' => 'integer',
55 'default' => 1,
56 'minimum' => 1,
57 ],
58 'perPage' => [
59 'type' => 'integer',
60 'default' => 30,
61 'minimum' => 1,
62 ],
63 'search' => [
64 'type' => 'string',
65 'required' => false,
66 'sanitize_callback' => 'sanitize_text_field',
67 ],
68 'status' => [
69 'type' => 'string',
70 'required' => false,
71 'sanitize_callback' => 'sanitize_text_field',
72 ],
73 'sortColumn' => [
74 'type' => 'string',
75 'default' => 'id',
76 'sanitize_callback' => 'sanitize_text_field',
77 ],
78 'sortDirection' => [
79 'type' => 'string',
80 'default' => 'asc',
81 'enum' => ['asc', 'desc'],
82 ],
83 'locale' => [
84 'type' => 'string',
85 'required' => false,
86 'default' => get_locale(),
87 ],
88 ],
89 ]
90 );
91 }
92
93 /**
94 * @since 4.12.0 add support for sorting by revenue column
95 * @since 4.0.0
96 */
97 public function handleRequest(WP_REST_Request $request): WP_REST_Response
98 {
99 $this->request = $request;
100 $this->listTable = give(CampaignsListTable::class);
101 $sortColumns = $this->listTable->getSortColumnById($request->get_param('sortColumn') ?: 'id');
102 $sortDirection = $request->get_param('sortDirection') ?: 'desc';
103
104 $campaignsCount = $this->getTotalCampaignsCount();
105
106 if ($campaignsCount === 0) {
107 return new WP_REST_Response(
108 [
109 'items' => [],
110 'totalItems' => 0,
111 'totalPages' => 0,
112 ]
113 );
114 }
115
116 $campaigns = $this->getCampaigns();
117 $pageCount = (int)ceil($campaignsCount / $request->get_param('perPage'));
118
119 $ids = array_map(function (Campaign $campaign) {
120 return $campaign->id;
121 }, $campaigns);
122
123 $campaignsData = CampaignsDataRepository::campaigns($ids);
124
125 // Sort by revenue column
126 if (in_array(RevenueColumn::getId(), $sortColumns)) {
127 usort($campaigns, function(Campaign $a, Campaign $b) use ($campaignsData, $sortDirection) {
128 return $sortDirection === 'asc'
129 ? $campaignsData->getRevenue($a) <=> $campaignsData->getRevenue($b)
130 : $campaignsData->getRevenue($b) <=> $campaignsData->getRevenue($a);
131 });
132 }
133
134 $this->listTable
135 ->setData($campaignsData)
136 ->items($campaigns, $this->request->get_param('locale') ?? '');
137
138 $items = $this->listTable->getItems();
139
140 foreach ($items as $i => $item) {
141 $items[$i]['titleRaw'] = $campaigns[$i]->title;
142 }
143
144 return new WP_REST_Response(
145 [
146 'items' => $items,
147 'totalItems' => $campaignsCount,
148 'totalPages' => $pageCount,
149 ]
150 );
151 }
152
153 /**
154 * @since 4.12.0 remove revenue column from sort
155 * @since 4.0.0
156 */
157 public function getCampaigns(): array
158 {
159 $page = $this->request->get_param('page');
160 $perPage = $this->request->get_param('perPage');
161 $sortColumns = $this->listTable->getSortColumnById($this->request->get_param('sortColumn') ?: 'id');
162 $sortDirection = $this->request->get_param('sortDirection') ?: 'desc';
163
164 $query = give(CampaignRepository::class)->prepareQuery();
165 $query = $this->getWhereConditions($query);
166
167 foreach ($sortColumns as $sortColumn) {
168 if (RevenueColumn::getId() === $sortColumn) {
169 continue;
170 }
171
172 $query->orderBy($sortColumn, $sortDirection);
173 }
174
175 $query->limit($perPage)
176 ->offset(($page - 1) * $perPage);
177
178 $campaigns = $query->getAll();
179
180 if ( ! $campaigns) {
181 return [];
182 }
183
184 return $campaigns;
185 }
186
187 /**
188 * @since 4.0.0
189 */
190 public function getTotalCampaignsCount(): int
191 {
192 $query = Campaign::query();
193 $query = $this->getWhereConditions($query);
194
195 return $query->count();
196 }
197
198 /**
199 * @since 4.0.0
200 */
201 private function getWhereConditions(QueryBuilder $query): QueryBuilder
202 {
203 $search = $this->request->get_param('search');
204 $status = $this->request->get_param('status');
205
206 if ($search) {
207 if (ctype_digit($search)) {
208 $query->where('id', $search);
209 } else {
210 $query->whereLike('campaign_title', $search);
211 $query->orWhereLike('short_desc', $search);
212 }
213 }
214
215 if ($status === 'any') {
216 $query->where('status', 'archived', '!=');
217 } elseif ($status === 'inactive') {
218 $query->where('status', 'archived');
219 } elseif ($status) {
220 $query->where('status', $status);
221 }
222
223 return $query;
224 }
225
226 /**
227 * @since 4.3.1 update permissions
228 * @since 4.0.0
229 *
230 * @return bool|WP_Error
231 */
232 public function permissionsCheck()
233 {
234 if (current_user_can('manage_options') || current_user_can('edit_give_forms')) {
235 return true;
236 }
237
238 return new WP_Error(
239 'rest_forbidden',
240 esc_html__("You don't have permission to view Campaigns", 'give'),
241 ['status' => is_user_logged_in() ? 403 : 401]
242 );
243 }
244 }
245