Skip to content

Commit bcad844

Browse files
authored
Merge pull request #2 from RedberryProducts/dependabot/github_actions/actions/checkout-5
Chore(deps): Bump actions/checkout from 4 to 5
2 parents 266d60a + 9e5a6ff commit bcad844

File tree

8 files changed

+58
-78
lines changed

8 files changed

+58
-78
lines changed

.github/workflows/fix-php-code-style-issues.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515

1616
steps:
1717
- name: Checkout code
18-
uses: actions/checkout@v4
18+
uses: actions/checkout@v5
1919
with:
2020
ref: ${{ github.head_ref }}
2121

.github/workflows/phpstan.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: ubuntu-latest
1414
timeout-minutes: 5
1515
steps:
16-
- uses: actions/checkout@v4
16+
- uses: actions/checkout@v5
1717

1818
- name: Setup PHP
1919
uses: shivammathur/setup-php@v2

.github/workflows/run-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737

3838
steps:
3939
- name: Checkout code
40-
uses: actions/checkout@v4
40+
uses: actions/checkout@v5
4141

4242
- name: Setup PHP
4343
uses: shivammathur/setup-php@v2

phpstan.neon.dist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ parameters:
77
- src
88
- config
99
- database
10+
configDirectories:
11+
- config
1012
tmpDir: build/phpstan
1113
checkOctaneCompatibility: true
1214
checkModelProperties: true

routes/inbox.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
use Redberry\MailboxForLaravel\Http\Controllers\AssetController;
55
use Redberry\MailboxForLaravel\Http\Controllers\ClearInboxController;
66
use Redberry\MailboxForLaravel\Http\Controllers\InboxController;
7-
use Redberry\MailboxForLaravel\Http\Controllers\PublicAssetController;
87
use Redberry\MailboxForLaravel\Http\Controllers\SeenController;
98
use Redberry\MailboxForLaravel\Http\Controllers\SendTestMailController;
109

@@ -32,5 +31,3 @@
3231
->name('asset');
3332
Route::post('/messages/{id}/seen', SeenController::class)->name('messages.seen');
3433
});
35-
36-
Route::get('/mailbox/assets/{path}', PublicAssetController::class)->where('path', '.*')->name('mailbox.asset');

src/Http/Controllers/AssetController.php

Lines changed: 0 additions & 48 deletions
This file was deleted.

src/Http/Controllers/InboxController.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,21 @@
22

33
namespace Redberry\MailboxForLaravel\Http\Controllers;
44

5-
use Illuminate\Http\JsonResponse;
65
use Illuminate\Http\Request;
7-
use Illuminate\View\View;
6+
use Illuminate\Support\Facades\View;
87
use Redberry\MailboxForLaravel\CaptureService;
98

109
class InboxController
1110
{
12-
public function __invoke(Request $request, CaptureService $service): View|JsonResponse
11+
public function __invoke(Request $request, CaptureService $service): \Illuminate\Contracts\View\View
1312
{
1413
$messages = $service->all(); // adapt to your API
1514

1615
$payload = [
1716
'messages' => array_values($messages['data'] ?? $messages), // support both shapes
1817
];
1918

20-
// If the client asks for JSON, return JSON (Vue will update without reload)
21-
if ($request->expectsJson()) {
22-
return response()->json($payload);
23-
}
24-
2519
// Otherwise, render the Blade view and hydrate initial props
26-
return view('inbox::index', ['data' => $payload]);
20+
return View::make('inbox::index', ['data' => $payload]);
2721
}
2822
}

src/Support/MessageNormalizer.php

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
use Symfony\Component\Mailer\Envelope;
99
use Symfony\Component\Mime\Address;
1010
use Symfony\Component\Mime\Email;
11+
use Symfony\Component\Mime\Header\Headers;
1112
use Symfony\Component\Mime\Part\DataPart;
13+
use Symfony\Component\Mime\RawMessage;
1214

