Skip to content

Commit 275a52c

Browse files
authored
Merge pull request #932 from HiEventsDev/develop
2 parents b4c2955 + aae3dcb commit 275a52c

23 files changed

+1597
-1
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Exceptions;
6+
7+
use Exception;
8+
9+
class ResourceNotFoundException extends Exception
10+
{
11+
}

backend/app/Http/Actions/BaseAction.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,21 @@ protected function jsonResponse(
142142
return new JsonResponse($data, $statusCode);
143143
}
144144

145+
protected function xmlResponse(
146+
string $xmlContent,
147+
int $statusCode = ResponseCodes::HTTP_OK,
148+
array $headers = [],
149+
): LaravelResponse
150+
{
151+
$defaultHeaders = [
152+
'Content-Type' => 'application/xml',
153+
];
154+
155+
$allHeaders = array_merge($defaultHeaders, $headers);
156+
157+
return Response::make($xmlContent, $statusCode, $allHeaders);
158+
}
159+
145160
protected function isActionAuthorized(
146161
int $entityId,
147162
string $entityType,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Sitemap;
6+
7+
use HiEvents\Exceptions\ResourceNotFoundException;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Services\Application\Handlers\Sitemap\GetSitemapEventsHandler;
10+
use Illuminate\Http\Response;
11+
12+
class GetSitemapEventsAction extends BaseAction
13+
{
14+
private const CONTENT_TYPE_XML = 'application/xml';
15+
16+
public function __construct(
17+
private readonly GetSitemapEventsHandler $handler,
18+
)
19+
{
20+
}
21+
22+
public function __invoke(int $page): Response
23+
{
24+
try {
25+
$xml = $this->handler->handle($page);
26+
$cacheTtl = (int) config('sitemap.cache_ttl');
27+
28+
return $this->xmlResponse(
29+
xmlContent: $xml,
30+
headers: [
31+
'Content-Type' => self::CONTENT_TYPE_XML,
32+
'Cache-Control' => "public, max-age=$cacheTtl",
33+
]
34+
);
35+
} catch (ResourceNotFoundException) {
36+
return $this->notFoundResponse();
37+
}
38+
}
39+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Sitemap;
6+
7+
use HiEvents\Http\Actions\BaseAction;
8+
use HiEvents\Services\Application\Handlers\Sitemap\GetSitemapIndexHandler;
9+
use Illuminate\Http\Response;
10+
11+
class GetSitemapIndexAction extends BaseAction
12+
{
13+
private const CONTENT_TYPE_XML = 'application/xml';
14+
15+
public function __construct(
16+
private readonly GetSitemapIndexHandler $handler,
17+
)
18+
{
19+
}
20+
21+
public function __invoke(): Response
22+
{
23+
$xml = $this->handler->handle();
24+
$cacheTtl = (int)config('sitemap.cache_ttl');
25+
26+
return $this->xmlResponse(
27+
xmlContent: $xml,
28+
headers: [
29+
'Content-Type' => self::CONTENT_TYPE_XML,
30+
'Cache-Control' => "public, max-age=$cacheTtl",
31+
]);
32+
}
33+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Sitemap;
6+
7+
use HiEvents\Exceptions\ResourceNotFoundException;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Services\Application\Handlers\Sitemap\GetSitemapOrganizersHandler;
10+
use Illuminate\Http\Response;
11+
12+
class GetSitemapOrganizersAction extends BaseAction
13+
{
14+
private const CONTENT_TYPE_XML = 'application/xml';
15+
16+
public function __construct(
17+
private readonly GetSitemapOrganizersHandler $handler,
18+
) {
19+
}
20+
21+
public function __invoke(int $page): Response
22+
{
23+
try {
24+
$xml = $this->handler->handle($page);
25+
$cacheTtl = (int) config('sitemap.cache_ttl');
26+
27+
return $this->xmlResponse(
28+
xmlContent: $xml,
29+
headers: [
30+
'Content-Type' => self::CONTENT_TYPE_XML,
31+
'Cache-Control' => "public, max-age=$cacheTtl",
32+
]
33+
);
34+
} catch (ResourceNotFoundException) {
35+
return $this->notFoundResponse();
36+
}
37+
}
38+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace HiEvents\Http\DTO;
4+
5+
use HiEvents\DataTransferObjects\BaseDataObject;
6+
7+
class GetSitemapEventsDTO extends BaseDataObject
8+
{
9+
public function __construct(
10+
public int $page,
11+
)
12+
{
13+
}
14+
}

backend/app/Repository/Eloquent/EventRepository.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use HiEvents\DomainObjects\EventDomainObject;
99
use HiEvents\DomainObjects\EventStatisticDomainObject;
1010
use HiEvents\DomainObjects\Generated\EventDomainObjectAbstract;
11+
use HiEvents\DomainObjects\Generated\EventSettingDomainObjectAbstract;
1112
use HiEvents\DomainObjects\OrganizerDomainObject;
1213
use HiEvents\DomainObjects\Status\EventStatus;
1314
use HiEvents\Http\DTO\QueryParamsDTO;
@@ -136,4 +137,32 @@ public function getAllEventsForAdmin(
136137

137138
return $this->paginate($perPage);
138139
}
140+
141+
public function getSitemapEvents(int $page, int $perPage): LengthAwarePaginator
142+
{
143+
return $this->handleResults($this->model
144+
->select([
145+
'events.' . EventDomainObjectAbstract::ID,
146+
'events.' . EventDomainObjectAbstract::TITLE,
147+
'events.' . EventDomainObjectAbstract::UPDATED_AT,
148+
'events.' . EventDomainObjectAbstract::START_DATE,
149+
])
150+
->join('event_settings', 'events.id', '=', 'event_settings.event_id')
151+
->where('events.' . EventDomainObjectAbstract::STATUS, EventStatus::LIVE->name)
152+
->where('event_settings.' . EventSettingDomainObjectAbstract::ALLOW_SEARCH_ENGINE_INDEXING, true)
153+
->whereNull('events.' . EventDomainObjectAbstract::DELETED_AT)
154+
->orderBy('events.' . EventDomainObjectAbstract::ID)
155+
->paginate($perPage, ['*'], 'page', $page));
156+
}
157+
158+
public function getSitemapEventCount(): int
159+
{
160+
return $this->model
161+
->newQuery()
162+
->join('event_settings', 'events.id', '=', 'event_settings.event_id')
163+
->where('events.' . EventDomainObjectAbstract::STATUS, EventStatus::LIVE->name)
164+
->where('event_settings.' . EventSettingDomainObjectAbstract::ALLOW_SEARCH_ENGINE_INDEXING, true)
165+
->whereNull('events.' . EventDomainObjectAbstract::DELETED_AT)
166+
->count();
167+
}
139168
}

backend/app/Repository/Eloquent/OrganizerRepository.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44

55
namespace HiEvents\Repository\Eloquent;
66

7+
use HiEvents\DomainObjects\Generated\OrganizerDomainObjectAbstract;
8+
use HiEvents\DomainObjects\Generated\OrganizerSettingDomainObjectAbstract;
79
use HiEvents\DomainObjects\OrganizerDomainObject;
10+
use HiEvents\DomainObjects\Status\OrganizerStatus;
811
use HiEvents\Models\Organizer;
912
use HiEvents\Repository\DTO\Organizer\OrganizerStatsResponseDTO;
1013
use HiEvents\Repository\Interfaces\OrganizerRepositoryInterface;
14+
use Illuminate\Pagination\LengthAwarePaginator;
1115

1216
class OrganizerRepository extends BaseRepository implements OrganizerRepositoryInterface
1317
{
@@ -21,6 +25,33 @@ public function getDomainObject(): string
2125
return OrganizerDomainObject::class;
2226
}
2327

28+
public function getSitemapOrganizers(int $page, int $perPage): LengthAwarePaginator
29+
{
30+
return $this->handleResults($this->model
31+
->select([
32+
'organizers.' . OrganizerDomainObjectAbstract::ID,
33+
'organizers.' . OrganizerDomainObjectAbstract::NAME,
34+
'organizers.' . OrganizerDomainObjectAbstract::UPDATED_AT,
35+
])
36+
->join('organizer_settings', 'organizers.id', '=', 'organizer_settings.organizer_id')
37+
->where('organizers.' . OrganizerDomainObjectAbstract::STATUS, OrganizerStatus::LIVE->name)
38+
->where('organizer_settings.' . OrganizerSettingDomainObjectAbstract::ALLOW_SEARCH_ENGINE_INDEXING, true)
39+
->whereNull('organizers.' . OrganizerDomainObjectAbstract::DELETED_AT)
40+
->orderBy('organizers.' . OrganizerDomainObjectAbstract::ID)
41+
->paginate($perPage, ['*'], 'page', $page));
42+
}
43+
44+
public function getSitemapOrganizerCount(): int
45+
{
46+
return $this->model
47+
->newQuery()
48+
->join('organizer_settings', 'organizers.id', '=', 'organizer_settings.organizer_id')
49+
->where('organizers.' . OrganizerDomainObjectAbstract::STATUS, OrganizerStatus::LIVE->name)
50+
->where('organizer_settings.' . OrganizerSettingDomainObjectAbstract::ALLOW_SEARCH_ENGINE_INDEXING, true)
51+
->whereNull('organizers.' . OrganizerDomainObjectAbstract::DELETED_AT)
52+
->count();
53+
}
54+
2455
public function getOrganizerStats(int $organizerId, int $accountId, string $currencyCode): OrganizerStatsResponseDTO
2556
{
2657
$totalsQuery = <<<SQL

backend/app/Repository/Interfaces/EventRepositoryInterface.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ public function getAllEventsForAdmin(
2626
?string $sortBy = 'start_date',
2727
?string $sortDirection = 'desc'
2828
): LengthAwarePaginator;
29+
30+
public function getSitemapEvents(int $page, int $perPage): LengthAwarePaginator;
31+
32+
public function getSitemapEventCount(): int;
2933
}

backend/app/Repository/Interfaces/OrganizerRepositoryInterface.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77
use HiEvents\DomainObjects\OrganizerDomainObject;
88
use HiEvents\Repository\DTO\Organizer\OrganizerStatsResponseDTO;
99
use HiEvents\Repository\Eloquent\BaseRepository;
10+
use Illuminate\Pagination\LengthAwarePaginator;
1011

1112
/**
1213
* @extends BaseRepository<OrganizerDomainObject>
1314
*/
1415
interface OrganizerRepositoryInterface extends RepositoryInterface
1516
{
1617
public function getOrganizerStats(int $organizerId, int $accountId, string $currencyCode): OrganizerStatsResponseDTO;
18+
19+
public function getSitemapOrganizers(int $page, int $perPage): LengthAwarePaginator;
20+
21+
public function getSitemapOrganizerCount(): int;
1722
}

0 commit comments

Comments
 (0)