feat: forgot password

config: msg
This commit is contained in:
2026-07-30 22:42:38 +07:00
parent 781a0f8aa7
commit 36eec0a664
11 changed files with 284 additions and 4 deletions
+10 -2
View File
@@ -19,7 +19,15 @@ class ResetCardsCommand extends Command
public function handle()
{
$this->adminService->resetAllCards();
$this->info('Successfully reset all cards for active members to 0!');
try {
$this->adminService->resetAllCards();
$this->info('Successfully reset all cards for active members to 0!');
} catch (\Throwable $e) {
\Illuminate\Support\Facades\Log::error('Lỗi xảy ra khi chạy command reset thẻ hàng tháng (cards:reset): ' . $e->getMessage());
$this->error('Reset cards failed: ' . $e->getMessage());
return Command::FAILURE;
}
return Command::SUCCESS;
}
}
+22
View File
@@ -74,4 +74,26 @@ class AuthController extends Controller
$this->authService->logout($request);
return redirect('/login');
}
public function forgotPassword(Request $request)
{
$validator = \Illuminate\Support\Facades\Validator::make($request->all(), [
'mail' => 'required|email|max:255',
], [
'mail.required' => config('constants.MSG_FORGOT_PWD_EMAIL_REQUIRED'),
'mail.email' => config('constants.MSG_FORGOT_PWD_EMAIL_INVALID'),
]);
if ($validator->fails()) {
return back()->withInput()->with('dialog_forgot_error', $validator->errors()->first());
}
$result = $this->authService->forgotPassword($request->input('mail'));
if (!$result['success']) {
return back()->withInput()->with('dialog_forgot_error', $result['error_msg']);
}
return back()->with('dialog_forgot_success', $result['message']);
}
}
+39
View File
@@ -0,0 +1,39 @@
<?php
namespace App\Mail;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class ResetPasswordMail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(
public User $user,
public string $newPassword
) {}
public function envelope(): Envelope
{
return new Envelope(
subject: '[ThankCard System] Mật khẩu mới của bạn',
);
}
public function content(): Content
{
return new Content(
view: 'emails.reset_password',
);
}
public function attachments(): array
{
return [];
}
}
+4
View File
@@ -198,10 +198,14 @@ class AdminService implements AdminServiceInterface
public function resetAllCards(): void
{
$activeUserCount = User::where('status', config('constants.STATUS_ACTIVE'))->count();
User::where('status', config('constants.STATUS_ACTIVE'))->update([
'card' => 0,
'flag_send' => config('constants.FLAG_SEND_DISABLED'),
]);
\Illuminate\Support\Facades\Log::info("Thực hiện reset thẻ hàng tháng thành công cho {$activeUserCount} tài khoản active.");
}
public function updateAddCard(int $id, array $data): void
+32
View File
@@ -47,4 +47,36 @@ class AuthService implements AuthServiceInterface
return route('user.dashboard');
}
public function forgotPassword(string $email): array
{
$email = \Illuminate\Support\Str::lower(trim($email));
$user = User::where('mail', $email)->first();
if (!$user) {
return ['success' => false, 'error_msg' => config('constants.MSG_FORGOT_PWD_EMAIL_NOT_FOUND')];
}
if ($user->status != config('constants.STATUS_ACTIVE')) {
return ['success' => false, 'error_msg' => config('constants.MSG_FORGOT_PWD_ACCOUNT_INACTIVE')];
}
// Generate random password (8 characters)
$newPassword = \Illuminate\Support\Str::random(8);
// Update password with md5 and set first_login flag to 1
$user->pass = md5($newPassword);
$user->first_login = config('constants.FIRST_LOGIN_TRUE');
$user->save();
// Send Email
try {
\Illuminate\Support\Facades\Mail::to($user->mail)->send(new \App\Mail\ResetPasswordMail($user, $newPassword));
} catch (\Exception $e) {
\Illuminate\Support\Facades\Log::error('Failed to send reset password email: ' . $e->getMessage());
return ['success' => false, 'error_msg' => config('constants.MSG_FORGOT_PWD_MAIL_FAILED')];
}
return ['success' => true, 'message' => config('constants.MSG_FORGOT_PWD_SUCCESS')];
}
}
@@ -12,4 +12,6 @@ interface AuthServiceInterface
public function logout(Request $request): void;
public function getRedirectRouteForUser(User $user): string;
public function forgotPassword(string $email): array;
}