PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Form / RestApi / Endpoints / FormsListingEndpoint.php
mailpoet / lib / Form / RestApi / Endpoints Last commit date
FormsBulkActionEndpoint.php 2 months ago FormsEndpoint.php 2 months ago FormsListingEndpoint.php 1 month ago index.php 2 months ago
FormsListingEndpoint.php
153 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Form\RestApi\Endpoints;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\API\JSON\ResponseBuilders\FormsResponseBuilder;
9 use MailPoet\API\REST\AbstractListingEndpoint;
10 use MailPoet\API\REST\ApiException;
11 use MailPoet\API\REST\ListingRequestValidationTrait;
12 use MailPoet\API\REST\Request;
13 use MailPoet\API\REST\Response;
14 use MailPoet\Config\AccessControl;
15 use MailPoet\Entities\FormEntity;
16 use MailPoet\Form\Listing\FormListingRepository;
17 use MailPoet\Listing\Handler as ListingHandler;
18 use MailPoet\Listing\ListingDefinition;
19 use MailPoet\Listing\ListingRepository;
20 use MailPoet\Validator\Builder;
21 use MailPoet\WP\Functions as WPFunctions;
22
23 class FormsListingEndpoint extends AbstractListingEndpoint {
24 use ListingRequestValidationTrait;
25
26 private const ALLOWED_SORT_FIELDS = ['name', 'created_at', 'updated_at'];
27 private const ALLOWED_FILTERS = ['status', 'created_from', 'created_to', 'updated_from', 'updated_to'];
28
29 /** @var FormListingRepository */
30 private $formListingRepository;
31
32 /** @var FormsResponseBuilder */
33 private $formsResponseBuilder;
34
35 public function __construct(
36 ListingHandler $listingHandler,
37 FormListingRepository $formListingRepository,
38 FormsResponseBuilder $formsResponseBuilder
39 ) {
40 parent::__construct($listingHandler);
41 $this->formListingRepository = $formListingRepository;
42 $this->formsResponseBuilder = $formsResponseBuilder;
43 }
44
45 public function handle(Request $request): Response {
46 $this->validateRequest($request);
47 return parent::handle($request);
48 }
49
50 public function checkPermissions(): bool {
51 return WPFunctions::get()->currentUserCan(AccessControl::PERMISSION_MANAGE_FORMS);
52 }
53
54 public static function getRequestSchema(): array {
55 $schema = parent::getRequestSchema();
56 $schema['limit'] = Builder::integer();
57 $schema['offset'] = Builder::integer();
58 $schema['filter'] = Builder::object();
59 return $schema;
60 }
61
62 protected function getListingRepository(): ListingRepository {
63 return $this->formListingRepository;
64 }
65
66 protected function buildItems(array $rows, ListingDefinition $definition): array {
67 return $this->formsResponseBuilder->buildForListing($rows);
68 }
69
70 protected function getDefaultSortBy(): string {
71 return 'updated_at';
72 }
73
74 protected function getDefaultSortOrder(): string {
75 return 'desc';
76 }
77
78 protected function getDefaultGroup(): ?string {
79 return 'all';
80 }
81
82 protected function getListingValidationErrorPrefix(): string {
83 return 'forms';
84 }
85
86 private function validateRequest(Request $request): void {
87 $this->validateSortField($request->getParam('orderby'), self::ALLOWED_SORT_FIELDS);
88 $this->validateSortField($request->getParam('sort_by'), self::ALLOWED_SORT_FIELDS);
89 $this->validateSortOrder($request->getParam('order'));
90 $this->validateSortOrder($request->getParam('sort_order'));
91 $this->validatePagination($request);
92 $this->validateFilters($request->getParam('filter'));
93 }
94
95 /** @param mixed $filters */
96 private function validateFilters($filters): void {
97 if ($filters === null || $filters === []) {
98 return;
99 }
100 if (!is_array($filters)) {
101 throw new ApiException(
102 __('Filters must be an object.', 'mailpoet'),
103 400,
104 'mailpoet_forms_invalid_filter'
105 );
106 }
107
108 $normalizedFilters = [];
109 foreach ($filters as $filter => $value) {
110 if (!is_string($filter) || !in_array($filter, self::ALLOWED_FILTERS, true)) {
111 throw new ApiException(
112 __('Unsupported forms filter.', 'mailpoet'),
113 400,
114 'mailpoet_forms_invalid_filter'
115 );
116 }
117 $normalizedFilters[$filter] = $value;
118 }
119
120 $this->validateStatusFilter($normalizedFilters);
121 $this->validateDateRange(
122 $this->validateDateFilter($normalizedFilters, 'created_from'),
123 $this->validateDateFilter($normalizedFilters, 'created_to')
124 );
125 $this->validateDateRange(
126 $this->validateDateFilter($normalizedFilters, 'updated_from'),
127 $this->validateDateFilter($normalizedFilters, 'updated_to')
128 );
129 }
130
131 /** @param array<string, mixed> $filters */
132 private function validateStatusFilter(array $filters): void {
133 if (!array_key_exists('status', $filters) || $filters['status'] === '' || $filters['status'] === []) {
134 return;
135 }
136 $statuses = is_array($filters['status']) ? $filters['status'] : [$filters['status']];
137 $allowed = [FormEntity::STATUS_ENABLED, FormEntity::STATUS_DISABLED];
138 foreach ($statuses as $status) {
139 if (!is_string($status) || !in_array($status, $allowed, true)) {
140 throw new ApiException(
141 sprintf(
142 // translators: %s is a comma-separated list of allowed form statuses.
143 __('Unsupported status filter. Allowed values are: %s.', 'mailpoet'),
144 implode(', ', $allowed)
145 ),
146 400,
147 'mailpoet_forms_invalid_status'
148 );
149 }
150 }
151 }
152 }
153