json([ 'empty' => User::query()->count() === 0, ]); } public function register(Request $request) { $data = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users', 'email')], 'password' => ['required', 'string', 'min:8', 'confirmed'], ]); // Instalación nueva (sin usuarios todavía): el primero en registrarse // queda como admin, aprobado y logueado de una — no hay nadie más que // pueda aprobarlo. De ahí en más, todo registro vuelve a requerir // aprobación de un admin como siempre. $isFirstUser = User::query()->count() === 0; $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'is_active' => true, 'approved_at' => $isFirstUser ? now() : null, ]); if ($isFirstUser) { (new RolesAndPermissionsSeeder)->run(); $user->assignRole('admin'); Auth::login($user); $request->session()->regenerate(); $this->recordSessionLogin($request, $user); return response()->json([ 'bootstrap' => true, 'user' => $this->present($user), 'intended' => $request->session()->pull('url.intended'), ]); } $user->assignRole('user'); return response()->json([ 'pending' => true, 'message' => __('messages.registration_pending'), ], 201); } public function login(Request $request) { $credentials = $request->validate([ 'email' => ['required', 'string', 'email'], 'password' => ['required', 'string'], ]); if (! Auth::attempt($credentials, $request->boolean('remember'))) { throw ValidationException::withMessages([ 'email' => __('messages.invalid_credentials'), ]); } if (! Auth::user()->is_active) { Auth::logout(); throw ValidationException::withMessages([ 'email' => __('messages.account_deactivated'), ]); } if (Auth::user()->isPending()) { Auth::logout(); throw ValidationException::withMessages([ 'email' => __('messages.account_pending_approval'), ]); } $request->session()->regenerate(); $this->recordSessionLogin($request, Auth::user()); return response()->json([ 'user' => $this->present(Auth::user()), 'intended' => $request->session()->pull('url.intended'), ]); } public function logout(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return response()->noContent(); } public function me(Request $request) { return response()->json(['user' => $this->present($request->user())]); } private function recordSessionLogin(Request $request, User $user): void { LoginEvent::create([ 'user_id' => $user->id, 'client_id' => null, 'type' => 'session', 'ip_address' => $request->ip(), 'user_agent' => $request->userAgent(), 'created_at' => now(), ]); } private function present(User $user): array { return [ ...$user->toArray(), 'roles' => $user->getRoleNames(), 'permissions' => $user->getAllPermissions()->pluck('name'), ]; } }