Skip to content

feat:[LAR-60] Add send mail for decline article and fix unsend mail f… #156

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions app/Http/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,23 @@ final class Kernel extends HttpKernel
{
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\HttpsProtocol::class,
Middleware\TrustProxies::class,
Middleware\HttpsProtocol::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],

Expand All @@ -38,11 +38,11 @@ final class Kernel extends HttpKernel
];

protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth' => Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'guest' => Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
Expand Down
62 changes: 62 additions & 0 deletions app/Http/Livewire/Modals/DeclinedArticle.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

declare(strict_types=1);

namespace App\Http\Livewire\Modals;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use App\Notifications\SendDeclinedArticle;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\View;
use LivewireUI\Modal\ModalComponent;
use App\Policies\ArticlePolicy;
use App\Models\Article;

final class DeclinedArticle extends ModalComponent
{
use AuthorizesRequests;

public ?string $raison = null;

public ?string $description = null;

public ?Article $article = null;

protected array $rules = [
'raison' => 'required|string|min:6',
'description' => 'required|string',
];

public function mount(int $id): void
{
$this->article = Article::find($id);
}

public static function modalMaxWidth(): string
{
return 'xl';
}

public function declined(): void
{
$data = $this->validate();

$this->authorize(ArticlePolicy::DISAPPROVE, $this->article);

$this->article->update(['declined_at' => now()]); // @phpstan-ignore-line

Cache::forget('post-'.$this->article->id); // @phpstan-ignore-line

$this->article->user->notify(new SendDeclinedArticle($this->article, $data)); // @phpstan-ignore-line

session()->flash('status', __('L\'article a été décliné et le mail a été envoyé à l\'auteur pour le notifier.'));

$this->redirectRoute('articles');
}


public function render(): View
{
return view('livewire.modals.declined-article');
}
}
2 changes: 1 addition & 1 deletion app/Models/Thread.php
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ public function scopeUnresolved(Builder $query): Builder
* Scope for filtering threads.
*
* @param Builder<Thread> $builder
* @param \Illuminate\Http\Request $request
* @param Request $request
* @param string[] $filters
* @return Builder<Thread>
*/
Expand Down
2 changes: 1 addition & 1 deletion app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ public function scopeHasActivity(Builder $query): Builder
/**
* Route notifications for the Slack channel.
*
* @param \Illuminate\Notifications\Notification $notification
* @param Notification $notification
* @return string
*/
public function routeNotificationForSlack(Notification $notification): string
Expand Down
3 changes: 1 addition & 2 deletions app/Notifications/SendApprovedArticle.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@

use App\Models\Article;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

