Skip to content

Commit d286ab6

Browse files
committed
handled user creation event. sending mail when creating a new user. added mail package
1 parent 2685b19 commit d286ab6

File tree

14 files changed

+553
-13
lines changed

14 files changed

+553
-13
lines changed

.env.example

+9
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,12 @@ DB_PASSWORD=secret
1212

1313
CACHE_DRIVER=memcached
1414
QUEUE_DRIVER=sync
15+
16+
MAIL_DRIVER=smtp
17+
MAIL_HOST=mailtrap.io
18+
MAIL_PORT=2525
19+
MAIL_FROM_ADDRESS=[email protected]
20+
MAIL_FROM_NAME=Your From
21+
MAIL_USERNAME=yourusername
22+
MAIL_PASSWORD=yourpassword
23+
MAIL_ENCRYPTION=tls
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace App\Events\UserEvents;
4+
5+
use App\Events\Event;
6+
use App\Models\User;
7+
8+
class UserCreatedEvent extends Event
9+
{
10+
/**
11+
* Instance of User
12+
*
13+
* @var User
14+
*/
15+
public $user;
16+
17+
/**
18+
* @param User $user
19+
*/
20+
public function __construct(User $user)
21+
{
22+
$this->user = $user;
23+
}
24+
}

app/Http/Controllers/UserController.php

+4-8
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,11 @@ private function storeRequestValidationRules(Request $request)
175175

176176
$requestUser = $request->user();
177177

178-
// Only admin user can set role.
178+
// Only admin user can set admin role.
179179
if ($requestUser instanceof User && $requestUser->role === User::ADMIN_ROLE) {
180180
$rules['role'] = 'in:BASIC_USER,ADMIN_USER';
181181
} else {
182-
$request->request->add([
183-
'role' => User::BASIC_ROLE
184-
]);
182+
$rules['role'] = 'in:BASIC_USER';
185183
}
186184

187185
return $rules;
@@ -214,13 +212,11 @@ private function updateRequestValidationRules(Request $request)
214212

215213
$requestUser = $request->user();
216214

217-
// Only admin user can update role.
215+
// Only admin user can update admin role.
218216
if ($requestUser instanceof User && $requestUser->role === User::ADMIN_ROLE) {
219217
$rules['role'] = 'in:BASIC_USER,ADMIN_USER';
220218
} else {
221-
$request->request->add([
222-
'role' => User::BASIC_ROLE
223-
]);
219+
$rules['role'] = 'in:BASIC_USER';
224220
}
225221

226222
return $rules;

app/Listeners/UserEventsListener.php

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace App\Listeners;
4+
5+
use Illuminate\Events\Dispatcher;
6+
use App\Events\UserEvents\UserCreatedEvent;
7+
use App\Mails\WelcomeEmail;
8+
9+
class UserEventsListener
10+
{
11+
/**
12+
* Handle the user created event
13+
*
14+
* @param UserCreatedEvent $event
15+
*/
16+
public function onUserCreatedEvent($event)
17+
{
18+
$user = $event->user;
19+
20+
//send welcome email to the user
21+
\Mail::to($user)->send(new WelcomeEmail($user));
22+
}
23+
24+
/**
25+
* Register the listeners for the subscriber.
26+
*
27+
* @param Dispatcher $events
28+
*/
29+
public function subscribe($events)
30+
{
31+
$events->listen(
32+
UserCreatedEvent::class,
33+
'App\Listeners\UserEventsListener@onUserCreatedEvent'
34+
);
35+
}
36+
}

app/Mails/WelcomeEmail.php

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace App\Mails;
4+
5+
use App\Models\User;
6+
use Illuminate\Bus\Queueable;
7+
use Illuminate\Mail\Mailable;
8+
use Illuminate\Queue\SerializesModels;
9+
10+
class WelcomeEmail extends Mailable
11+
{
12+
use Queueable, SerializesModels;
13+
14+
/**
15+
* Instance of User
16+
*
17+
* @var User
18+
*/
19+
public $user;
20+
21+
/**
22+
* Create a new message instance.
23+
*
24+
* @param User $user
25+
*/
26+
public function __construct(User $user)
27+
{
28+
$this->user = $user;
29+
}
30+
31+
/**
32+
* Build the message.
33+
*
34+
* @return $this
35+
*/
36+
public function build()
37+
{
38+
return $this->view('emails.welcome');
39+
}
40+
}

app/Providers/EventServiceProvider.php

+10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Providers;
44

55
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
6+
use App\Listeners\UserEventsListener;
67

