사용자 화면 문구·표본 데이터 · 퀘스트 참여 흐름 · HOME 진입 구획 · 미니맵 · 공통 확인 창 배치 수정
This commit is contained in:
@@ -26,6 +26,12 @@ service cloud.firestore {
|
||||
|
||||
// ───────────────────────── 공통 헬퍼 ─────────────────────────
|
||||
function signedIn() { return request.auth != null; }
|
||||
|
||||
// `{questId}_{uid}` 꼴 문서 ID 가 호출자 본인 것인가(뒤가 `_` + uid).
|
||||
function isOwnSubmissionId(id) {
|
||||
let tail = '_' + request.auth.uid;
|
||||
return id.size() > tail.size() && id[id.size() - tail.size():id.size()] == tail;
|
||||
}
|
||||
function isSelf(u) { return signedIn() && request.auth.uid == u; }
|
||||
function role() { return signedIn() ? request.auth.token.get('role', '') : ''; }
|
||||
function isViewer() { return role() == 'master' || role() == 'ops' || role() == 'viewer'; }
|
||||
@@ -489,6 +495,10 @@ service cloud.firestore {
|
||||
allow read: if signedIn() && (resource.data.uid == request.auth.uid
|
||||
|| resource.data.questAuthorUid == request.auth.uid
|
||||
|| isOps());
|
||||
// 자기 제출 건은 문서 ID(`{questId}_{uid}` — fn-quest-submit)로 **없어도** 조회한다.
|
||||
// 없는 문서는 resource 가 null 이라 위 조건이 거부되고, 앱의 퀘스트 목록이 UGC 퀘스트
|
||||
// 하나 때문에 통째로 실패했다(2026-10-04 실기기).
|
||||
allow get: if signedIn() && isOwnSubmissionId(submissionId);
|
||||
allow write: if false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1697,6 +1697,17 @@ describe('사용자 생성 Quest — 제출 · 검토 · 수정 이력 (C-07 ·
|
||||
where('questId', '==', 'q-ugc'), where('questAuthorUid', '==', 'creator'))));
|
||||
});
|
||||
|
||||
test('아직 없는 자기 제출 건도 문서 ID 로 조회한다 — 목록이 UGC 퀘스트 하나로 막히지 않게', async () => {
|
||||
// 2026-10-04 실기기 — 없는 문서 get 이 permission-denied 로 떨어져 퀘스트 목록 전체가 실패했다.
|
||||
await assertSucceeds(getDoc(doc(dbFor('bob'), 'questSubmissions/q-ugc_bob')));
|
||||
// 남의 제출 건 ID 로는 여전히 못 읽는다(있든 없든).
|
||||
await assertFails(getDoc(doc(dbFor('bob'), 'questSubmissions/q-ugc_alice')));
|
||||
await assertFails(getDoc(doc(dbFor('bob'), 'questSubmissions/q-new_alice')));
|
||||
// 접미만 같은 ID(`_bob` 없이 `bob`) 는 본인 것이 아니다.
|
||||
await assertFails(getDoc(doc(dbFor('bob'), 'questSubmissions/q-ugcbob')));
|
||||
await assertFails(getDoc(doc(anonymousDb(), 'questSubmissions/q-ugc_bob')));
|
||||
});
|
||||
|
||||
test('제출 건 상태 · 예약은 앱이 쓰지 못한다 — 자기 승인 · 위조 제출 거부', async () => {
|
||||
await assertFails(updateDoc(doc(dbFor('alice'), 'questSubmissions/q-ugc_alice'), { status: 'paid' }));
|
||||
await assertFails(updateDoc(doc(dbFor('creator'), 'questSubmissions/q-ugc_alice'), { status: 'approved' }));
|
||||
|
||||
Reference in New Issue
Block a user