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