78
class EventServiceProvider extends ServiceProvider
89
{
@@ -16,4 +17,13 @@ class EventServiceProvider extends ServiceProvider
1617
'App\Listeners\EventListener',
1718
],
1819
];
20+
21+
/**
22+
* The subscriber classes to register.
23+
*
24+
* @var array
25+
*/
26+
protected $subscribe = [
27+
UserEventsListener::class,
28+
];
1929
}

app/Repositories/AbstractEloquentRepository.php

+18-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Repositories\Contracts\BaseRepository;
66
use Illuminate\Database\Eloquent\Model;
77
use Ramsey\Uuid\Uuid;
8+
use App\Models\User;
89

910
abstract class AbstractEloquentRepository implements BaseRepository
1011
{
@@ -22,10 +23,20 @@ abstract class AbstractEloquentRepository implements BaseRepository
2223
*/
2324
protected $model;
2425

26+
/**
27+
* get logged in user
28+
*
29+
* @var User $loggedInUser
30+
*/
31+
protected $loggedInUser;
2532

33+
/**
34+
* Constructor
35+
*/
2636
public function __construct()
2737
{
2838
$this->setModel();
39+
$this->loggedInUser = $this->getLoggedInUser();
2940
}
3041

3142
/**
@@ -181,7 +192,12 @@ public function delete(Model $model)
181192
*/
182193
protected function getLoggedInUser()
183194
{
184-
return \Auth::user();
185-
}
195+
$user = \Auth::user();
186196

197+
if ($user instanceof User) {
198+
return $user;
199+
} else {
200+
return new User();
201+
}
202+
}
187203
}

app/Repositories/EloquentUserRepository.php

+29
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use App\Models\User;
77
use Illuminate\Support\Facades\Hash;
88
use Illuminate\Database\Eloquent\Model;
9+
use App\Events\UserEvents\UserCreatedEvent;
910

1011
class EloquentUserRepository extends AbstractEloquentRepository implements UserRepository
1112
{
@@ -29,6 +30,9 @@ public function save(array $data)
2930

3031
$user = parent::save($data);
3132

33+
// fire user created event
34+
\Event::fire(new UserCreatedEvent($user));
35+
3236
return $user;
3337
}
3438

@@ -45,4 +49,29 @@ public function update(Model $model, array $data)
4549

4650
return $updatedUser;
4751
}
52+
53+
/**
54+
* @inheritdoc
55+
*/
56+
public function findBy(array $searchCriteria = [])
57+
{
58+
// Only admin user can see all users
59+
if ($this->loggedInUser->role !== User::ADMIN_ROLE) {
60+
$searchCriteria['id'] = $this->loggedInUser->id;
61+
}
62+
63+
return parent::findBy($searchCriteria);
64+
}
65+
66+
/**
67+
* @inheritdoc
68+
*/
69+
public function findOne($id)
70+
{
71+
if ($id === 'me') {
72+
return $this->getLoggedInUser();
73+
}
74+
75+
return parent::findOne($id);
76+
}
4877
}

bootstrap/app.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
// load cors configurations
5252
$app->configure('cors');
5353

54+
// mail configurations
55+
$app->configure('mail');
56+
class_alias('Illuminate\Support\Facades\Mail', 'mail');
57+
5458
/*
5559
|--------------------------------------------------------------------------
5660
| Register Middleware
@@ -83,11 +87,12 @@
8387

8488
// $app->register(App\Providers\AppServiceProvider::class);
8589
$app->register(App\Providers\AuthServiceProvider::class);
86-
// $app->register(App\Providers\EventServiceProvider::class);
90+
$app->register(App\Providers\EventServiceProvider::class);
8791
$app->register(App\Providers\RepositoriesServiceProvider::class);
8892
$app->register(Laravel\Passport\PassportServiceProvider::class);
8993
$app->register(Dusterio\LumenPassport\PassportServiceProvider::class);
9094
$app->register(Barryvdh\Cors\LumenServiceProvider::class);
95+
$app->register(\Illuminate\Mail\MailServiceProvider::class);
9196

9297
/*
9398
|--------------------------------------------------------------------------

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"ramsey/uuid": "^3.5",
1212
"league/fractal": "^0.15.0",
1313
"dusterio/lumen-passport": "^0.1.9",
14-
"barryvdh/laravel-cors": "^0.8.6"
14+
"barryvdh/laravel-cors": "^0.8.6",
15+
"illuminate/mail": "^5.4"
1516
},
1617
"require-dev": {
1718
"fzaninotto/faker": "~1.4",

0 commit comments

Comments
 (0)