Skip to content

Commit e13eed4

Browse files
committed
Export subscribers panel with directory filter
1 parent 4245c4f commit e13eed4

5 files changed

Lines changed: 83 additions & 62 deletions

File tree

assets/vue/components/lists/ListSubscribersExportPanel.vue

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,11 @@ const props = defineProps({
163163
listName: {
164164
type: String,
165165
default: ''
166-
}
166+
},
167+
directoryFilter: {
168+
type: String,
169+
default: 'all'
170+
},
167171
})
168172
169173
const dateTypeOptions = [
@@ -254,6 +258,11 @@ const exportSubscribers = () => {
254258
if (props.listId) {
255259
params.set('list_id', String(props.listId))
256260
}
261+
262+
if (props.directoryFilter && props.directoryFilter !== 'all') {
263+
params.set(props.directoryFilter, 'true')
264+
}
265+
257266
params.set('date_type', form.value.dateType)
258267
259268
if (!usesAnyDate.value) {

assets/vue/components/subscribers/SubscriberDirectory.vue

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
</div>
8585
</div>
8686

87-
<ListSubscribersExportPanel/>
87+
<ListSubscribersExportPanel :directory-filter="currentFilter || 'all'"/>
8888
</template>
8989

9090
<script setup>
@@ -306,21 +306,4 @@ const handleFileChange = async (event) => {
306306
}
307307
}
308308
309-
const exportSubscribers = () => {
310-
const params = new URLSearchParams()
311-
if (currentFilter.value && currentFilter.value !== 'all') {
312-
params.set(currentFilter.value, 'true')
313-
}
314-
315-
if (searchQuery.value && isAllowedSearchColumn(searchColumn.value)) {
316-
params.set('findColumn', searchColumn.value)
317-
params.set('findValue', searchQuery.value)
318-
}
319-
320-
if (pagination.value.total > 0) {
321-
params.set('limit', pagination.value.total)
322-
}
323-
324-
window.location.href = `/subscribers/export?${params.toString()}`
325-
}
326309
</script>

src/Controller/SubscribersController.php

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44

55
namespace PhpList\WebFrontend\Controller;
66

7-
use DateTimeImmutable;
87
use PhpList\RestApiClient\Endpoint\SubscribersClient;
9-
use PhpList\RestApiClient\Entity\Subscriber;
10-
use PhpList\RestApiClient\Request\Subscriber\ExportSubscriberRequest;
118
use PhpList\RestApiClient\Request\Subscriber\SubscribersFilterRequest;
12-
use PhpList\RestApiClient\Response\Subscribers\SubscriberCollection;
9+
use PhpList\WebFrontend\Service\SubscriberCollectionNormalizer;
10+
use PhpList\WebFrontend\Service\SubscriberExportRequestFactory;
1311
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1412
use Symfony\Component\HttpFoundation\JsonResponse;
1513
use Symfony\Component\HttpFoundation\Request;
@@ -20,8 +18,11 @@
2018
#[Route('/subscribers', name: 'subscriber_')]
2119
class SubscribersController extends AbstractController
2220
{
23-
public function __construct(private readonly SubscribersClient $subscribersClient)
24-
{
21+
public function __construct(
22+
private readonly SubscribersClient $subscribersClient,
23+
private readonly SubscriberCollectionNormalizer $subscriberCollectionNormalizer,
24+
private readonly SubscriberExportRequestFactory $subscriberExportRequestFactory
25+
) {
2526
}
2627

2728
/**
@@ -68,23 +69,13 @@ public function index(Request $request): JsonResponse|Response
6869
$prevId = $history[$index - 1];
6970
}
7071

71-
return $this->json($this->normalize($collection, $prevId, $afterId));
72+
return $this->json($this->subscriberCollectionNormalizer->normalize($collection, $prevId, $afterId));
7273
}
7374

74-
/**
75-
* @SuppressWarnings("CyclomaticComplexity")
76-
* @SuppressWarnings("NPathComplexity")
77-
*/
7875
#[Route('/export', name: 'export', methods: ['GET'])]
7976
public function export(Request $request): Response
8077
{
81-
$exportRequest = new ExportSubscriberRequest(
82-
dateType: (string) $request->query->get('date_type', 'any'),
83-
listId: $request->query->has('list_id') ? $request->query->getInt('list_id') : null,
84-
dateFrom: $request->query->get('date_from') ?: null,
85-
dateTo: $request->query->get('date_to') ?: null,
86-
columns: array_values(array_filter($request->query->all('columns')))
87-
);
78+
$exportRequest = $this->subscriberExportRequestFactory->fromQuery($request->query);
8879

8980
$upstreamResponse = $this->subscribersClient->exportSubscribers($exportRequest);
9081

@@ -118,29 +109,4 @@ static function () use ($body): void {
118109

119110
return $response;
120111
}
121-
122-
private function normalize(SubscriberCollection $collection, ?int $prevId, ?int $afterId): array
123-
{
124-
return [
125-
'items' => array_map(static function (Subscriber $subscriber) {
126-
return [
127-
'id' => $subscriber->id,
128-
'email' => $subscriber->email,
129-
'confirmed' => $subscriber->confirmed,
130-
'blacklisted' => $subscriber->blacklisted,
131-
'createdAt' => (new DateTimeImmutable($subscriber->createdAt))->format('Y-m-d H:i:s'),
132-
'uniqueId' => $subscriber->uniqueId,
133-
'listCount' => count($subscriber->subscribedLists),
134-
];
135-
}, $collection->items ?? []),
136-
'pagination' => [
137-
'limit' => $collection->pagination->limit,
138-
'afterId' => $collection->pagination->nextCursor,
139-
'hasMore' => $collection->pagination->hasMore ,
140-
'total' => $collection->pagination->total,
141-
'prevId' => $prevId,
142-
'isFirstPage' => $afterId === null,
143-
],
144-
];
145-
}
146112
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\WebFrontend\Service;
6+
7+
use DateTimeImmutable;
8+
use PhpList\RestApiClient\Entity\Subscriber;
9+
use PhpList\RestApiClient\Response\Subscribers\SubscriberCollection;
10+
11+
class SubscriberCollectionNormalizer
12+
{
13+
public function normalize(SubscriberCollection $collection, ?int $prevId, ?int $afterId): array
14+
{
15+
return [
16+
'items' => array_map(static function (Subscriber $subscriber) {
17+
return [
18+
'id' => $subscriber->id,
19+
'email' => $subscriber->email,
20+
'confirmed' => $subscriber->confirmed,
21+
'blacklisted' => $subscriber->blacklisted,
22+
'createdAt' => (new DateTimeImmutable($subscriber->createdAt))->format('Y-m-d H:i:s'),
23+
'uniqueId' => $subscriber->uniqueId,
24+
'listCount' => count($subscriber->subscribedLists),
25+
];
26+
}, $collection->items ?? []),
27+
'pagination' => [
28+
'limit' => $collection->pagination->limit,
29+
'afterId' => $collection->pagination->nextCursor,
30+
'hasMore' => $collection->pagination->hasMore,
31+
'total' => $collection->pagination->total,
32+
'prevId' => $prevId,
33+
'isFirstPage' => $afterId === null,
34+
],
35+
];
36+
}
37+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\WebFrontend\Service;
6+
7+
use PhpList\RestApiClient\Request\Subscriber\ExportSubscriberRequest;
8+
use Symfony\Component\HttpFoundation\ParameterBag;
9+
10+
class SubscriberExportRequestFactory
11+
{
12+
public function fromQuery(ParameterBag $query): ExportSubscriberRequest
13+
{
14+
return new ExportSubscriberRequest(
15+
dateType: (string) $query->get('date_type', 'any'),
16+
listId: $query->has('list_id') ? $query->getInt('list_id') : null,
17+
dateFrom: $query->get('date_from') ?: null,
18+
dateTo: $query->get('date_to') ?: null,
19+
columns: array_values(array_filter($query->all('columns'))),
20+
isConfirmed: $query->has('confirmed') ? true :
21+
($query->has('unconfirmed') ? false : null),
22+
isBlacklisted: $query->has('blacklisted') ? true :
23+
($query->has('non-blacklisted') ? false : null),
24+
);
25+
}
26+
}

0 commit comments

Comments
 (0)