유령 닉네임 복구 가능하게 수정 (마을 불러오기 실패 원인)

- 등록만 되고 세이브가 저장된 적 없는(data NULL) 닉네임은
  중복 체크에서 사용 가능으로, 재등록 시 새 토큰으로 재선점
- 불러오기 실패 시 "서버에 닿지 않아" 대신 "그 이름의 마을은 없는걸?"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
이 커밋은 다음에 포함됨:
kjs
2026-08-14 10:51:51 +09:00
co-authored by Claude Fable 5
부모 d5ce9be5f4
커밋 fc882c9dff
2개의 변경된 파일과 8개의 추가작업 그리고 5개의 파일을 삭제
+1 -1
파일 보기
@@ -78,7 +78,7 @@ export default function NicknameModal({ onDone }: { onDone: () => void }) {
} else {
const found = await recoverVillage(trimmed);
if (!found) {
setStatus("offline");
setStatus("available"); // 불러오기 모드에선 "그 이름의 마을은 없는걸?"
setSubmitting(false);
return;
}
+7 -4
파일 보기
@@ -24,9 +24,11 @@ export function validNickname(name: unknown): name is string {
export async function isAvailable(nickname: string): Promise<boolean> {
await ensureTable();
const r = await db.query("SELECT 1 FROM villages WHERE nickname = $1", [
nickname,
]);
// 데이터가 저장된 적 없는 유령 등록은 재사용 가능
const r = await db.query(
"SELECT 1 FROM villages WHERE nickname = $1 AND data IS NOT NULL",
[nickname],
);
return r.rowCount === 0;
}
@@ -36,7 +38,8 @@ export async function register(nickname: string, token: string): Promise<boolean
const r = await db.query(
`INSERT INTO villages (nickname, token, data)
VALUES ($1, $2, NULL)
ON CONFLICT (nickname) DO NOTHING`,
ON CONFLICT (nickname) DO UPDATE SET token = EXCLUDED.token, updated_at = now()
WHERE villages.data IS NULL`,
[nickname, token],
);
return (r.rowCount ?? 0) > 0;