api/app/Http/Controllers/AuthController.php

96 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\Auth\LoginRequest;
use App\Http\Requests\Auth\RegisterRequest;
use App\Models\User;
use Hash;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpFoundation\Response;
class AuthController extends Controller
{
public function register(RegisterRequest $request): JsonResponse
{
$data = $request->validated();
$avatarUri = null;
if ($request->hasFile('avatar')) {
$filename = \Illuminate\Support\Str::uuid() . '.jpg';
$path = $request->file('avatar')->storeAs('avatars', $filename, 'public');
$avatarUri = url('storage/' . $path);
}
$user = User::create([
'username' => $data['username'],
'email' => $data['email'],
'password' => $data['password'],
'avatarUri' => $avatarUri,
]);
$token = $user->createToken(
$this->resolveDeviceName($data)
)->plainTextToken;
return response()->json([
'token' => $token,
'token_type' => 'Bearer',
], Response::HTTP_CREATED);
}
public function login(LoginRequest $request): JsonResponse
{
$data = $request->validated();
$user = User::where('email', $data['email'])->first();
if (! $user || ! Hash::check($data['password'], $user->password)) {
throw ValidationException::withMessages([
'email' => [__('auth.failed')],
]);
}
$token = $user->createToken(
$this->resolveDeviceName($data)
)->plainTextToken;
return response()->json([
'token' => $token,
'token_type' => 'Bearer',
'user' => $user,
]);
}
public function me(Request $request): JsonResponse
{
return response()->json($request->user());
}
public function logout(Request $request): JsonResponse
{
$request->user()?->currentAccessToken()?->delete();
return response()->json([
'message' => __('auth.logout_success'),
]);
}
/**
* Determine the token name to use for the access token.
*
* @param array<string, mixed> $data
*/
private function resolveDeviceName(array $data): string
{
$deviceName = trim((string) ($data['device_name'] ?? ''));
return $deviceName !== '' ? $deviceName : 'api-token';
}
}