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; } }