Refactoring: TakeController returned item Mail moved to a listener

The TakeController was manually sending the email message
as well as dealing with item return, so I moved the email message
to it's own listener, I created an event for it and moved the
return part to the item model.
This commit is contained in:
Bruno F. Fontes 2018-09-30 21:32:33 -03:00
parent 8575895341
commit 1e1c178214
5 changed files with 99 additions and 14 deletions

38
app/Events/ReturnItem.php Normal file
View File

@ -0,0 +1,38 @@
<?php
namespace App\Events;
use \App\Item;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class ReturnItem
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $item;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Item $item)
{
$this->item = $item;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}

View File

@ -4,8 +4,8 @@ namespace App\Http\Controllers;
use \App\Item; use \App\Item;
use \App\User; use \App\User;
use App\Mail\ItemAvailable;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Events\ReturnItem;
class TakeController extends Controller class TakeController extends Controller
{ {
@ -27,19 +27,8 @@ class TakeController extends Controller
public function delete(Request $request) public function delete(Request $request)
{ {
$item = User::loggedIn()->items()->find(request('item')); $item = User::loggedIn()->items()->find(request('item'));
$waiting_id = $item->waiting_user_id; event(new ReturnItem($item));
$item->used_by = null; $item->returnItem();
$item->waiting_user_id = null;
$item->save();
//Send e-mail to waiting user
if ($waiting_id) {
$user = User::find($waiting_id);
\Mail::to($user)->send(
new ItemAvailable($user->name, $item)
);
}
return redirect('home'); return redirect('home');
} }
} }

View File

@ -38,4 +38,16 @@ class Item extends Model
{ {
return (new static)->where('user_id', \Auth::id()); return (new static)->where('user_id', \Auth::id());
} }
/**
* Return a specified item
*
* @return void
*/
public function returnItem()
{
$this->used_by = null;
$this->waiting_user_id = null;
$this->save();
}
} }

View File

@ -0,0 +1,40 @@
<?php
namespace App\Listeners;
use Mail;
use App\User;
use App\Events\ReturnItem;
use App\Mail\ItemAvailable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class AlertReturnedItem
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Send an email to the user that
* is waiting for the item
*
* @param ReturnItem $item
* @return void
*/
public function handle(ReturnItem $event)
{
if ($event->item->waiting_user_id) {
$user = User::find($event->item->waiting_user_id);
Mail::to($user)->send(
new ItemAvailable($user->name, $event->item)
);
}
}
}

View File

@ -6,6 +6,8 @@ use Illuminate\Support\Facades\Event;
use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use App\Events\ReturnItem;
use App\Listeners\AlertReturnedItem;
class EventServiceProvider extends ServiceProvider class EventServiceProvider extends ServiceProvider
{ {
@ -18,6 +20,10 @@ class EventServiceProvider extends ServiceProvider
Registered::class => [ Registered::class => [
SendEmailVerificationNotification::class, SendEmailVerificationNotification::class,
], ],
ReturnItem::class => [
AlertReturnedItem::class,
],
]; ];
/** /**