final class SendApprovedArticle extends Notification implements ShouldQueue
final class SendApprovedArticle extends Notification
{
use Queueable;

Expand Down
35 changes: 35 additions & 0 deletions app/Notifications/SendDeclinedArticle.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

declare(strict_types=1);

namespace App\Notifications;

use App\Models\Article;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

final class SendDeclinedArticle extends Notification
{
use Queueable;

public function __construct(public Article $article, public array $data)
{
}

public function via(object $notifiable): array
{
return ['mail'];
}

public function toMail(object $notifiable): MailMessage
{
return (new MailMessage())
->subject(__('Article Décliné ❌.'))
->greeting(__('Article Décliné : '.$this->data['raison']))
->line(__('Nous avons le regret de vous informer que votre article a été décliné.'))
->line($this->data['description'])
->action(__('Voir mon article'), route('articles.show', $this->article))
->line(__('Merci d\'avoir utilisé Laravel Cameroun.!'));
}
}
4 changes: 2 additions & 2 deletions app/helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,12 @@ function getFilter(string $key, array $filters = [], string $default = 'recent')
/**
* Returns the route for the replyAble.
*
* @param \App\Models\Thread|\App\Models\Discussion $replyAble
* @param App\Models\Thread|App\Models\Discussion $replyAble
* @return string
*/
function route_to_reply_able(mixed $replyAble): string
{
return $replyAble instanceof \App\Models\Thread ?
return $replyAble instanceof App\Models\Thread ?
route('forum.show', $replyAble->slug()) :
route('discussions.show', $replyAble->slug());
}
Expand Down
2 changes: 1 addition & 1 deletion config/gamify.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

return [
// Model which will be having points, generally it will be User
'payee_model' => \App\Models\User::class,
'payee_model' => App\Models\User::class,

// Reputation model
'reputation_model' => '\QCod\Gamify\Reputation',
Expand Down
22 changes: 11 additions & 11 deletions config/livewire-ui-spotlight.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,17 @@
*/

'commands' => [
\App\Spotlight\Article::class,
\App\Spotlight\Articles::class,
\App\Spotlight\Discussion::class,
\App\Spotlight\Discussions::class,
\App\Spotlight\FAQs::class,
\App\Spotlight\Forum::class,
\App\Spotlight\Guides::class,
\App\Spotlight\Slack::class,
\App\Spotlight\Sujet::class,
\App\Spotlight\Telegram::class,
\App\Spotlight\User::class,
App\Spotlight\Article::class,
App\Spotlight\Articles::class,
App\Spotlight\Discussion::class,
App\Spotlight\Discussions::class,
App\Spotlight\FAQs::class,
App\Spotlight\Forum::class,
App\Spotlight\Guides::class,
App\Spotlight\Slack::class,
App\Spotlight\Sujet::class,
App\Spotlight\Telegram::class,
App\Spotlight\User::class,
],

/*
Expand Down
2 changes: 1 addition & 1 deletion config/permission.php
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@
* When permissions or roles are updated the cache is flushed automatically.
*/

'expiration_time' => \DateInterval::createFromDateString('24 hours'),
'expiration_time' => DateInterval::createFromDateString('24 hours'),

/*
* The cache key used to store all permissions.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ public function up(): void
$teams = config('permission.teams');

if (empty($tableNames)) {
throw new \Exception('Error: config/permission.php not loaded. Run [php artisan config:clear] and try again.');
throw new Exception('Error: config/permission.php not loaded. Run [php artisan config:clear] and try again.');
}
if ($teams && empty($columnNames['team_foreign_key'] ?? null)) {
throw new \Exception('Error: team_foreign_key on config/permission.php not loaded. Run [php artisan config:clear] and try again.');
throw new Exception('Error: team_foreign_key on config/permission.php not loaded. Run [php artisan config:clear] and try again.');
}

Schema::create($tableNames['permissions'], function (Blueprint $table): void {
Expand Down Expand Up @@ -128,7 +128,7 @@ public function down(): void
$tableNames = config('permission.table_names');

if (empty($tableNames)) {
throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.');
throw new Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.');
}

Schema::drop($tableNames['role_has_permissions']);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ final class CreateViewsTable extends Migration
/**
* The database schema.
*
* @var \Illuminate\Support\Facades\Schema
* @var Schema
*/
protected $schema;

Expand Down
32 changes: 16 additions & 16 deletions helpers/ModelHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Model|\Eloquent $subject
* @property-read \App\Models\User $user
* @property-read User $user
* @method static \Database\Factories\ActivityFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder|Activity newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Activity newQuery()
Expand Down Expand Up @@ -74,7 +74,7 @@ final class IdeHelperActivity
* @property-read int|null $reactions_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Tag> $tags
* @property-read int|null $tags_count
* @property-read \App\Models\User $user
* @property-read User $user
* @property-read \Illuminate\Database\Eloquent\Collection<int, \CyrildeWit\EloquentViewable\View> $views
* @property-read int|null $views_count
* @method static \Illuminate\Database\Eloquent\Builder|Article approved()
Expand Down Expand Up @@ -176,7 +176,7 @@ final class IdeHelperChannel
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activity
* @property-read int|null $activity_count
* @property-read int $count_all_replies_with_child
* @property-read \App\Models\Reply|null $latestReply
* @property-read Reply|null $latestReply
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Reaction> $reactions
* @property-read int|null $reactions_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Reply> $replies
Expand All @@ -185,7 +185,7 @@ final class IdeHelperChannel
* @property-read int|null $subscribes_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Tag> $tags
* @property-read int|null $tags_count
* @property-read \App\Models\User $user
* @property-read User $user
* @property-read \Illuminate\Database\Eloquent\Collection<int, \CyrildeWit\EloquentViewable\View> $views
* @property-read int|null $views_count
* @method static \Illuminate\Database\Eloquent\Builder|Discussion active()
Expand Down Expand Up @@ -241,7 +241,7 @@ final class IdeHelperDiscussion
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection<int, \Spatie\MediaLibrary\MediaCollections\Models\Media> $media
* @property-read int|null $media_count
* @property-read \App\Models\User $owner
* @property-read User $owner
* @method static \Illuminate\Database\Eloquent\Builder|Enterprise certified()
* @method static \Database\Factories\EnterpriseFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder|Enterprise featured()
Expand Down Expand Up @@ -491,8 +491,8 @@ final class IdeHelperSubscription
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property \Illuminate\Support\Carbon|null $deleted_at
* @property-read \App\Models\Premium\Feature $feature
* @property-read \App\Models\Premium\Subscription $subscription
* @property-read Feature $feature
* @property-read Subscription $subscription
* @method static \Illuminate\Database\Eloquent\Builder|PlanSubscriptionUsage byFeatureSlug(string $featureSlug)
* @method static \Illuminate\Database\Eloquent\Builder|SubscriptionUsage newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|SubscriptionUsage newQuery()
Expand Down Expand Up @@ -559,8 +559,8 @@ final class IdeHelperReaction
* @property-read \Illuminate\Database\Eloquent\Collection<int, Reply> $replies
* @property-read int|null $replies_count
* @property-read \Illuminate\Database\Eloquent\Model|\Eloquent $replyAble
* @property-read \App\Models\Thread|null $solutionTo
* @property-read \App\Models\User $user
* @property-read Thread|null $solutionTo
* @property-read User $user
* @method static \Database\Factories\ReplyFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder|Reply isSolution()
* @method static \Illuminate\Database\Eloquent\Builder|Reply newModelQuery()
Expand Down Expand Up @@ -621,7 +621,7 @@ final class IdeHelperSocialAccount
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Model|\Eloquent $subscribeAble
* @property-read \App\Models\User $user
* @property-read User $user
* @method static \Illuminate\Database\Eloquent\Builder|Subscribe newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Subscribe newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Subscribe query()
Expand Down Expand Up @@ -684,18 +684,18 @@ final class IdeHelperTag
* @property-read int|null $activity_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Channel> $channels
* @property-read int|null $channels_count
* @property-read \App\Models\Reply|null $latestReply
* @property-read Reply|null $latestReply
* @property-read \Illuminate\Notifications\DatabaseNotificationCollection<int, \Illuminate\Notifications\DatabaseNotification> $notifications
* @property-read int|null $notifications_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Reaction> $reactions
* @property-read int|null $reactions_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Reply> $replies
* @property-read int|null $replies_count
* @property-read \App\Models\User|null $resolvedBy
* @property-read \App\Models\Reply|null $solutionReply
* @property-read User|null $resolvedBy
* @property-read Reply|null $solutionReply
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Subscribe> $subscribes
* @property-read int|null $subscribes_count
* @property-read \App\Models\User $user
* @property-read User $user
* @property-read \Illuminate\Database\Eloquent\Collection<int, \CyrildeWit\EloquentViewable\View> $views
* @property-read int|null $views_count
* @method static \Illuminate\Database\Eloquent\Builder|Thread active()
Expand Down Expand Up @@ -744,7 +744,7 @@ final class IdeHelperThread
* @property array|null $metadata
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \App\Models\User $user
* @property-read User $user
* @method static \Illuminate\Database\Eloquent\Builder|Transaction complete()
* @method static \Illuminate\Database\Eloquent\Builder|Transaction newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Transaction newQuery()
Expand Down Expand Up @@ -803,7 +803,7 @@ final class IdeHelperTransaction
* @property-read int|null $badges_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Discussion> $discussions
* @property-read int|null $discussions_count
* @property-read \App\Models\Enterprise|null $enterprise
* @property-read Enterprise|null $enterprise
* @property-read \Illuminate\Database\Eloquent\Collection<int, \LaravelFeature\Model\Feature> $features
* @property-read int|null $features_count
* @property-read bool $is_sponsor
Expand Down
Loading