PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.16.9
GiveWP – Donation Plugin and Fundraising Platform v4.16.9
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 2.3.2 2.30.0 All 255 releases
give / src / EventTickets / Routes / GetEventsListTable.php

GetEventsListTable.php in GiveWP – Donation Plugin and Fundraising Platform 4.16.9, at src/EventTickets/Routes/GetEventsListTable.php

176 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Give\EventTickets\Routes;
4
5 use Give\EventTickets\ListTable\EventTicketsListTable;
6 use Give\Framework\Database\DB;
7 use Give\Framework\Permissions\Facades\UserPermissions;
8 use Give\Framework\QueryBuilder\QueryBuilder;
9 use WP_REST_Request;
10 use WP_REST_Response;
11 use WP_REST_Server;
12
13 /**
14 * @since 3.6.0
15 */
16 class GetEventsListTable
17 {
18 /**
19 * @var string
20 */
21 protected $endpoint = 'events-tickets/events/list-table';
22
23 /**
24 * @var WP_REST_Request
25 */
26 protected $request;
27
28 /**
29 * @var EventTicketsListTable
30 */
31 protected $listTable;
32
33 /**
34 * @inheritDoc
35 *
36 * @since 4.14.0 update permission capability to use facade
37 * @since 3.20.0 Set the permission callback to "read".
38 * @since 3.6.0
39 */
40 public function registerRoute(): void
41 {
42 register_rest_route(
43 'give-api/v2',
44 $this->endpoint,
45 [
46 [
47 'methods' => WP_REST_Server::READABLE,
48 'callback' => [$this, 'handleRequest'],
49 'permission_callback' => function () {
50 return UserPermissions::events()->canView();
51 },
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 'sortColumn' => [
70 'type' => 'string',
71 'default' => 'id',
72 'sanitize_callback' => 'sanitize_text_field',
73 ],
74 'sortDirection' => [
75 'type' => 'string',
76 'default' => 'asc',
77 'enum' => ['asc', 'desc'],
78 ],
79 'locale' => [
80 'type' => 'string',
81 'required' => false,
82 'default' => get_locale(),
83 ],
84 ],
85 ]
86 );
87 }
88
89 /**
90 * @since 3.6.0
91 */
92 public function handleRequest(WP_REST_Request $request): WP_REST_Response
93 {
94 $this->request = $request;
95 $this->listTable = give(EventTicketsListTable::class);
96
97 $events = $this->getEvents();
98 $eventsCount = $this->getTotalEventsCount();
99 $pageCount = (int)ceil($eventsCount / $request->get_param('perPage'));
100
101 if ('model' === $this->request->get_param('return')) {
102 $items = $events;
103 } else {
104 $this->listTable->items($events, $this->request->get_param('locale') ?? '');
105 $items = $this->listTable->getItems();
106 }
107
108 return new WP_REST_Response(
109 [
110 'items' => $items,
111 'totalItems' => $eventsCount,
112 'totalPages' => $pageCount
113 ]
114 );
115 }
116
117 /**
118 * @since 3.6.0
119 */
120 public function getEvents(): array
121 {
122 $page = $this->request->get_param('page');
123 $perPage = $this->request->get_param('perPage');
124 $sortColumns = $this->listTable->getSortColumnById($this->request->get_param('sortColumn') ?: 'id');
125 $sortDirection = $this->request->get_param('sortDirection') ?: 'desc';
126
127 $query = give()->events->prepareQuery();
128 $query = $this->getWhereConditions($query);
129
130 foreach ($sortColumns as $sortColumn) {
131 $query->orderBy($sortColumn, $sortDirection);
132 }
133
134 $query->limit($perPage)
135 ->offset(($page - 1) * $perPage);
136
137 $events = $query->getAll();
138
139 if (!$events) {
140 return [];
141 }
142
143 return $events;
144 }
145
146 /**
147 * @since 3.6.0
148 */
149 public function getTotalEventsCount(): int
150 {
151 $query = DB::table('give_events');
152 $query = $this->getWhereConditions($query);
153
154 return $query->count();
155 }
156
157 /**
158 * @since 3.6.0
159 */
160 private function getWhereConditions(QueryBuilder $query): QueryBuilder
161 {
162 $search = $this->request->get_param('search');
163
164 if ($search) {
165 if (ctype_digit($search)) {
166 $query->where('id', $search);
167 } else {
168 $query->whereLike('title', $search);
169 $query->orWhereLike('description', $search);
170 }
171 }
172
173 return $query;
174 }
175 }
176