Skip to content

feat: 노출 식별자를 UUID로 전환 - #28

Merged
yessjun merged 13 commits into
mainfrom
feat/uuid-identifiers
Aug 10, 2026
Merged

feat: 노출 식별자를 UUID로 전환#28
yessjun merged 13 commits into
mainfrom
feat/uuid-identifiers

Conversation

@yessjun

@yessjun yessjun commented Aug 10, 2026

Copy link
Copy Markdown
Member

📝 작업내용

  • 생성 타입을 다시 뽑아 식별자를 문자열로 받는다, 컴파일러가 대부분의 호출부를 이끌었다
  • 타입이 잡아 주지 않는 자리를 목록대로 훑었다, 강제 변환 여덟 곳·범위 판별 정규식·대시보드 조인의 양변·드롭다운 값
  • 라벨이 식별자를 그대로 찍던 자리를 화면 이름과 대체 문구로 바꿨다, 별도 커밋
  • 목록 모의의 숫자 키를 문자열 식별자로 옮겼다, 조회가 빗나가는데도 컴파일되던 자리다
  • 기관 슬러그 소비처 제거

⭐️ 검증

  • console verify.sh 통과, 테스트 502건
  • 수정을 되돌려 실제로 실패하는지 확인한 것 세 가지, 범위 정규식·대시보드 조인·지표 모의 쌍
  • 조인은 예상한 증상 그대로 실패했다, 도달 불가 노드가 장애로 분류되어 타일이 붉어진다

💬 리뷰 포인트

  • 중간 커밋은 각각 초록이 아니다, 식별자가 경계를 한꺼번에 넘으므로 재생성과 마지막 호출부 사이에는 트리가 빌드되지 않는다
  • 필수에서 빠진 응답 필드 아홉 개는 화면 결정이었다, 예를 들어 워크스페이스가 사라진 VM에는 그 목록으로 가는 버튼을 그리지 않는다

yessjun added 13 commits August 11, 2026 03:15
The scope segment was matched with /^\\d+$/ and parsed with Number(), so a
UUID scope fell through as no scope at all: /console/<uuid>/vms rendered the
unscoped list with no error. Both now test the UUID shape, which a section
name can never look like.
Every identifier crossing the API boundary is a UUID in contract v0.38.0.
The 92 id-typed parameters here become strings; page, size and the day
counts stay numbers.
Number(params.vmId) on a UUID is NaN, which TypeScript still calls a number:
the query fired with NaN and the page rendered blank rather than failing.
Each page now passes the segment through and guards its shape, so a
malformed address says so instead of showing an empty screen.
A <select> value is always a string, so Number(event.target.value) on a UUID
gave NaN. In the capacity trend that NaN serialized to null in the query key
and collided with the all-orgs cache entry.
orgs.slug is gone from contract v0.38.0, along with the ORG_SLUG_DUPLICATE
error code. The org is identified by its UUID now.
The stored wizard draft was restored with a bare spread, so a draft written
while ids were numbers would put numbers straight into the POST body. The
shape is checked on load now and an incompatible draft is dropped whole.
Row selection, cross-page filter links and the approve form all held ids as
numbers. The approve form's node field becomes a UUID input, and the node
and image labels drop the '#id' suffix that a UUID makes unreadable.
Labels built as "신청 #$id" or "VM #$id" read as a short number a person
could quote. A UUID tells the reader nothing, so the headings name the
screen and the name fallbacks say the row is unknown.
Fixtures cross-reference each other by id, so uuid(n) maps the old integers
onto UUIDs and keeps every reference intact; the padding also keeps the
"newest first" sorts in their old order. The metrics handler's two magic VMs
become named constants shared with the tests that assert what they produce.

Numeric object keys were the quiet failure here: Record<string, T> accepts
them, so the access-grant and event stores kept compiling while every lookup
missed.
The scope regex fails silently: a URL that is read as unscoped still renders
a page, so these assert the built path rather than what appears on screen.
The membership row was the last identifier the api still sent as the internal
bigint; it is a UUID now, so the fixtures and the cross-link test that had to
work around it go back to the normal shape.
@yessjun
yessjun merged commit 7c0a54a into main Aug 10, 2026
1 check passed
@yessjun
yessjun deleted the feat/uuid-identifiers branch August 10, 2026 19:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant