Files
hoshpoint-backend/app/Http/Controllers/Api/AuthController.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;
}
}