Advertisement
Guest User

Untitled

a guest
Aug 6th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.74 KB | None | 0 0
  1. Route::get('home/account/email', ['middleware' => ['auth', 'isVerified'], 'uses' => 'AuthChangeEmailController@showForm'])->name('home.account.email');
  2.  
  3. Route::post('home/account/email_save', ['middleware' => ['auth', 'isVerified'], 'uses' => 'AuthChangeEmailController@saveForm'])->name('home.account.email_save');
  4.  
  5. Route::get('home/account/email_set/{token}', ['middleware' => ['auth', 'isVerified'], 'uses' => 'AuthChangeEmailController@emailSet'])->name('home.account.email_set');
  6.  
  7. public function saveForm(Request $request, ChangeEmailContract $changeEmailService)
  8. {
  9. $user = Auth::user();
  10.  
  11. $rules = [
  12. 'email' => 'required|email|unique:users',
  13. 'password' => 'required|checkpassword:'.$user->email,
  14. ];
  15.  
  16. $messages = [
  17. 'email.required' => 'Please enter an email address',
  18. 'email.email' => 'Please enter a valid email address',
  19. 'email.unique' => 'This e-mail is already taken. ',
  20. 'password.required' => 'Please enter your password',
  21. 'password.checkpassword' => 'Your enter wrong password',
  22.  
  23. ];
  24.  
  25.  
  26. Validator::make($request::all(), $rules, $messages)->validate();
  27.  
  28. $changeEmailService->sendChangeEmailMail($user, Request::get('email'));
  29.  
  30. return redirect()->route('home')->with('status', "Confirmation change E-mail link send to ".Request::get('email'));
  31. }
  32.  
  33. public function emailSet($token, ChangeEmailContract $changeEmailService)
  34. {
  35. $email = Request::get('email');
  36.  
  37. try {
  38. $user = $changeEmailService->setEmail($token, $email);
  39. }
  40. catch (AppExceptionsChangeEmailNotFoundException $e) {
  41. return redirect()->route('home')
  42. ->with('status', $e->getMessage());
  43. }
  44.  
  45. Auth::login($user);
  46.  
  47. return redirect()->route('home')
  48. ->with('status', 'You successfully activated your new email!');
  49. }
  50.  
  51. namespace AppServicesAuth;
  52.  
  53. use AppModelsUser;
  54. use AppContractsAuthChangeEmailContract;
  55. use AppContractsAuthChangeEmailRepositoryContract;
  56. use AppExceptionsChangeEmailNotFoundException;
  57. use IlluminateMailMailer;
  58. use IlluminateMailMessage;
  59.  
  60. class ChangeEmailService implements ChangeEmailContract
  61. {
  62.  
  63. protected $mailer;
  64.  
  65. protected $changeEmailRepo;
  66.  
  67. public function __construct(ChangeEmailRepositoryContract $changeEmailRepo)
  68. {
  69. $this->changeEmailRepo = $changeEmailRepo;
  70. }
  71.  
  72. public function sendChangeEmailMail($user, $email)
  73. {
  74. $token = $this->changeEmailRepo->createEmailChange($user, $email);
  75.  
  76. Mail::to($email)->send(
  77. new AppMailChangeEmail(array(
  78. 'email' => $email,
  79. 'token' => $token,
  80. ))
  81. );
  82. }
  83.  
  84. public function setEmail($token, $email)
  85. {
  86. $changeEmail = $this->changeEmailRepo->getChangeEmailByTokenAndEmail($token, $email);
  87.  
  88. if ($changeEmail === null) {
  89. throw new ChangeEmailNotFoundException();
  90. }
  91.  
  92. $user = User::find($changeEmail->user_id);
  93.  
  94. if (!$user) {
  95. throw new ChangeEmailNotFoundException();
  96. }
  97.  
  98. $user->email = $email;
  99.  
  100. $user->save();
  101.  
  102. $this->changeEmailRepo->deleteChangeEmail($token);
  103.  
  104. return $user;
  105.  
  106. }
  107.  
  108. }
  109.  
  110. namespace AppRepositoriesAuth;
  111.  
  112. use AppContractsAuthChangeEmailRepositoryContract;
  113. use AppModelsEmailChange;
  114. use CarbonCarbon;
  115. use IlluminateDatabaseConnection;
  116. use IlluminateSupportFacadesDB;
  117.  
  118.  
  119. class ChangeEmailRepository implements ChangeEmailRepositoryContract
  120. {
  121. public function createEmailChange($user, $email)
  122. {
  123. $email_change = $this->getEmailChange($user);
  124.  
  125. if (!$email_change) {
  126. return $this->createEmailChangeRecord($user, $email);
  127. }
  128.  
  129. return $this->updateEmailChangeRecord($user, $email);
  130.  
  131. }
  132.  
  133. public function getEmailChange($user)
  134. {
  135. return EmailChange::where('user_id', $user->id)->first();
  136. }
  137.  
  138. public function getChangeEmailByTokenAndEmail($token, $email)
  139. {
  140. return EmailChange::where(array('token' => $token, 'email' => $email))->first();
  141. }
  142.  
  143. public function deleteChangeEmail($token)
  144. {
  145. EmailChange::where('token', $token)->delete();
  146. }
  147.  
  148. private function updateEmailChangeRecord($user, $email)
  149. {
  150. $token = $this->getToken();
  151.  
  152. EmailChange::where('user_id', $user->id)->update([
  153. 'token' => $token,
  154. 'email' => $email,
  155. 'created_at' => new Carbon()
  156. ]);
  157.  
  158. return $token;
  159. }
  160.  
  161. private function getToken()
  162. {
  163. return hash_hmac('sha256', str_random(40), config('app.key'));
  164. }
  165.  
  166. private function createEmailChangeRecord($user, $email)
  167. {
  168. $token = $this->getToken();
  169.  
  170. EmailChange::insert([
  171. 'user_id' => $user->id,
  172. 'token' => $token,
  173. 'email' => $email,
  174. 'created_at' => new Carbon()
  175. ]);
  176.  
  177. return $token;
  178. }
  179. }
  180.  
  181. namespace AppModels;
  182.  
  183. use IlluminateDatabaseEloquentModel;
  184.  
  185. class EmailChange extends Model
  186. {
  187. protected $table = 'email_change';
  188.  
  189. public function user()
  190. {
  191. return $this->belongsTo(User::class);
  192. }
  193.  
  194. }
  195.  
  196. namespace AppModels;
  197.  
  198. use IlluminateNotificationsNotifiable;
  199. use AppNotificationsCustomResetPassword;
  200. use IlluminateFoundationAuthUser as Authenticatable;
  201. use PlunkMediable;
  202. class User extends Authenticatable
  203. {
  204. use Notifiable;
  205. use PlankMediableMediable;
  206.  
  207. protected $fillable = [
  208. 'name', 'email', 'password',
  209. ];
  210.  
  211. protected $hidden = [
  212. 'password', 'remember_token',
  213. ];
  214.  
  215. public function sendPasswordResetNotification($token)
  216. {
  217.  
  218. $this->notify(new CustomResetPassword($token));
  219. }
  220. }
  221.  
  222. namespace AppProvidersAuth;
  223.  
  224. use IlluminateSupportServiceProvider;
  225.  
  226. class ChangeEmailProvider extends ServiceProvider
  227. {
  228. protected $defer = false;
  229.  
  230. public function register()
  231. {
  232.  
  233. $this->app->bind('AppContractsAuthChangeEmailContract', function ($app) {
  234.  
  235. return new AppServicesAuthChangeEmailService(
  236. $app -> make("AppContractsAuthChangeEmailRepositoryContract")
  237. );
  238. });
  239.  
  240. }
  241.  
  242. public function provides()
  243. {
  244. return ['AppContractsAuthChangeEmailContract'];
  245.  
  246. }
  247.  
  248. public function boot()
  249. {
  250.  
  251.  
  252. }
  253. }
  254.  
  255.  
  256. namespace AppProvidersAuth;
  257.  
  258. use IlluminateSupportServiceProvider;
  259.  
  260. class ChangeEmailRepositoryProvider extends ServiceProvider
  261. {
  262. protected $defer = false;
  263.  
  264. public function register()
  265. {
  266. $this->app->bind('AppContractsAuthChangeEmailRepositoryContract', function ($app) {
  267. return new AppRepositoriesAuthChangeEmailRepository();
  268. });
  269. }
  270.  
  271. public function provides()
  272. {
  273. return ['AppContractsAuthChangeEmailRepositoryContract'];
  274.  
  275. }
  276.  
  277. public function boot()
  278. {
  279.  
  280. }
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement