Compare commits

..

1 Commits

Author SHA1 Message Date
4afcd5c81e create EmailEvent for login 2026-05-10 14:29:52 +03:30
17 changed files with 153 additions and 63 deletions

View File

@@ -30,6 +30,7 @@ ENV COMPOSER_ALLOW_SUPERUSER=1
# Default command # Default command
CMD composer install ;\ CMD composer install ;\
composer dump-autoload --optimize --classmap-authoritative ;\ composer dump-autoload --optimize --classmap-authoritative ;\
php artisan key:generate ;\
php artisan migrate ;\ php artisan migrate ;\
php artisan db:seed ;\ php artisan db:seed ;\
php-fpm php-fpm

View File

@@ -1,19 +0,0 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Resources\ExpertResource;
use App\Http\Controllers\Controller;
use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
class ProfileController extends Controller
{
use ApiResponse;
public function info(): JsonResponse
{
return $this->successResponse(new ExpertResource(Auth::user()));
}
}

View File

@@ -1,24 +0,0 @@
<?php
namespace App\Admin\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ExpertResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'username' => $this->username,
'email' => $this->email,
];
}
}

View File

@@ -0,0 +1,40 @@
<?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 LoginNotificationMail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(
public User $user
) {
//
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Login Notification Mail',
);
}
public function content(): Content
{
return new Content(
view: 'emails.login-notification',
);
}
public function attachments(): array
{
return [];
}
}

View File

@@ -1,11 +1,13 @@
<?php <?php
namespace App\Http\Controllers; namespace App\User\Controller\Auth;
use App\Http\Requests\Auth\LoginRequest; use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\RegisterRequest;
use App\Models\User; use App\Models\User;
use App\Traits\ApiResponse; use App\Traits\ApiResponse;
use App\User\Requests\Auth\LoginRequest;
use App\User\Requests\Auth\RegisterRequest;
use App\User\Resources\UserResource;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -44,11 +46,7 @@ class AuthController extends Controller
$user = Auth::user(); $user = Auth::user();
return $this->successResponse([ return $this->successResponse(new UserResource($user));
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
]);
} }
return $this->errorResponse(__('messages.incorrect_or_username_password')); return $this->errorResponse(__('messages.incorrect_or_username_password'));

View File

@@ -0,0 +1,14 @@
<?php
namespace App\User\Controller\Dashboard;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ConfirmController extends Controller
{
public function index()
{
//
}
}

View File

@@ -30,10 +30,10 @@ class ProfileController extends Controller
'national_id' => $request->national_id, 'national_id' => $request->national_id,
'address' => $request->address, 'address' => $request->address,
'postal_code' => $request->postal_code, 'postal_code' => $request->postal_code,
'account_number' => $request->account_number,
'phone_number' => $request->phone_number, 'phone_number' => $request->phone_number,
'province_id' => $request->province_id, 'province_id' => $request->province_id,
'city_id' => $request->city_id, 'city_id' => $request->city_id,
'status' => 1
]); ]);
return $this->successResponse(); return $this->successResponse();

View File

@@ -0,0 +1,23 @@
<?php
namespace App\User\Events;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class LoginEmailEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*/
public function __construct(public User $user)
{
//
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\User\Listeners;
use App\Mail\LoginNotificationMail;
use App\User\Events\LoginEmailEvent;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;
class SendEmailListener implements ShouldQueue{
public string $queue = 'emails';
/**
* Create the event listener.
*/
public function __construct()
{
//
}
/**
* Handle the event.
*/
public function handle(LoginEmailEvent $event): void
{
$user = $event->user;
Mail::to($user->email)->send(
new LoginNotificationMail($user)
);
}
}

View File

@@ -1,8 +1,7 @@
<?php <?php
namespace App\Http\Requests\Auth; namespace App\User\Requests\Auth;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
class LoginRequest extends FormRequest class LoginRequest extends FormRequest
@@ -18,7 +17,7 @@ class LoginRequest extends FormRequest
/** /**
* Get the validation rules that apply to the request. * Get the validation rules that apply to the request.
* *
* @return array<string, ValidationRule|array|string> * @return array<string, mixed>
*/ */
public function rules(): array public function rules(): array
{ {

View File

@@ -1,8 +1,7 @@
<?php <?php
namespace App\Http\Requests\Auth; namespace App\User\Requests\Auth;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
class RegisterRequest extends FormRequest class RegisterRequest extends FormRequest
@@ -18,7 +17,7 @@ class RegisterRequest extends FormRequest
/** /**
* Get the validation rules that apply to the request. * Get the validation rules that apply to the request.
* *
* @return array<string, ValidationRule|array|string> * @return array<string, mixed>
*/ */
public function rules(): array public function rules(): array
{ {

View File

@@ -28,8 +28,7 @@ class EditRequest extends FormRequest
'national_id' => 'required', 'national_id' => 'required',
'address' => 'required', 'address' => 'required',
'postal_code' => 'required', 'postal_code' => 'required',
'account_number' => 'required', 'phone_number' => 'required',
'phone_number' => 'required|regex:/^964\d{9}$/|numeric|digits:11',
'province_id' => 'required', 'province_id' => 'required',
'city_id' => 'required', 'city_id' => 'required',
]; ];

0
backend/app/User/Resources/UserResource.php Normal file → Executable file
View File

View File

@@ -12,8 +12,11 @@ return Application::configure(basePath: dirname(__DIR__))
health: '/up', health: '/up',
) )
->withMiddleware(function (Middleware $middleware): void { ->withMiddleware(function (Middleware $middleware): void {
$middleware->web()->preventRequestForgery(['*']); $middleware->web()->validateCsrfTokens(['*']);
}) })
->withExceptions(function (Exceptions $exceptions): void { ->withExceptions(function (Exceptions $exceptions): void {
// //
})->create(); })
->withEvents(discover: [
__DIR__.'/../app/User/Listeners',
])->create();

View File

@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Notification</title>
</head>
<body>
<h2>Hello {{ $user->username }}</h2>
<p>You have successfully logged in to your account.</p>
<p>
Email: {{ $user->email }}
</p>
<p>
If this login was not done by you, please contact support immediately.
</p>
<br>
<p>Thank you.</p>
</body>
</html>

View File

@@ -1,8 +1,10 @@
<?php <?php
use App\User\Controller\Auth\AuthController;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::get('/user', function (Request $request) { Route::get('/user', function (Request $request) {
return $request->user(); return $request->user();
})->middleware('auth:api'); })->middleware('auth:api');

View File

@@ -1,6 +1,6 @@
<?php <?php
use App\Http\Controllers\AuthController; use App\User\Controller\Auth\AuthController;
use App\User\Controller\ProfileController; use App\User\Controller\ProfileController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;