160 lines
8.0 KiB
SQL
160 lines
8.0 KiB
SQL
-- =============================================================================
|
|
-- bibimbap dev seed — 리뷰/댓글(W3-2) 기능 테스트용 더미 상황
|
|
-- =============================================================================
|
|
-- 목적: 새로 추가된 게임 리뷰/댓글 기능을 실제로 테스트할 수 있는 더미 데이터.
|
|
-- 1) 로그인 가능한 테스트 계정 1개 (직접 로그인 → 리뷰/댓글 작성 테스트용)
|
|
-- 2) 표시되는 더미 게임 1개 (테스트 계정 소유)
|
|
-- 3) 이미 등록된 더미 리뷰 5개 (각자 다른 더미 유저 — game당 user 1리뷰 제약 때문)
|
|
-- + 보너스: 더미 댓글 3개
|
|
--
|
|
-- 멱등(idempotent): 같은 이메일/게임명 기준 NOT EXISTS 가드 → 재실행해도 중복 미생성.
|
|
--
|
|
-- 적용 (가동중인 컨테이너):
|
|
-- docker exec -i bibimbap-db psql -U bibimbap -d bibimbap -v ON_ERROR_STOP=1 < db/seed-dev.sql
|
|
-- 적용 (호스트 psql, 포트 5433):
|
|
-- PGPASSWORD=change_me_local_dev psql -h localhost -p 5433 -U bibimbap -d bibimbap -f db/seed-dev.sql
|
|
--
|
|
-- 로그인 자격: tester@bibimbap.local / test1234! (provider='email')
|
|
-- password_hash 는 UserController.hashPassword 와 동일 알고리즘으로 사전 생성:
|
|
-- PBKDF2WithHmacSHA256 / 210000 iter / 256-bit key / 16-byte salt,
|
|
-- 포맷 = pbkdf2_sha256$<iter>$<base64 salt>$<base64 hash>.
|
|
--
|
|
-- 되돌리기 (이 더미만 정리): db/seed-dev-teardown.sql 참고.
|
|
-- =============================================================================
|
|
|
|
SET search_path TO dev;
|
|
|
|
DO $$
|
|
DECLARE
|
|
v_tester_id bigint;
|
|
v_game_id bigint;
|
|
v_uid bigint;
|
|
-- test1234! 의 사전 생성 해시 (위 알고리즘과 동일).
|
|
c_pw_hash text := 'pbkdf2_sha256$210000$QJ5MV+dx3aECELuuh3ibIA==$/59CO6JWXXGXWW0hzqpnZwu89qirDozP0jlq3JzEwZw=';
|
|
r RECORD;
|
|
BEGIN
|
|
-- -------------------------------------------------------------------------
|
|
-- 1) 로그인 테스트 계정 (users + email identity)
|
|
-- -------------------------------------------------------------------------
|
|
SELECT id INTO v_tester_id
|
|
FROM users
|
|
WHERE canonical_email = 'tester@bibimbap.local' AND is_delete IS NOT TRUE
|
|
LIMIT 1;
|
|
|
|
IF v_tester_id IS NULL THEN
|
|
INSERT INTO users (display_name, canonical_email, role, status)
|
|
VALUES ('테스터', 'tester@bibimbap.local', 'USER', 'ACTIVE')
|
|
RETURNING id INTO v_tester_id;
|
|
END IF;
|
|
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM user_auth_identities
|
|
WHERE provider = 'email' AND provider_user_id = 'tester@bibimbap.local'
|
|
AND is_delete IS NOT TRUE
|
|
) THEN
|
|
INSERT INTO user_auth_identities
|
|
(user_id, provider, provider_user_id, email, password_hash, display_name)
|
|
VALUES
|
|
(v_tester_id, 'email', 'tester@bibimbap.local', 'tester@bibimbap.local', c_pw_hash, '테스터');
|
|
END IF;
|
|
|
|
-- -------------------------------------------------------------------------
|
|
-- 2) 더미 게임 (테스트 계정 소유, 목록/상세에 표시되도록 visible)
|
|
-- webgl_path / thumbnail_url 은 NULL — game-detail.jsp 가 빈 src 로 안전 처리.
|
|
-- -------------------------------------------------------------------------
|
|
SELECT id INTO v_game_id
|
|
FROM games
|
|
WHERE name = '테스트 게임 (더미)' AND is_delete IS NOT TRUE
|
|
LIMIT 1;
|
|
|
|
IF v_game_id IS NULL THEN
|
|
INSERT INTO games (user_id, name, creator_note, is_visible, sort_order)
|
|
VALUES (
|
|
v_tester_id,
|
|
'테스트 게임 (더미)',
|
|
'리뷰/댓글 기능 테스트용 더미 게임입니다. 자유롭게 리뷰와 댓글을 남겨보세요.',
|
|
true,
|
|
(SELECT COALESCE(MAX(sort_order), 0) + 1 FROM games WHERE is_delete IS NOT TRUE)
|
|
)
|
|
RETURNING id INTO v_game_id;
|
|
END IF;
|
|
|
|
-- -------------------------------------------------------------------------
|
|
-- 3) 더미 리뷰어 5명 + 각자 리뷰 1건 (game당 user 1리뷰 unique 제약 충족)
|
|
-- created_at 을 days_ago 만큼 과거로 스태거 → 목록(최신순) 정렬이 자연스럽게.
|
|
-- -------------------------------------------------------------------------
|
|
FOR r IN
|
|
SELECT * FROM (VALUES
|
|
('김플레이', 'reviewer1@bibimbap.local', 5, '그래픽이 깔끔하고 조작감이 좋아요. 가볍게 즐기기 딱 좋습니다. 추천!', 5),
|
|
('이도전', 'reviewer2@bibimbap.local', 4, '아이디어가 신선했습니다. 난이도 밸런스만 조금 더 다듬으면 완벽할 듯해요.', 4),
|
|
('박캐주얼', 'reviewer3@bibimbap.local', 3, '무난하게 즐길 만한 게임. 다만 후반부가 살짝 반복적으로 느껴졌어요.', 3),
|
|
('최열정', 'reviewer4@bibimbap.local', 5, '시간 가는 줄 모르고 플레이했네요. BGM이 특히 인상적이었습니다!', 2),
|
|
('정라이트', 'reviewer5@bibimbap.local', 2, '초반 튜토리얼이 불친절해서 적응이 조금 어려웠어요. 보완되면 좋겠습니다.', 1)
|
|
) AS t(nickname, email, rating, body, days_ago)
|
|
LOOP
|
|
SELECT id INTO v_uid
|
|
FROM users
|
|
WHERE canonical_email = r.email AND is_delete IS NOT TRUE
|
|
LIMIT 1;
|
|
|
|
IF v_uid IS NULL THEN
|
|
INSERT INTO users (display_name, canonical_email, role, status)
|
|
VALUES (r.nickname, r.email, 'USER', 'ACTIVE')
|
|
RETURNING id INTO v_uid;
|
|
END IF;
|
|
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM game_reviews
|
|
WHERE game_id = v_game_id AND user_id = v_uid AND is_delete IS NOT TRUE
|
|
) THEN
|
|
INSERT INTO game_reviews (game_id, user_id, rating, body, created_at, updated_at)
|
|
VALUES (
|
|
v_game_id, v_uid, r.rating, r.body,
|
|
now() - make_interval(days => r.days_ago),
|
|
now() - make_interval(days => r.days_ago)
|
|
);
|
|
END IF;
|
|
END LOOP;
|
|
|
|
-- -------------------------------------------------------------------------
|
|
-- 보너스) 더미 댓글 3건 (리뷰어 유저 귀속, created_at ASC 정렬용 스태거)
|
|
-- -------------------------------------------------------------------------
|
|
FOR r IN
|
|
SELECT * FROM (VALUES
|
|
('reviewer1@bibimbap.local', '오 이거 재밌네요 ㅎㅎ', 3),
|
|
('reviewer3@bibimbap.local', '다음 업데이트도 기대할게요!', 2),
|
|
('reviewer5@bibimbap.local', '버그 제보: 가끔 화면이 멈춰요.', 1)
|
|
) AS t(email, content, days_ago)
|
|
LOOP
|
|
SELECT id INTO v_uid
|
|
FROM users
|
|
WHERE canonical_email = r.email AND is_delete IS NOT TRUE
|
|
LIMIT 1;
|
|
|
|
IF v_uid IS NOT NULL AND NOT EXISTS (
|
|
SELECT 1 FROM game_comments
|
|
WHERE game_id = v_game_id AND user_id = v_uid AND content = r.content
|
|
AND is_delete IS NOT TRUE
|
|
) THEN
|
|
INSERT INTO game_comments (game_id, user_id, nickname, content, created_at)
|
|
VALUES (
|
|
v_game_id, v_uid,
|
|
(SELECT display_name FROM users WHERE id = v_uid),
|
|
r.content,
|
|
now() - make_interval(days => r.days_ago)
|
|
);
|
|
END IF;
|
|
END LOOP;
|
|
|
|
RAISE NOTICE 'seed-dev 완료: tester_id=%, game_id=%', v_tester_id, v_game_id;
|
|
END $$;
|
|
|
|
-- 적용 결과 확인용 요약 (psql 실행 시 출력).
|
|
SELECT
|
|
(SELECT count(*) FROM users WHERE canonical_email LIKE '%@bibimbap.local' AND is_delete IS NOT TRUE) AS dummy_users,
|
|
(SELECT count(*) FROM games WHERE name = '테스트 게임 (더미)' AND is_delete IS NOT TRUE) AS dummy_games,
|
|
(SELECT count(*) FROM game_reviews r JOIN games g ON g.id = r.game_id
|
|
WHERE g.name = '테스트 게임 (더미)' AND r.is_delete IS NOT TRUE) AS dummy_reviews,
|
|
(SELECT count(*) FROM game_comments c JOIN games g ON g.id = c.game_id
|
|
WHERE g.name = '테스트 게임 (더미)' AND c.is_delete IS NOT TRUE) AS dummy_comments;
|