버그 설명
GET /shares?status=ACTIVE 가 status 컬럼만 필터하고 expires_at 을 보지 않는다. 만료된 공유가 "활성" 으로 조회된다.
도메인 모델에는 이미 status == ACTIVE && !isExpired(now) 판정이 있는데(src/main/java/com/heddy/domain/sharing/model/Share.java) 목록 조회 경로가 이를 쓰지 않는다. 공개 조회(GET /public/shares/{shareToken}) 는 만료를 검사하므로, 목록에는 살아있는 것처럼 보이지만 실제로 열면 실패하는 링크가 생긴다.
재현 방법
- 공유를 하나 만든다
- DB 에서 해당 행의
expires_at 을 과거 시각으로 바꾼다 (status 는 ACTIVE 유지)
GET /shares?status=ACTIVE 를 호출한다
예상 동작
만료된 공유는 status=ACTIVE 필터 결과에서 빠진다.
실제 동작
만료된 공유가 결과에 포함된다.
환경 정보
로그 및 에러 메시지
없음
추가 정보
ShareStatus 는 ACTIVE / REVOKED 둘뿐이고 만료는 상태가 아니라 expires_at 비교로 판정하는 것이 설계 의도다. 따라서 만료 시 상태를 바꾸는 배치를 두는 대신, 조회 시점에 expires_at > now 조건을 함께 거는 방향으로 고친다.
응답의 status 필드는 저장된 값을 그대로 내려주므로 계약 변경은 없다. 필터 결과 집합만 좁아진다.
버그 설명
GET /shares?status=ACTIVE가status컬럼만 필터하고expires_at을 보지 않는다. 만료된 공유가 "활성" 으로 조회된다.도메인 모델에는 이미
status == ACTIVE && !isExpired(now)판정이 있는데(src/main/java/com/heddy/domain/sharing/model/Share.java) 목록 조회 경로가 이를 쓰지 않는다. 공개 조회(GET /public/shares/{shareToken}) 는 만료를 검사하므로, 목록에는 살아있는 것처럼 보이지만 실제로 열면 실패하는 링크가 생긴다.재현 방법
expires_at을 과거 시각으로 바꾼다 (status는ACTIVE유지)GET /shares?status=ACTIVE를 호출한다예상 동작
만료된 공유는
status=ACTIVE필터 결과에서 빠진다.실제 동작
만료된 공유가 결과에 포함된다.
환경 정보
develop로그 및 에러 메시지
없음
추가 정보
ShareStatus는ACTIVE/REVOKED둘뿐이고 만료는 상태가 아니라expires_at비교로 판정하는 것이 설계 의도다. 따라서 만료 시 상태를 바꾸는 배치를 두는 대신, 조회 시점에expires_at > now조건을 함께 거는 방향으로 고친다.응답의
status필드는 저장된 값을 그대로 내려주므로 계약 변경은 없다. 필터 결과 집합만 좁아진다.