119 lines
4.0 KiB
PHP
119 lines
4.0 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Api\Admin;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use App\Http\Requests\Auth\LoginRequest;
|
||
use App\Models\User;
|
||
use Illuminate\Http\JsonResponse;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Auth;
|
||
use OpenApi\Attributes as OA;
|
||
|
||
class AuthController extends Controller
|
||
{
|
||
#[OA\Post(
|
||
path: '/api/admin/login',
|
||
summary: 'Admin girişi',
|
||
description: 'E-posta ve şifre ile giriş yaparak Sanctum token alır.',
|
||
tags: ['Auth'],
|
||
requestBody: new OA\RequestBody(
|
||
required: true,
|
||
content: new OA\JsonContent(
|
||
required: ['email', 'password'],
|
||
properties: [
|
||
new OA\Property(property: 'email', type: 'string', format: 'email', example: 'admin@bogazicidenizcilik.com.tr'),
|
||
new OA\Property(property: 'password', type: 'string', format: 'password', example: 'password'),
|
||
],
|
||
),
|
||
),
|
||
responses: [
|
||
new OA\Response(response: 200, description: 'Başarılı giriş', content: new OA\JsonContent(
|
||
properties: [
|
||
new OA\Property(property: 'data', type: 'object', properties: [
|
||
new OA\Property(property: 'token', type: 'string'),
|
||
new OA\Property(property: 'user', type: 'object'),
|
||
]),
|
||
],
|
||
)),
|
||
new OA\Response(response: 401, description: 'Geçersiz kimlik bilgileri'),
|
||
new OA\Response(response: 422, description: 'Validasyon hatası'),
|
||
],
|
||
)]
|
||
public function login(LoginRequest $request): JsonResponse
|
||
{
|
||
if (! Auth::attempt($request->only('email', 'password'))) {
|
||
return response()->json([
|
||
'message' => 'Geçersiz e-posta veya şifre.',
|
||
], 401);
|
||
}
|
||
|
||
/** @var User $user */
|
||
$user = Auth::user();
|
||
|
||
$token = $user->createToken('admin-token')->plainTextToken;
|
||
|
||
return response()->json([
|
||
'data' => [
|
||
'token' => $token,
|
||
'user' => [
|
||
'id' => $user->id,
|
||
'name' => $user->name,
|
||
'email' => $user->email,
|
||
'roles' => $user->getRoleNames(),
|
||
'permissions' => $user->getAllPermissions()->pluck('name'),
|
||
],
|
||
],
|
||
]);
|
||
}
|
||
|
||
#[OA\Get(
|
||
path: '/api/admin/me',
|
||
summary: 'Mevcut kullanıcı bilgileri',
|
||
description: 'Oturum açmış kullanıcının bilgilerini, rollerini ve izinlerini döndürür.',
|
||
security: [['sanctum' => []]],
|
||
tags: ['Auth'],
|
||
responses: [
|
||
new OA\Response(response: 200, description: 'Kullanıcı bilgileri'),
|
||
new OA\Response(response: 401, description: 'Yetkisiz erişim'),
|
||
],
|
||
)]
|
||
public function me(Request $request): JsonResponse
|
||
{
|
||
/** @var User $user */
|
||
$user = $request->user();
|
||
|
||
return response()->json([
|
||
'data' => [
|
||
'id' => $user->id,
|
||
'name' => $user->name,
|
||
'email' => $user->email,
|
||
'roles' => $user->getRoleNames(),
|
||
'permissions' => $user->getAllPermissions()->pluck('name'),
|
||
],
|
||
]);
|
||
}
|
||
|
||
#[OA\Post(
|
||
path: '/api/admin/logout',
|
||
summary: 'Çıkış yap',
|
||
description: 'Mevcut token\'ı iptal eder.',
|
||
security: [['sanctum' => []]],
|
||
tags: ['Auth'],
|
||
responses: [
|
||
new OA\Response(response: 200, description: 'Başarıyla çıkış yapıldı'),
|
||
new OA\Response(response: 401, description: 'Yetkisiz erişim'),
|
||
],
|
||
)]
|
||
public function logout(Request $request): JsonResponse
|
||
{
|
||
/** @var User $user */
|
||
$user = $request->user();
|
||
$user->currentAccessToken()->delete();
|
||
|
||
return response()->json([
|
||
'message' => 'Başarıyla çıkış yapıldı.',
|
||
]);
|
||
}
|
||
}
|