$uuids 사용자 UUID 목록 * @return Collection uuid => User 매핑 */ public function findManyByUuidsKeyed(array $uuids): Collection; /** * UUID 목록으로 사용자들을 조회합니다. * * @param array $uuids 사용자 UUID 목록 * @return Collection 조회된 사용자 컬렉션 */ public function findManyByUuids(array $uuids): Collection; /** * 슈퍼관리자 1명을 조회합니다. * * @return User|null 슈퍼관리자 또는 없으면 null */ public function findSuperAdmin(): ?User; /** * 특정 권한 identifier 를 가진 역할에 소속된 모든 사용자를 조회합니다. * * @param string $permissionIdentifier 권한 identifier * @return Collection 권한 보유 사용자 컬렉션 */ public function findManyByPermissionIdentifier(string $permissionIdentifier): Collection; /** * 사용자의 연속 로그인 실패 카운터를 1 증가시킵니다. * * `last_failed_login_at` 도 현재 시각으로 갱신하며 새 카운트를 반환합니다. * * @param User $user 대상 사용자 * @return int 증가 후 카운트 */ public function incrementFailedAttempts(User $user): int; /** * 사용자의 계정을 지정된 분만큼 잠급니다. * * `locked_until` 을 현재 시각 + $minutes 로 설정하고 `failed_login_attempts` 를 * 0 으로 리셋합니다 (다음 잠금 윈도우 시작점). 잠금 해제 시각을 반환합니다. * * @param User $user 잠글 사용자 * @param int $minutes 잠금 유지 시간(분) * @return Carbon 잠금 해제 시각 */ public function lockAccount(User $user, int $minutes): Carbon; /** * 사용자의 모든 로그인 시도 추적 컬럼을 초기화합니다. * * 정상 로그인 성공 시 호출됩니다 (`failed_login_attempts=0`, * `locked_until=null`, `last_failed_login_at=null`). * * @param User $user 대상 사용자 */ public function resetLoginAttempts(User $user): void; /** * 사용자의 계정이 현재 시점에 잠금 상태인지 판정합니다. * * `locked_until` 이 NULL 이거나 현재 시각보다 과거이면 false 를 반환합니다. * * @param User $user 대상 사용자 * @return bool 잠금 여부 */ public function isLocked(User $user): bool; }