feat(auth): implement authentication endpoints with registration and login functionality
This commit is contained in:
156
app/Http/Controllers/Api/AuthController.php
Normal file
156
app/Http/Controllers/Api/AuthController.php
Normal file
@@ -0,0 +1,156 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user