1315
final class MessageNormalizer
1416
{
@@ -18,22 +20,61 @@ final class MessageNormalizer
1820
*
1921
* @return array<string,mixed>
2022
*/
23+
/** @return array<string,mixed> */
2124
public static function normalize(
22-
Email $email,
25+
Email|RawMessage $message,
2326
?Envelope $envelope = null,
2427
?string $raw = null,
2528
bool $storeAttachmentsInline = false
2629
): array {
27-
$keepRaw = true;
30+
if ($message instanceof Email) {
31+
32+
return self::normalizeEmail($message, $envelope, $raw, $storeAttachmentsInline);
33+
}
34+
35+
// RawMessage (non-Email) fallback
36+
return self::normalizeRaw($message, $envelope, $raw);
37+
}
38+
39+
/** @return array<string,mixed> */
40+
private static function normalizeRaw(
41+
RawMessage $rawMessage,
42+
?Envelope $envelope,
43+
?string $raw
44+
): array {
45+
return [
46+
'version' => 1,
47+
'saved_at' => (new \DateTimeImmutable)->format(\DateTimeInterface::ATOM),
48+
'subject' => null,
49+
'from' => [],
50+
'to' => [],
51+
'cc' => [],
52+
'bcc' => [],
53+
'reply_to' => [],
54+
'text' => null,
55+
'html' => null,
56+
'headers' => [],
57+
'attachments' => [],
58+
'raw' => $rawMessage,
59+
];
60+
}
61+
62+
/** @return array<string,mixed> */
63+
private static function normalizeEmail(
64+
Email $email,
65+
?Envelope $envelope,
66+
?string $raw,
67+
bool $storeAttachmentsInline
68+
): array {
2869
$headers = [];
2970
foreach ($email->getHeaders()->all() as $header) {
30-
// flatten to "Name" => ["value1", "value2"...]
3171
$headers[$header->getName()][] = trim($header->getBodyAsString());
3272
}
3373

3474
$attachments = [];
3575
foreach ($email->getAttachments() as $part) {
3676
/** @var DataPart $part */
77+
$filename = $part->getFilename();
3778
$contentId = $part->getPreparedHeaders()->has('Content-ID')
3879
? trim($part->getPreparedHeaders()->get('Content-ID')->getBodyAsString(), '<>')
3980
: null;
@@ -42,8 +83,6 @@ public static function normalize(
4283
? $part->getPreparedHeaders()->get('Content-Disposition')->getBodyAsString()
4384
: null;
4485

45-
$filename = method_exists($part, 'getFilename') ? $part->getFilename() : null;
46-
4786
$contentType = $part->getPreparedHeaders()->has('Content-Type')
4887
? $part->getPreparedHeaders()->get('Content-Type')->getBodyAsString()
4988
: null;
@@ -102,11 +141,9 @@ public static function normalize(
102141

103142
'headers' => $headers, // full header map
104143
'attachments' => $attachments, // metadata (+ content if enabled)
105-
];
106144

107-
if ($keepRaw && $raw !== null) {
108-
$payload['raw'] = $raw;
109-
}
145+
'raw' => $raw, // raw email source if provided
146+
];
110147

111148
return $payload;
112149
}
@@ -119,13 +156,11 @@ private static function addressesToArray(iterable $addresses): array
119156
{
120157
$out = [];
121158
foreach ($addresses as $addr) {
122-
if ($addr instanceof Address) {
123-
$row = ['email' => $addr->getAddress()];
124-
if ($addr->getName() !== '') {
125-
$row['name'] = $addr->getName();
126-
}
127-
$out[] = $row;
159+
$row = ['email' => $addr->getAddress()];
160+
if ($addr->getName() !== '') {
161+
$row['name'] = $addr->getName();
128162
}
163+
$out[] = $row;
129164
}
130165

131166
return $out;

0 commit comments

Comments
 (0)