공개 이슈(gnuboard/g7) 17건 전수 대조에서 "진짜 누락"으로 판정된 5건을 해소한다.
— 서버가 만들어 내보내는 상점 주소가 각 지점에서 `/shop` 리터럴이나
`"/{$routePath}/..."` 조립으로 흩어져 있었다. 기본값이 아닌 상점에서는 그 주소가
존재하지 않는 화면을 가리키는데, 서버는 문자열을 만들어 내려보냈을 뿐이라 예외도
404 로그도 남지 않는다 — 링크만 조용히 죽는다. `ShopPathResolver` 를 단일 해석
지점으로 두고 주문 완료 이동·비회원 조회 안내·알림 메일·통합검색·상품문의·SEO
캐시·사이트맵 전 지점을 경유시켰다. 같은 값에 종속된 PG 4종 리다이렉트는
`{shopBase}` 자리표시자로, 편집기 상태 scope 는 선택 세그먼트 토큰 `/*?`
(engine-v1.58.0)로 해소했다. 기설치본은 업그레이드 스텝이 백필한다.
M-02 — 답변 깊이 상한이 config 는 1~10 인데 컬럼 comment 만 1~5 로 남아,
comment 에서 자동 생성되는 계약 문서 4곳이 실제보다 좁은 상한을 공개하고 있었다.
L-01 — 관리자 게시글 폼에 첨부 안내가 아예 없었고, 대신 사장된 고정 문구
("최대 5개 파일, 각 10MB")가 남아 있었다. 게시판마다 다른 실제 설정값을 렌더한다.
— 목록 1페이지가 공지 전량을 상한 없이 읽던 것에 안전상한을 두고(구조 무변경,
limit 부가만), 조회수 정렬 목록 술어를 덮는 복합 색인을 신설했다.
브라우저 실측 검수에서 발견한 사전 결함 1건(사용자 게시판 목록이 URL 정렬
파라미터를 데이터소스로 전달하지 않던 문제)도 함께 고쳤다. 폴백을 빈 문자열로 둬
URL 에 정렬이 없을 때 게시판 설정을 덮어쓰지 않게 했다.
222 lines
7.3 KiB
PHP
222 lines
7.3 KiB
PHP
<?php
|
|
|
|
namespace App\Contracts\Repositories;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
use Illuminate\Support\Carbon;
|
|
|
|
interface UserRepositoryInterface
|
|
{
|
|
/**
|
|
* 이메일로 사용자를 찾습니다.
|
|
*
|
|
* @param string $email 찾을 사용자의 이메일
|
|
* @return User|null 찾은 사용자 모델 또는 null
|
|
*/
|
|
public function findByEmail(string $email): ?User;
|
|
|
|
/**
|
|
* 새로운 사용자를 생성합니다.
|
|
*
|
|
* @param array $data 사용자 생성 데이터
|
|
* @return User 생성된 사용자 모델
|
|
*/
|
|
public function create(array $data): User;
|
|
|
|
/**
|
|
* 기존 사용자를 업데이트합니다.
|
|
*
|
|
* @param User $user 업데이트할 사용자 모델
|
|
* @param array $data 업데이트할 데이터
|
|
* @return bool 업데이트 성공 여부
|
|
*/
|
|
public function update(User $user, array $data): bool;
|
|
|
|
/**
|
|
* 사용자를 삭제합니다.
|
|
*
|
|
* @param User $user 삭제할 사용자 모델
|
|
* @return bool 삭제 성공 여부
|
|
*/
|
|
public function delete(User $user): bool;
|
|
|
|
/**
|
|
* 모든 사용자를 조회합니다.
|
|
*
|
|
* @return Collection 사용자 컬렉션
|
|
*/
|
|
public function getAll(): Collection;
|
|
|
|
/**
|
|
* ID로 사용자를 찾습니다.
|
|
*
|
|
* @param int $id 사용자 ID
|
|
* @return User|null 찾은 사용자 모델 또는 null
|
|
*/
|
|
public function findById(int $id): ?User;
|
|
|
|
/**
|
|
* 필터링 및 페이지네이션이 적용된 사용자 목록을 조회합니다.
|
|
*
|
|
* @param array $filters 필터 조건 배열
|
|
* @return LengthAwarePaginator 페이지네이션된 사용자 목록
|
|
*/
|
|
public function getPaginatedUsers(array $filters = []): LengthAwarePaginator;
|
|
|
|
/**
|
|
* 사용자 관련 통계 정보를 조회합니다.
|
|
*
|
|
* @return array 사용자 통계 데이터 배열
|
|
*/
|
|
public function getStatistics(): array;
|
|
|
|
/**
|
|
* 키워드로 사용자를 검색합니다. (이름, 닉네임, 이메일)
|
|
*
|
|
* @param string $keyword 검색할 키워드
|
|
* @return Collection 검색된 사용자 컬렉션
|
|
*/
|
|
public function searchByKeyword(string $keyword): Collection;
|
|
|
|
/**
|
|
* 최근 등록된 사용자들을 조회합니다.
|
|
*
|
|
* @param int $limit 조회할 사용자 수 (기본값: 10)
|
|
* @return Collection 최근 사용자 컬렉션
|
|
*/
|
|
public function getRecentUsers(int $limit = 10): Collection;
|
|
|
|
/**
|
|
* 언어별 사용자 수를 조회합니다.
|
|
*
|
|
* @return array 언어별 사용자 수 배열
|
|
*/
|
|
public function getUsersByLanguage(): array;
|
|
|
|
/**
|
|
* UUID 목록으로 사용자들을 조회하고 UUID 키 맵으로 반환합니다.
|
|
*
|
|
* Bulk activity log 처리 시 N+1 회피용 단일 쿼리 진입점.
|
|
*
|
|
* @param array<int, string> $uuids 사용자 UUID 목록
|
|
* @return Collection<string, User> uuid => User 매핑
|
|
*/
|
|
public function findManyByUuidsKeyed(array $uuids): Collection;
|
|
|
|
/**
|
|
* UUID 목록으로 사용자들을 조회합니다.
|
|
*
|
|
* @param array<int, string> $uuids 사용자 UUID 목록
|
|
* @return Collection<int, User> 조회된 사용자 컬렉션
|
|
*/
|
|
public function findManyByUuids(array $uuids): Collection;
|
|
|
|
/**
|
|
* 슈퍼관리자 1명을 조회합니다.
|
|
*
|
|
* @return User|null 슈퍼관리자 또는 없으면 null
|
|
*/
|
|
public function findSuperAdmin(): ?User;
|
|
|
|
/**
|
|
* 특정 권한 identifier 를 가진 역할에 소속된 모든 사용자를 조회합니다.
|
|
*
|
|
* @param string $permissionIdentifier 권한 identifier
|
|
* @return Collection<int, User> 권한 보유 사용자 컬렉션
|
|
*/
|
|
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 으로 리셋합니다 (다음 잠금 윈도우 시작점). 잠금 해제 시각을 반환합니다.
|
|
*
|
|
* `$minutes <= 0` 은 보안 환경설정의 "0 = 무한대" 규약에 따라 영구 잠금으로 처리하며,
|
|
* 이때 `locked_until` 은 NULL, `locked_permanently` 는 true 가 되고 null 을 반환합니다.
|
|
*
|
|
* @param User $user 잠글 사용자
|
|
* @param int $minutes 잠금 유지 시간(분). 0 이하는 무기한
|
|
* @return Carbon|null 잠금 해제 시각 (영구 잠금은 null)
|
|
*/
|
|
public function lockAccount(User $user, int $minutes): ?Carbon;
|
|
|
|
/**
|
|
* 사용자의 모든 로그인 시도 추적 컬럼을 초기화합니다.
|
|
*
|
|
* 정상 로그인 성공 시 또는 관리자 수동 해제 시 호출됩니다
|
|
* (`failed_login_attempts=0`, `locked_until=null`, `locked_permanently=false`,
|
|
* `last_failed_login_at=null`).
|
|
*
|
|
* @param User $user 대상 사용자
|
|
*/
|
|
public function resetLoginAttempts(User $user): void;
|
|
|
|
/**
|
|
* 사용자의 계정이 현재 시점에 잠금 상태인지 판정합니다.
|
|
*
|
|
* `locked_permanently` 가 true 면 항상 true 입니다. 그 외에는 `locked_until` 이
|
|
* NULL 이거나 현재 시각보다 과거이면 false 를 반환합니다.
|
|
*
|
|
* @param User $user 대상 사용자
|
|
* @return bool 잠금 여부
|
|
*/
|
|
public function isLocked(User $user): bool;
|
|
|
|
/**
|
|
* UUID 로 사용자를 찾습니다.
|
|
*
|
|
* @param string $uuid 사용자 UUID
|
|
* @return User|null 찾은 사용자 모델 또는 null
|
|
*/
|
|
public function findByUuid(string $uuid): ?User;
|
|
|
|
/**
|
|
* UUID 목록에 해당하는 사용자의 정수 ID 배열을 반환합니다.
|
|
*
|
|
* @param array $uuids 사용자 UUID 배열
|
|
* @return array<int, int> 사용자 ID 배열
|
|
*/
|
|
public function getIdsByUuids(array $uuids): array;
|
|
|
|
/**
|
|
* 사용자 ID 목록에 해당하는 이름을 ID 로 색인해 반환합니다.
|
|
*
|
|
* 목록 화면이 작성자 이름을 행마다 조회하면 N+1 이 되므로, 표시에 필요한
|
|
* 이름만 한 번에 모아 오기 위한 배치 조회입니다.
|
|
*
|
|
* @param array $ids 사용자 ID 배열
|
|
* @return array<int, string> 사용자 ID => 이름
|
|
*/
|
|
public function getNamesByIds(array $ids): array;
|
|
|
|
/**
|
|
* 사용자 ID 목록의 지정 컬럼을 일괄 갱신합니다.
|
|
*
|
|
* @param array $ids 사용자 ID 배열
|
|
* @param array $data 갱신할 컬럼 값
|
|
* @return int 갱신된 행 수
|
|
*/
|
|
public function updateManyByIds(array $ids, array $data): int;
|
|
|
|
/**
|
|
* 사용자 ID 목록의 인증 토큰을 모두 삭제합니다.
|
|
*
|
|
* @param array $ids 사용자 ID 배열
|
|
* @return int 삭제된 토큰 수
|
|
*/
|
|
public function deleteTokensByUserIds(array $ids): int;
|
|
}
|