/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/Http/Controllers/TokenController.php
111 строк
4 KB
vivanenko
tg register
29 май 2025, 19:11
29 май 2025, 19:11
94c4ab4
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use App\DTOs\Auth\TokenLoginData; use App\DTOs\Auth\TokenRegisterData; use App\Http\Requests\Token\LoginTokenRequest; use App\Http\Requests\Token\RegisterTokenRequest; use App\Services\Auth\TokenService; use App\Services\TelegramService; use App\Models\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Log; use Symfony\Component\HttpFoundation\Response as ResponseAlias; class TokenController extends Controller { public function __construct( private readonly TokenService $tokenService, private readonly TelegramService $telegramService, ) { } /** * Метод для регистрации пользователя<br> * <strong>Он сразу возвращает токен</strong> * @param RegisterTokenRequest $request * @return JsonResponse */ public function register(RegisterTokenRequest $request): JsonResponse { $data = TokenRegisterData::fromArray($request->validated()); $token = $this->tokenService->register($data); return response()->json(['token' => $token]) ->setStatusCode(ResponseAlias::HTTP_CREATED); } /** * Login a user and return their access token */ public function login(LoginTokenRequest $request): JsonResponse { $data = TokenLoginData::fromArray($request->validated()); $token = $this->tokenService->login($data); return response()->json(['token' => $token]) ->setStatusCode(ResponseAlias::HTTP_OK); } /** * Login via Telegram Widget */ public function telegramLogin(Request $request): JsonResponse { try { // Validate Telegram authorization data if (!$this->telegramService->validateTelegramAuthorization($request->all())) { return response()->json([ 'message' => 'Invalid Telegram authorization' ], 401); } // Find user by telegram_id $telegramId = $request->get('id'); $user = User::where('telegram_id', $telegramId)->first(); if (!$user) { // If user doesn't exist, create a new one $user = new User(); $user->name = $request->get('first_name') . ' ' . ($request->get('last_name') ?? ''); $user->email = $telegramId . '@telegram.local'; // Temporary email $user->telegram_id = $telegramId; $user->telegram_username = $request->get('username'); $user->password = Hash::make(uniqid()); // Random password $user->save(); Log::info('New user created via Telegram', ['telegram_id' => $telegramId, 'user_id' => $user->id]); } // Create token $token = $user->createToken($user->email)->plainTextToken; return response()->json([ 'token' => $token, 'user' => $user ])->setStatusCode(ResponseAlias::HTTP_OK); } catch (\Exception $e) { Log::error('Telegram login failed', ['error' => $e->getMessage()]); return response()->json([ 'message' => 'Telegram login failed', 'error' => $e->getMessage() ], 500); } } /** * Logout user and invalidate their tokens */ public function logout(Request $request): JsonResponse { $user = $request->user(); $this->tokenService->logout($user); return response()->json(['message' => 'Successfully logged out']) ->setStatusCode(ResponseAlias::HTTP_OK); } }