Skip to content

Commit

Permalink
Feature: Add endpoint for Event List Table (#7220)
Browse files Browse the repository at this point in the history
  • Loading branch information
kjohnson committed Feb 16, 2024
1 parent c803826 commit 1d56278
Show file tree
Hide file tree
Showing 3 changed files with 214 additions and 0 deletions.
143 changes: 143 additions & 0 deletions src/EventTickets/Routes/GetEventsListTable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
<?php

namespace Give\EventTickets\Routes;

use Give\EventTickets\Models\Event;
use WP_REST_Request;
use WP_REST_Response;

/**
* @unreleased
*/
class GetEventsListTable
{
/**
* @var string
*/
protected $endpoint = 'events-tickets/events/list-table';

/**
* @inheritDoc
*/
public function registerRoute()
{
register_rest_route(
'give-api/v2',
$this->endpoint,
[
[
'methods' => 'GET',
'callback' => [$this, 'handleRequest'],
'permission_callback' => [$this, 'permissionsCheck'],
],
'args' => [
'page' => [
'type' => 'integer',
'default' => 1,
'minimum' => 1
],
'perPage' => [
'type' => 'integer',
'default' => 30,
'minimum' => 1
],
'search' => [
'type' => 'string',
'required' => false,
'sanitize_callback' => 'sanitize_text_field',
],
'sortColumn' => [
'type' => 'string',
'default' => 'id',
'sanitize_callback' => 'sanitize_text_field',
],
'sortDirection' => [
'type' => 'string',
'default' => 'asc',
'enum' => ['asc', 'desc'],
],
],
]
);
}

/**
* @unreleased
*
* @param WP_REST_Request $request
*
* @return WP_REST_Response
*/
public function handleRequest(WP_REST_Request $request): WP_REST_Response
{
$query = Event::query()
->orderBy(
$request->get_param('sortColumn') ?: 'id',
$request->get_param('sortDirection') ?: 'asc'
);

if($search = $request->get_param('search')) {
$query
->whereLike('title', "%$search%")
->orWhereLike('description', "%$search%");
}

$events = $query
->paginate(
$request->get_param('perPage'),
$request->get_param('page')
);

return new WP_REST_Response(
[
'items' => array_map(
[$this, 'transformEventToRow'],
$events->getAll() ?: []
),
'totalItems' => $count = $events->count(),
'totalPages' => ceil($count / $request->get_param('perPage')),
]
);
}

/**
* @unreleased
*/
protected function transformEventToRow(Event $event): array
{
return [
'id' => $event->id,
'title' => $this->formatColumnTitle($event),
'description' => $event->description,
'startDate' => $event->start_datetime->format('m/d/Y g:i a'),
'ticketsSold' => $event->eventTickets()->count(),
];
}

/**
* @unreleased
*/
protected function formatColumnTitle(Event $event): string
{
return sprintf(
'<a href="%s" aria-label="%s">%s</a>',
admin_url("edit.php?post_type=give_forms&page=give-events&view=overview&id=$event->id"),
__('View event details', 'give'),
$event->title
);
}

/**
* @unreleased
*
* @return bool|\WP_Error
*/
public function permissionsCheck()
{
return current_user_can('edit_posts')?: new \WP_Error(
'rest_forbidden',
esc_html__("You don't have permission to view Events", 'give'),
['status' => is_user_logged_in() ? 403 : 401]
);
}
}
1 change: 1 addition & 0 deletions src/EventTickets/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public function boot(): void
Hooks::addAction('givewp_donation_form_enqueue_scripts', Actions\EnqueueDonationFormScripts::class);

Hooks::addAction('rest_api_init', Routes\GetEvents::class, 'registerRoute');
Hooks::addAction('rest_api_init', Routes\GetEventsListTable::class, 'registerRoute');
Hooks::addAction('rest_api_init', Routes\GetEventTickets::class, 'registerRoute');
Hooks::addAction('rest_api_init', Routes\GetEventTicketTypes::class, 'registerRoute');
Hooks::addAction('rest_api_init', Routes\GetEventTicketTypeTickets::class, 'registerRoute');
Expand Down
70 changes: 70 additions & 0 deletions tests/Unit/EventTickets/Routes/GetEventsListTableTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

namespace Give\Tests\Unit\EventTickets\Routes;

use Exception;
use Give\Donations\Endpoints\ListDonations;
use Give\Donations\ListTable\DonationsListTable;
use Give\Donations\Models\Donation;
use Give\EventTickets\Models\Event;
use Give\EventTickets\Routes\GetEventsListTable;
use Give\Tests\TestCase;
use Give\Tests\TestTraits\RefreshDatabase;
use WP_REST_Request;
use WP_REST_Server;

class GetEventsListTableTest extends TestCase
{
use RefreshDatabase;

/**
* @unreleased
*/
protected function getMockRequest(): WP_REST_Request
{
return new WP_REST_Request(
WP_REST_Server::READABLE,
'/give-api/v2/event-tickets/events/list-table'
);
}

/**
* @unreleased
*
* @return void
* @throws Exception
*/
public function testShouldReturnAllWhenLessThanPerPage()
{
$perPage = 5;
$events = Event::factory()->count($perPage - 1)->create();

$mockRequest = $this->getMockRequest();
$mockRequest->set_param('page', 1);
$mockRequest->set_param('perPage', $perPage);

$response = (new GetEventsListTable)->handleRequest($mockRequest);

$this->assertSameSize($events, $response->data['items']);
}

/**
* @unreleased
*
* @return void
* @throws Exception
*/
public function testShouldReturnLimitedByPerPage()
{
$perPage = 5;
$events = Event::factory()->count($perPage + 1)->create();

$mockRequest = $this->getMockRequest();
$mockRequest->set_param('page', 1);
$mockRequest->set_param('perPage', $perPage);

$response = (new GetEventsListTable)->handleRequest($mockRequest);

$this->assertEquals($perPage, count($response->data['items']));
}
}

0 comments on commit 1d56278

Please sign in to comment.