feat: 찰떡지수 피드백 기능 (우리/동네 궁합도)
CI / build (push) Failing after 12m43s
Deploy (dev) / deploy (push) Failing after 15m28s

산책 후 피드백으로 강아지 궁합도(찰떡지수)를 누적한다.
- 체크아웃/2시간 알림 → 피드백(잘 놀았어요/안 맞았어요)
- 우리 찰떡지수(1:1): GOOD +1 / BAD -2, 매칭 이력 쌍만, 유료회원 노출
- 동네 찰떡지수(1:N): GOOD +0.5 / BAD -1, 전체 노출 (0 미만 불가)
- 안 맞았어요 사유 수집 → AI 추천에 pastAffinity/neighborhood 반영
- 2시간 미피드백 시 피드백 요청 알림(FEEDBACK_REQUEST) 스케줄러

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
sb
2026-07-11 23:54:39 +09:00
parent 20bfdd7576
commit 2898ac154c
17 changed files with 554 additions and 1 deletions
@@ -0,0 +1,34 @@
-- 산책 후 피드백 + 찰떡지수(호감도)
-- 1:1 우리 찰떡지수 — 강아지 쌍(정렬: dog_a_id < dog_b_id 로 1행/쌍)
CREATE TABLE dog_affinity (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
dog_a_id BIGINT NOT NULL REFERENCES dogs(id) ON DELETE CASCADE,
dog_b_id BIGINT NOT NULL REFERENCES dogs(id) ON DELETE CASCADE,
score DOUBLE PRECISION NOT NULL DEFAULT 0,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CONSTRAINT uq_dog_affinity UNIQUE (dog_a_id, dog_b_id)
);
-- 1:N 동네 찰떡지수 — 강아지별 누적
CREATE TABLE dog_neighborhood (
dog_id BIGINT PRIMARY KEY REFERENCES dogs(id) ON DELETE CASCADE,
score DOUBLE PRECISION NOT NULL DEFAULT 0,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- 매칭 산책 후 피드백 (매칭당 평가자 1회)
CREATE TABLE match_feedback (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
match_id BIGINT NOT NULL REFERENCES matching_requests(id) ON DELETE CASCADE,
rater_dog_id BIGINT NOT NULL REFERENCES dogs(id) ON DELETE CASCADE,
rated_dog_id BIGINT NOT NULL REFERENCES dogs(id) ON DELETE CASCADE,
verdict VARCHAR(10) NOT NULL CHECK (verdict IN ('GOOD', 'BAD')),
reasons VARCHAR(500),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CONSTRAINT uq_match_feedback UNIQUE (match_id, rater_dog_id)
);
CREATE INDEX idx_feedback_rated ON match_feedback(rated_dog_id);
-- 2시간 후 피드백 알림 1회 발송 표시
ALTER TABLE matching_requests ADD COLUMN feedback_notified BOOLEAN NOT NULL DEFAULT FALSE;