diff --git a/.gitignore b/.gitignore index 47018b48..4055e6f4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ npm-debug.log vagrant-credentials.rb ubuntu-bionic-18.04-cloudimg-console.log .phpunit.result.cache +code/public/assets/ + diff --git a/code/app/Athenia/Contracts/Services/Messaging/SendEmailServiceContract.php b/code/app/Athenia/Contracts/Services/Messaging/SendEmailServiceContract.php index 541cf104..0b94c4fb 100644 --- a/code/app/Athenia/Contracts/Services/Messaging/SendEmailServiceContract.php +++ b/code/app/Athenia/Contracts/Services/Messaging/SendEmailServiceContract.php @@ -3,5 +3,15 @@ namespace App\Athenia\Contracts\Services\Messaging; +use App\Models\Messaging\Message; + interface SendEmailServiceContract extends BaseMessageSendingServiceContract -{} \ No newline at end of file +{ + /** + * Used when there is no to set on the message + * + * @param Message $message + * @return void + */ + public function sendDirectMessage(Message $message); +} \ No newline at end of file diff --git a/code/app/Athenia/Listeners/Messaging/MessageCreatedListener.php b/code/app/Athenia/Listeners/Messaging/MessageCreatedListener.php index f7c17dfb..fe4f4b74 100644 --- a/code/app/Athenia/Listeners/Messaging/MessageCreatedListener.php +++ b/code/app/Athenia/Listeners/Messaging/MessageCreatedListener.php @@ -8,6 +8,7 @@ use App\Athenia\Contracts\Repositories\Messaging\MessageRepositoryContract; use App\Athenia\Contracts\Services\Messaging\BaseMessageSendingServiceContract; use App\Athenia\Contracts\Services\Messaging\MessageSendingSelectionServiceContract; +use App\Athenia\Contracts\Services\Messaging\SendEmailServiceContract; use App\Athenia\Events\Messaging\MessageCreatedEvent; use App\Athenia\Events\Messaging\MessageSentEvent; use App\Models\Messaging\Message; @@ -56,16 +57,22 @@ public function handle(MessageCreatedEvent $event): void ->filter(fn (?BaseMessageSendingServiceContract $maybeService) => $maybeService); foreach ($availableServices as $service) { - $to = $message->to; - if ($to instanceof CanReceiveMessageContract) { - $service->sendMessage($to, $message); + $to = $message->to_id ? $message->to : null; + if (!$to && $message->email && $service instanceof SendEmailServiceContract) { + $service->sendDirectMessage($message); $sent = true; } - if ($to instanceof HasMessageReceiversContract) { - foreach ($to->messageReceivers($message) as $messageReceiver) { - $service->sendMessage($messageReceiver, $message); + else { + if ($to instanceof CanReceiveMessageContract) { + $service->sendMessage($to, $message); $sent = true; } + if ($to instanceof HasMessageReceiversContract) { + foreach ($to->messageReceivers($message) as $messageReceiver) { + $service->sendMessage($messageReceiver, $message); + $sent = true; + } + } } } diff --git a/code/app/Athenia/Mail/MessageMailer.php b/code/app/Athenia/Mail/MessageMailer.php index 861f2cd3..6fa30bc5 100644 --- a/code/app/Athenia/Mail/MessageMailer.php +++ b/code/app/Athenia/Mail/MessageMailer.php @@ -21,10 +21,10 @@ class MessageMailer extends Mailable implements ShouldQueue /** * NotificationMailer constructor. - * @param CanReceiveEmailsContract $receiver * @param Message $message + * @param CanReceiveEmailsContract|null $receiver */ - public function __construct(private CanReceiveEmailsContract $receiver, private Message $message) + public function __construct(private Message $message, private ?CanReceiveEmailsContract $receiver = null) { $this->chain([new MessageSentEvent($message)]); } @@ -37,7 +37,7 @@ public function __construct(private CanReceiveEmailsContract $receiver, private public function build() { $email = $this->message->email ?? $this->receiver->getEmailAddress(); - $name = $this->receiver->getEmailToName(); + $name = $this->receiver?->getEmailToName(); $data = $this->message->data; if (isset ($data['message'])) { $data['message_content'] = $data['message']; diff --git a/code/app/Athenia/Services/Messaging/SendEmailService.php b/code/app/Athenia/Services/Messaging/SendEmailService.php index e759d81a..ca8a9071 100644 --- a/code/app/Athenia/Services/Messaging/SendEmailService.php +++ b/code/app/Athenia/Services/Messaging/SendEmailService.php @@ -27,11 +27,22 @@ public function __construct(private Mailer $mailer) {} public function sendMessage(CanReceiveMessageContract $receiver, Message $message): bool { if ($receiver instanceof CanReceiveEmailsContract && $receiver->canReceiveMessage($message)) { - $this->mailer->send(new MessageMailer($receiver, $message)); + $this->mailer->send(new MessageMailer($message, $receiver)); return true; } return false; } + + /** + * Used when there is no to set on the message + * + * @param Message $message + * @return void + */ + public function sendDirectMessage(Message $message) + { + $this->mailer->send(new MessageMailer($message)); + } } \ No newline at end of file diff --git a/code/app/Policies/Wiki/ArticlePolicy.php b/code/app/Policies/Wiki/ArticlePolicy.php index 4d976063..c76cb33a 100644 --- a/code/app/Policies/Wiki/ArticlePolicy.php +++ b/code/app/Policies/Wiki/ArticlePolicy.php @@ -22,10 +22,7 @@ class ArticlePolicy extends BasePolicyAbstract */ public function all(User $user) { - return $user->hasRole([ - Role::ARTICLE_VIEWER, - Role::ARTICLE_EDITOR, - ]); + return true; } /** @@ -37,10 +34,7 @@ public function all(User $user) */ public function view(User $user, Article $model) { - return $user->hasRole([ - Role::ARTICLE_VIEWER, - Role::ARTICLE_EDITOR, - ]); + return true; } /** diff --git a/code/config/app.php b/code/config/app.php index ce11fc78..d08ef7db 100644 --- a/code/config/app.php +++ b/code/config/app.php @@ -54,7 +54,7 @@ 'url' => env('APP_URL', 'http://localhost'), - 'asset_url' => env('ASSET_URL', 'http://dev-assets.localhost'), + 'asset_url' => env('ASSET_URL', 'http://localhost:8081'), /* |-------------------------------------------------------------------------- @@ -67,7 +67,7 @@ | */ - 'timezone' => 'UTC', + 'timezone' => env('APP_TIMEZONE', 'UTC'), /* |-------------------------------------------------------------------------- diff --git a/code/config/filesystems.php b/code/config/filesystems.php index 67158a5d..f381c49d 100644 --- a/code/config/filesystems.php +++ b/code/config/filesystems.php @@ -50,8 +50,8 @@ 'public' => [ 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL').'/storage', + 'root' => public_path(), + 'url' => env('APP_URL'), 'visibility' => 'public', ], diff --git a/code/phpunit.xml b/code/phpunit.xml index 243f95b4..f5f72a85 100644 --- a/code/phpunit.xml +++ b/code/phpunit.xml @@ -6,8 +6,6 @@ colors="true" processIsolation="false" beStrictAboutTestsThatDoNotTestAnything="false" - stopOnFailure="true" - stopOnError="true" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" cacheDirectory=".phpunit.cache" backupStaticProperties="false" diff --git a/code/tests/Athenia/Feature/Http/Article/ArticleIndexTest.php b/code/tests/Athenia/Feature/Http/Article/ArticleIndexTest.php index c87a50b4..1a834eed 100644 --- a/code/tests/Athenia/Feature/Http/Article/ArticleIndexTest.php +++ b/code/tests/Athenia/Feature/Http/Article/ArticleIndexTest.php @@ -37,16 +37,6 @@ public function testNotLoggedUserBlocked(): void $response->assertStatus(403); } - public function testIncorrectUserRoleBlocked(): void - { - foreach ($this->rolesWithoutAdmins([Role::ARTICLE_VIEWER, Role::ARTICLE_EDITOR]) as $role ) { - $this->actAs($role); - $response = $this->json('GET', $this->path); - - $response->assertStatus(403); - } - } - public function testGetPaginationEmpty(): void { foreach ([Role::ARTICLE_EDITOR, Role::ARTICLE_VIEWER] as $role) { diff --git a/code/tests/Athenia/Feature/Http/Article/ArticleViewTest.php b/code/tests/Athenia/Feature/Http/Article/ArticleViewTest.php index 8ff26a6d..326cf548 100644 --- a/code/tests/Athenia/Feature/Http/Article/ArticleViewTest.php +++ b/code/tests/Athenia/Feature/Http/Article/ArticleViewTest.php @@ -47,17 +47,6 @@ public function testNotLoggedInUserBlocked(): void $response->assertStatus(403); } - public function testIncorrectUserRoleBlocked(): void - { - foreach ($this->rolesWithoutAdmins([Role::ARTICLE_EDITOR, Role::ARTICLE_VIEWER]) as $role) { - $this->actAs($role); - - $response = $this->json('GET', $this->path); - - $response->assertStatus(403); - } - } - public function testNotFound(): void { $this->actAsUser(); diff --git a/code/tests/Athenia/Feature/Http/Authentication/LogoutTest.php b/code/tests/Athenia/Feature/Http/Authentication/LogoutTest.php index cfe797e5..424c507c 100644 --- a/code/tests/Athenia/Feature/Http/Authentication/LogoutTest.php +++ b/code/tests/Athenia/Feature/Http/Authentication/LogoutTest.php @@ -34,6 +34,9 @@ public function handle($request, $next) { } }); + $log = app('log'); + $log->shouldReceive('channel')->andReturn($log); + $user = User::factory()->create(); $token = JWTAuth::fromUser($user); $response = $this->json('POST', '/v1/auth/logout', [], ['Authorization' => 'Bearer ' . $token]); diff --git a/code/tests/Athenia/Integration/Policies/Wiki/ArticlePolicyTest.php b/code/tests/Athenia/Integration/Policies/Wiki/ArticlePolicyTest.php index 14cc99b2..0a9f14f1 100644 --- a/code/tests/Athenia/Integration/Policies/Wiki/ArticlePolicyTest.php +++ b/code/tests/Athenia/Integration/Policies/Wiki/ArticlePolicyTest.php @@ -4,6 +4,7 @@ namespace Tests\Athenia\Integration\Policies\Wiki; use App\Models\Role; +use App\Models\User\User; use App\Models\Wiki\Article; use App\Policies\Wiki\ArticlePolicy; use Tests\DatabaseSetupTrait; @@ -22,44 +23,14 @@ public function testAllSuccess(): void { $policy = new ArticlePolicy(); - foreach ([Role::ARTICLE_EDITOR, Role::ARTICLE_VIEWER] as $role) { - $user = $this->getUserOfRole($role); - - $this->assertTrue($policy->all($user)); - } - } - - public function testAllBlocks(): void - { - $policy = new ArticlePolicy(); - - foreach ($this->rolesWithoutAdmins([Role::ARTICLE_EDITOR, Role::ARTICLE_VIEWER]) as $role) { - $user = $this->getUserOfRole($role); - - $this->assertFalse($policy->all($user)); - } + $this->assertTrue($policy->all(new User())); } public function testViewSuccess(): void { $policy = new ArticlePolicy(); - foreach ([Role::ARTICLE_EDITOR, Role::ARTICLE_VIEWER] as $role) { - $user = $this->getUserOfRole($role); - - $this->assertTrue($policy->view($user, new Article())); - } - } - - public function testViewBlocks(): void - { - $policy = new ArticlePolicy(); - - foreach ($this->rolesWithoutAdmins([Role::ARTICLE_EDITOR, Role::ARTICLE_VIEWER]) as $role) { - $user = $this->getUserOfRole($role); - - $this->assertFalse($policy->view($user, new Article())); - } + $this->assertTrue($policy->view(new User(), new Article())); } public function testCreateSuccess(): void diff --git a/code/tests/Athenia/Unit/Mail/MessageMailerTest.php b/code/tests/Athenia/Unit/Mail/MessageMailerTest.php index 4dbd563f..6eec04ba 100644 --- a/code/tests/Athenia/Unit/Mail/MessageMailerTest.php +++ b/code/tests/Athenia/Unit/Mail/MessageMailerTest.php @@ -31,7 +31,7 @@ public function testBuild(): void ], ]); - $messageMailer = new MessageMailer($user, $message); + $messageMailer = new MessageMailer($message, $user); $builtMailer = $messageMailer->build();