Skip to content

Commit f287086

Browse files
committed
#687: Added api endpoints and filters
1 parent cb6f7f0 commit f287086

27 files changed

+931
-85
lines changed

baseline.xml

-65
This file was deleted.

composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"require": {
99
"php": ">=8.2",
1010
"ext-ctype": "*",
11+
"ext-http": "*",
1112
"ext-iconv": "*",
1213
"api-platform/core": "^3.2",
1314
"doctrine/doctrine-bundle": "^2.11",

composer.lock

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/services.yaml

+20
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,34 @@ services:
2929
arguments:
3030
$filterLocator: '@api_platform.filter_locator'
3131

32+
App\Api\State\DailyOccurrenceRepresentationProvider:
33+
arguments:
34+
$filterLocator: '@api_platform.filter_locator'
35+
3236
App\Api\State\EventRepresentationProvider:
3337
arguments:
3438
$filterLocator: '@api_platform.filter_locator'
3539

40+
App\Api\State\LocationRepresentationProvider:
41+
arguments:
42+
$filterLocator: '@api_platform.filter_locator'
43+
44+
App\Api\State\OccurrenceRepresentationProvider:
45+
arguments:
46+
$filterLocator: '@api_platform.filter_locator'
47+
3648
App\Api\State\OrganizationRepresentationProvider:
3749
arguments:
3850
$filterLocator: '@api_platform.filter_locator'
3951

52+
App\Api\State\TagRepresentationProvider:
53+
arguments:
54+
$filterLocator: '@api_platform.filter_locator'
55+
56+
App\Api\State\VocabularyRepresentationProvider:
57+
arguments:
58+
$filterLocator: '@api_platform.filter_locator'
59+
4060
App\Command\FixturesLoadCommand:
4161
arguments:
4262
$appEnv: '%env(string:APP_ENV)%'

psalm-baseline.xml

+135
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<files psalm-version="5.16.0@2897ba636551a8cb61601cc26f6ccfbba6c36591">
3+
<file src="src/Api/State/AbstractProvider.php">
4+
<InternalMethod>
5+
<code>getFilters</code>
6+
</InternalMethod>
7+
</file>
8+
<file src="src/Api/State/DailyOccurrenceRepresentationProvider.php">
9+
<InvalidReturnStatement>
10+
<code><![CDATA[[$this->index->get(IndexNames::DailyOccurrences->value, $uriVariables['id'])['_source']]]]></code>
11+
</InvalidReturnStatement>
12+
<MissingTemplateParam>
13+
<code>ProviderInterface</code>
14+
</MissingTemplateParam>
15+
<PossiblyNullArrayAccess>
16+
<code><![CDATA[$this->index->get(IndexNames::DailyOccurrences->value, $uriVariables['id'])['_source']]]></code>
17+
</PossiblyNullArrayAccess>
18+
</file>
19+
<file src="src/Api/State/EventRepresentationProvider.php">
20+
<InvalidReturnStatement>
21+
<code><![CDATA[[$this->index->get(IndexNames::Events->value, $uriVariables['id'])['_source']]]]></code>
22+
</InvalidReturnStatement>
23+
<MissingTemplateParam>
24+
<code>ProviderInterface</code>
25+
</MissingTemplateParam>
26+
<PossiblyNullArrayAccess>
27+
<code><![CDATA[$this->index->get(IndexNames::Events->value, $uriVariables['id'])['_source']]]></code>
28+
</PossiblyNullArrayAccess>
29+
</file>
30+
<file src="src/Api/State/LocationRepresentationProvider.php">
31+
<InvalidReturnStatement>
32+
<code><![CDATA[[$this->index->get(IndexNames::Locations->value, $uriVariables['id'])['_source']]]]></code>
33+
</InvalidReturnStatement>
34+
<MissingTemplateParam>
35+
<code>ProviderInterface</code>
36+
</MissingTemplateParam>
37+
<PossiblyNullArrayAccess>
38+
<code><![CDATA[$this->index->get(IndexNames::Locations->value, $uriVariables['id'])['_source']]]></code>
39+
</PossiblyNullArrayAccess>
40+
</file>
41+
<file src="src/Api/State/OccurrenceRepresentationProvider.php">
42+
<InvalidReturnStatement>
43+
<code><![CDATA[[$this->index->get(IndexNames::Occurrences->value, $uriVariables['id'])['_source']]]]></code>
44+
</InvalidReturnStatement>
45+
<MissingTemplateParam>
46+
<code>ProviderInterface</code>
47+
</MissingTemplateParam>
48+
<PossiblyNullArrayAccess>
49+
<code><![CDATA[$this->index->get(IndexNames::Occurrences->value, $uriVariables['id'])['_source']]]></code>
50+
</PossiblyNullArrayAccess>
51+
</file>
52+
<file src="src/Api/State/OrganizationRepresentationProvider.php">
53+
<InvalidReturnStatement>
54+
<code><![CDATA[[$this->index->get(IndexNames::Organizations->value, $uriVariables['id'])['_source']]]]></code>
55+
</InvalidReturnStatement>
56+
<MissingTemplateParam>
57+
<code>ProviderInterface</code>
58+
</MissingTemplateParam>
59+
<PossiblyNullArrayAccess>
60+
<code><![CDATA[$this->index->get(IndexNames::Organizations->value, $uriVariables['id'])['_source']]]></code>
61+
</PossiblyNullArrayAccess>
62+
</file>
63+
<file src="src/Api/State/TagRepresentationProvider.php">
64+
<MissingTemplateParam>
65+
<code>ProviderInterface</code>
66+
</MissingTemplateParam>
67+
<PossiblyNullArgument>
68+
<code><![CDATA[$hit['name']]]></code>
69+
</PossiblyNullArgument>
70+
<PossiblyNullArrayAccess>
71+
<code><![CDATA[$hit['name']]]></code>
72+
<code><![CDATA[$this->index->get(IndexNames::Tags->value, $uriVariables['name'], 'name')['_source']]]></code>
73+
</PossiblyNullArrayAccess>
74+
</file>
75+
<file src="src/Api/State/VocabularyRepresentationProvider.php">
76+
<MissingTemplateParam>
77+
<code>ProviderInterface</code>
78+
</MissingTemplateParam>
79+
<PossiblyNullArgument>
80+
<code><![CDATA[$hit['description']]]></code>
81+
<code><![CDATA[$hit['name']]]></code>
82+
<code><![CDATA[$hit['tags']]]></code>
83+
</PossiblyNullArgument>
84+
<PossiblyNullArrayAccess>
85+
<code><![CDATA[$hit['description']]]></code>
86+
<code><![CDATA[$hit['name']]]></code>
87+
<code><![CDATA[$hit['tags']]]></code>
88+
<code><![CDATA[$this->index->get(IndexNames::Vocabularies->value, $uriVariables['name'], 'name')['_source']]]></code>
89+
</PossiblyNullArrayAccess>
90+
</file>
91+
<file src="src/Command/FixturesLoadCommand.php">
92+
<UndefinedDocblockClass>
93+
<code>\HttpException</code>
94+
</UndefinedDocblockClass>
95+
</file>
96+
<file src="src/Fixtures/FixtureLoader.php">
97+
<InvalidArgument>
98+
<code><![CDATA[[
99+
'index' => $indexName,
100+
'body' => [
101+
'settings' => [
102+
'number_of_shards' => 5,
103+
'number_of_replicas' => 0,
104+
],
105+
],
106+
]]]></code>
107+
</InvalidArgument>
108+
<PossiblyUndefinedMethod>
109+
<code>getStatusCode</code>
110+
<code>getStatusCode</code>
111+
</PossiblyUndefinedMethod>
112+
<UndefinedClass>
113+
<code>\HttpException</code>
114+
</UndefinedClass>
115+
<UndefinedDocblockClass>
116+
<code>\HttpException</code>
117+
<code>\HttpException</code>
118+
</UndefinedDocblockClass>
119+
</file>
120+
<file src="src/Service/ElasticSearch/ElasticSearchIndex.php">
121+
<ArgumentTypeCoercion>
122+
<code>$params</code>
123+
</ArgumentTypeCoercion>
124+
<InvalidArgument>
125+
<code>$params</code>
126+
<code><![CDATA[['name' => $indexName]]]></code>
127+
</InvalidArgument>
128+
</file>
129+
<file src="src/Service/ElasticSearch/ElasticSearchPaginator.php">
130+
<MissingTemplateParam>
131+
<code>PaginatorInterface</code>
132+
<code>\IteratorAggregate</code>
133+
</MissingTemplateParam>
134+
</file>
135+
</files>

psalm.xml

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
66
xmlns="https://getpsalm.org/schema/config"
77
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
8-
errorBaseline="baseline.xml"
8+
errorBaseline="psalm-baseline.xml"
9+
findUnusedBaselineEntry="true"
10+
findUnusedCode="false"
911
>
1012
<projectFiles>
1113
<directory name="src"/>
@@ -18,6 +20,6 @@
1820
<containerXml>var/cache/dev/App_KernelDevDebugContainer.xml</containerXml>
1921
</pluginClass>
2022
<pluginClass class="Weirdan\DoctrinePsalmPlugin\Plugin"/>
21-
<!-- <pluginClass class="CuyZ\Valinor\QA\Psalm\ValinorPsalmPlugin"/>-->
23+
<!-- <pluginClass class="CuyZ\Valinor\QA\Psalm\ValinorPsalmPlugin"/>-->
2224
</plugins>
2325
</psalm>

src/Api/Dto/DailyOccurrence.php

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
namespace App\Api\Dto;
4+
5+
use ApiPlatform\Metadata\ApiFilter;
6+
use ApiPlatform\Metadata\ApiProperty;
7+
use ApiPlatform\Metadata\ApiResource;
8+
use ApiPlatform\Metadata\Get;
9+
use ApiPlatform\Metadata\GetCollection;
10+
use App\Api\Filter\ElasticSearch\BooleanFilter;
11+
use App\Api\Filter\ElasticSearch\DateFilter;
12+
use App\Api\Filter\ElasticSearch\EventTagFilter;
13+
use App\Api\Filter\ElasticSearch\MatchFilter;
14+
use App\Api\State\DailyOccurrenceRepresentationProvider;
15+
use App\Model\DateLimits;
16+
17+
#[ApiResource(
18+
operations: [
19+
new Get(
20+
openapiContext: [
21+
'parameters' => [
22+
[
23+
'name' => 'id',
24+
'in' => 'path',
25+
'required' => true,
26+
'schema' => [
27+
'type' => 'integer',
28+
],
29+
],
30+
],
31+
'responses' => [
32+
'200' => [
33+
'description' => 'Single daily occurrence',
34+
],
35+
],
36+
],
37+
output: DailyOccurrenceRepresentationProvider::class,
38+
provider: DailyOccurrenceRepresentationProvider::class,
39+
),
40+
new GetCollection(
41+
output: DailyOccurrenceRepresentationProvider::class,
42+
provider: DailyOccurrenceRepresentationProvider::class,
43+
),
44+
],
45+
paginationClientItemsPerPage: true,
46+
paginationItemsPerPage: 10,
47+
paginationMaximumItemsPerPage: 50
48+
)]
49+
#[ApiFilter(
50+
MatchFilter::class,
51+
properties: ['event.title', 'event.organizer.name', 'event.organizer.entityId', 'event.location.name', 'event.location.entityId']
52+
)]
53+
#[ApiFilter(
54+
BooleanFilter::class,
55+
properties: ['event.publicAccess']
56+
)]
57+
#[ApiFilter(
58+
EventTagFilter::class,
59+
properties: ['event.tags']
60+
)]
61+
#[ApiFilter(
62+
DateFilter::class,
63+
properties: [
64+
'start' => 'start',
65+
'end' => 'end',
66+
],
67+
arguments: [
68+
'config' => [
69+
'start' => [
70+
'limit' => DateLimits::GreaterThanOrEqual,
71+
'throwOnInvalid' => true,
72+
],
73+
'end' => [
74+
'limit' => DateLimits::LessThanOrEqual,
75+
'throwOnInvalid' => true,
76+
],
77+
],
78+
]
79+
)]
80+
class DailyOccurrence
81+
{
82+
#[ApiProperty(
83+
identifier: true,
84+
)]
85+
private int $id;
86+
}

src/Api/Dto/Event.php

+10
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
use ApiPlatform\Metadata\ApiResource;
88
use ApiPlatform\Metadata\Get;
99
use ApiPlatform\Metadata\GetCollection;
10+
use App\Api\Filter\ElasticSearch\BooleanFilter;
1011
use App\Api\Filter\ElasticSearch\DateFilter;
1112
use App\Api\Filter\ElasticSearch\EventTagFilter;
13+
use App\Api\Filter\ElasticSearch\MatchFilter;
1214
use App\Api\State\EventRepresentationProvider;
1315
use App\Model\DateLimits;
1416

@@ -44,6 +46,14 @@
4446
paginationItemsPerPage: 10,
4547
paginationMaximumItemsPerPage: 50
4648
)]
49+
#[ApiFilter(
50+
MatchFilter::class,
51+
properties: ['title', 'organizer.name', 'organizer.entityId', 'location.name', 'location.entityId']
52+
)]
53+
#[ApiFilter(
54+
BooleanFilter::class,
55+
properties: ['publicAccess']
56+
)]
4757
#[ApiFilter(
4858
EventTagFilter::class,
4959
properties: ['tags']

0 commit comments

Comments
 (0)