목표
listView 행의 만료 배지를 3일 / 7일 2단계로 분리하고, 현재 세 곳에 흩어진 만료 임계값을 도메인 타입 하나로 통합한다.
현재 문제
만료 관련 임계값이 세 군데에 각각 존재한다.
| 위치 |
값 |
용도 |
SecretQuery.Collection.expiringSoonWindowDays (DVDomain) |
30일 |
Expired 탭 쿼리 범위 |
SecretListView.expiringSoonThreshold |
3일 |
행 배지 아이콘 |
ExpiryBucket.contains (SecretListView.swift:309-320) |
7일 / 30일 리터럴 |
Expired 탭 섹션 분할 |
결과적으로 조용히 깨지는 구조다. 도메인의 30일을 60일로 바꾸면 쿼리는 60일치를 가져오지만 ExpiryBucket은 30일까지만 분류하므로, 나머지 30일치가 화면에서 사라진다. ExpiryBucket은 private enum이라 테스트도 불가능하다.
여기에 3/7일 배지를 그냥 추가하면 임계값 사본이 네 개가 된다.
작업 범위
신규 — DVDomain
수정 — DVPresentation
참고
- 아이콘 종류·색은 계속 뷰가 결정한다. 도메인은 "어느 단계인가"만 판단하고, 경계값 정합성을 테스트로 보장하는 것이 목적
- 3일/7일 배지는 색만으로 구분하지 않도록 아이콘 형태도 달라야 한다 (색각 이상 대응)
목표
listView 행의 만료 배지를 3일 / 7일 2단계로 분리하고, 현재 세 곳에 흩어진 만료 임계값을 도메인 타입 하나로 통합한다.
현재 문제
만료 관련 임계값이 세 군데에 각각 존재한다.
SecretQuery.Collection.expiringSoonWindowDays(DVDomain)SecretListView.expiringSoonThresholdExpiryBucket.contains(SecretListView.swift:309-320)결과적으로 조용히 깨지는 구조다. 도메인의 30일을 60일로 바꾸면 쿼리는 60일치를 가져오지만
ExpiryBucket은 30일까지만 분류하므로, 나머지 30일치가 화면에서 사라진다.ExpiryBucket은private enum이라 테스트도 불가능하다.여기에 3/7일 배지를 그냥 추가하면 임계값 사본이 네 개가 된다.
작업 범위
신규 — DVDomain
SecretExpiryStage타입 추가 (네이밍 논의 필요)stage(of:referenceDate:)—expiresAt이 nil이면.noneexpiringSoonWindowDays(30일)도 여기로 흡수수정 — DVPresentation
DVVaultContainer.TrailingIcon에 3일/7일 구분 케이스 추가SecretListView.trailingIcon(for:)이SecretExpiryStage를 아이콘·색으로 번역만 하도록 변경SecretListView.expiringSoonThreshold제거ExpiryBucket을SecretExpiryStage기반으로 재작성 (7일/30일 리터럴 제거)SecretQuery.Collection.expiringWindow(from:)이 새 상수를 참조하도록 정리참고