157 lines
5.7 KiB
PHP
157 lines
5.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Auth\LoginRequest;
|
|
use App\Http\Requests\Auth\RegisterRequest;
|
|
use App\Http\Resources\UserResource;
|
|
use App\Models\User;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Str;
|
|
use OpenApi\Attributes as OA;
|
|
|
|
class AuthController extends Controller
|
|
{
|
|
#[OA\Post(
|
|
path: '/auth/register',
|
|
description: 'Register a new user account',
|
|
summary: 'Register',
|
|
tags: ['Auth'],
|
|
requestBody: new OA\RequestBody(
|
|
required: true,
|
|
content: new OA\JsonContent(
|
|
required: ['name', 'mobile', 'email', 'password'],
|
|
properties: [
|
|
new OA\Property(property: 'name', type: 'string', example: 'علی رضایی'),
|
|
new OA\Property(property: 'mobile', type: 'string', example: '09123456789'),
|
|
new OA\Property(property: 'email', type: 'string', format: 'email', example: 'ali@example.com'),
|
|
new OA\Property(property: 'password', type: 'string', format: 'password', example: 'password123'),
|
|
]
|
|
)
|
|
),
|
|
responses: [
|
|
new OA\Response(
|
|
response: 201,
|
|
description: 'Registered successfully',
|
|
content: new OA\JsonContent(
|
|
properties: [
|
|
new OA\Property(property: 'message', type: 'string', example: 'ثبتنام با موفقیت انجام شد.'),
|
|
new OA\Property(
|
|
property: 'data',
|
|
properties: [
|
|
new OA\Property(property: 'user', ref: '#/components/schemas/User'),
|
|
new OA\Property(property: 'token', type: 'string'),
|
|
],
|
|
type: 'object'
|
|
),
|
|
]
|
|
)
|
|
),
|
|
new OA\Response(response: 422, description: 'Validation error'),
|
|
]
|
|
)]
|
|
public function register(RegisterRequest $request): JsonResponse
|
|
{
|
|
$user = User::query()->create([
|
|
'name' => $request->validated('name'),
|
|
'username' => $this->generateUsername($request->validated('email')),
|
|
'mobile' => $request->validated('mobile'),
|
|
'email' => $request->validated('email'),
|
|
'password' => $request->validated('password'),
|
|
]);
|
|
|
|
$token = $user->createToken('auth-token')->plainTextToken;
|
|
|
|
return response()->json([
|
|
'message' => 'ثبتنام با موفقیت انجام شد.',
|
|
'data' => [
|
|
'user' => new UserResource($user),
|
|
'token' => $token,
|
|
],
|
|
], 201);
|
|
}
|
|
|
|
#[OA\Post(
|
|
path: '/auth/login',
|
|
description: 'Login with email or username',
|
|
summary: 'Login',
|
|
tags: ['Auth'],
|
|
requestBody: new OA\RequestBody(
|
|
required: true,
|
|
content: new OA\JsonContent(
|
|
required: ['login', 'password'],
|
|
properties: [
|
|
new OA\Property(property: 'login', description: 'Email or username', type: 'string', example: 'ali@example.com'),
|
|
new OA\Property(property: 'password', type: 'string', format: 'password', example: 'password123'),
|
|
]
|
|
)
|
|
),
|
|
responses: [
|
|
new OA\Response(
|
|
response: 200,
|
|
description: 'Logged in successfully',
|
|
content: new OA\JsonContent(
|
|
properties: [
|
|
new OA\Property(property: 'message', type: 'string', example: 'ورود با موفقیت انجام شد.'),
|
|
new OA\Property(
|
|
property: 'data',
|
|
properties: [
|
|
new OA\Property(property: 'user', ref: '#/components/schemas/User'),
|
|
new OA\Property(property: 'token', type: 'string'),
|
|
],
|
|
type: 'object'
|
|
),
|
|
]
|
|
)
|
|
),
|
|
new OA\Response(response: 422, description: 'Invalid credentials'),
|
|
]
|
|
)]
|
|
public function login(LoginRequest $request): JsonResponse
|
|
{
|
|
$login = $request->validated('login');
|
|
|
|
$user = User::query()
|
|
->where(function ($query) use ($login): void {
|
|
$query->where('email', $login)
|
|
->orWhere('username', $login);
|
|
})
|
|
->first();
|
|
|
|
if (! $user || ! Hash::check($request->validated('password'), $user->password)) {
|
|
return response()->json([
|
|
'message' => 'اطلاعات ورود نادرست است.',
|
|
'errors' => [
|
|
'login' => ['ایمیل یا نام کاربری یا رمز عبور اشتباه است.'],
|
|
],
|
|
], 422);
|
|
}
|
|
|
|
$token = $user->createToken('auth-token')->plainTextToken;
|
|
|
|
return response()->json([
|
|
'message' => 'ورود با موفقیت انجام شد.',
|
|
'data' => [
|
|
'user' => new UserResource($user),
|
|
'token' => $token,
|
|
],
|
|
]);
|
|
}
|
|
|
|
private function generateUsername(string $email): string
|
|
{
|
|
$base = Str::slug(Str::before($email, '@'), '') ?: 'user';
|
|
$username = $base;
|
|
$counter = 1;
|
|
|
|
while (User::query()->where('username', $username)->exists()) {
|
|
$username = $base.$counter;
|
|
$counter++;
|
|
}
|
|
|
|
return $username;
|
|
}
|
|
}
|