Referrals::TrackingService + RewardService TDD 구현
ID: 5c24e78c-59fd-4e70-8b97-29afff655adc
## 작업 내용
### 1. Referrals::TrackingService (`app/services/referrals/tracking_service.rb`)
신규 가입 시 referral_code로 Referral(pending) 생성.
```ruby
module Referrals
class TrackingService
def self.call(referee:, referral_code:)
# 1. referral_code로 referrer 찾기
# 2. 자기 자신 추천 방지 (referrer == referee → skip)
# 3. referee에 이미 referral 있으면 무시
# 4. Referral.create!(referrer:, referee:, status: "pending")
end
end
end
```
### 2. Referrals::RewardService (`app/services/referrals/reward_service.rb`)
강점 진단 완료 시 리퍼럴 보상 지급.
```ruby
module Referrals
class RewardService
def self.call(diagnosis_session:)
# 1. diagnosis_session.user의 pending referral 확인
# 2. 진단이 strength 카테고리인지 확인 (strength가 아니면 skip)
# 3. referrer의 월간 보상 카운트 확인 (>= 10이면 skip)
# 4. referral.update!(status: "rewarded", rewarded_at: Time.current, diagnosis_session:)
# 5. referrer의 credit.add_diagnosis!(1, description: "추천 보상 (#{referee.name})")
end
end
end
```
### 3. TDD
**test/services/referrals/tracking_service_test.rb**:
- 정상: referral_code로 Referral(pending) 생성
- 자기 추천: referrer == referee → Referral 생성 안 함
- 이미 추천인 있음: referee에 referral 존재 → 무시
- 잘못된 코드: 존재하지 않는 referral_code → 무시
- nil 파라미터 처리
**test/services/referrals/reward_service_test.rb**:
- 정상: strength 진단 완료 → referrer diagnosis_balance +1, status=rewarded
- strength 아닌 진단: big5 완료 → 보상 안 함
- 월 10개 초과: 11번째 → 보상 안 함
- pending referral 없음: → 아무것도 안 함
- 이미 rewarded: → 중복 보상 안 함
- referrer 크레딧 없음: ensure_credit! 후 +1
## 완료 기준
- TrackingService: 정상 생성, 자기추천 방지, 중복 방지
- RewardService: 보상 지급, 월 10개 상한, 중복 방지
- 모든 테스트 통과
첨부 이미지
이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)
JPEG, PNG, GIF, WebP / 최대 10MB
활동 로그
-
팀팀리드 상태 변경: 리뷰 → 완료
2026년 03월 26일 06:35:48
-
팀팀리드 상태 변경: 할 일 → 리뷰
2026년 03월 26일 05:45:22