πŸ“– star365 Docs
← λ³΄κ³ μ„œ λͺ©λ‘

Medical Visit QR Signup Sprint β€” 2026-05-09

μš”μ•½

의료 λ³ΈλΆ€ issue dc644f93 (μ§„λ£Œμ™„λ£Œ β†’ star365 κ°€μž… + 5,000P) Phase 1 MVP κ΅¬ν˜„ μ™„λ£Œ. QR μ½”λ“œ 방식 μ±„νƒμœΌλ‘œ 카카였 μ•Œλ¦Όν†‘/SMS μ™ΈλΆ€ λŒ€ν–‰μ‚¬ 의쑴 0. clinic-emr (kahan:3006) β†’ star365-members (kahan:3720) β†’ star365-hub (paperclip:3400) 3-tier E2E μž‘λ™. νŠΈλ ˆμ΄λ”©/UFW/DB DROP 0 영ν–₯.

μ˜μ‚¬κ²°μ • 흐름

  1. 격차 맀트릭슀 μž‘μ„± (5 μ˜μ—­ A~E)
  2. (A) μ§„λ£Œμ™„λ£Œ 트리거: μ‚¬μš©μž κ²°μ • β€” clinic-emr UI μˆ˜λ™ λ²„νŠΌ
  3. (B) μ•Œλ¦Ό 채널: ALIGO ν‚€ placeholder 확인, 카카였 KAKAO_CHANNEL_ADMIN_KEY λΉ„μ–΄μžˆμŒ β†’ μ•Œλ¦Όν†‘ 인프라 미ꡬ비 판λͺ… β†’ QR λ°©μ‹μœΌλ‘œ κ²°μ • (λŒ€ν–‰μ‚¬ κ°€μž… μ˜μ—…μΌ 5-7일 우회)
  4. (μ§„ν–‰) Phase 1 MVP μš°μ„ 

κ΅¬ν˜„ (5 μž‘μ—… λ‹¨μœ„)

W1: members μ„œλ²„ medical 토큰 endpoint (kahan /opt/star365-members/server.mjs)

W2: clinic-emr λ°±μ—”λ“œ (kahan /opt/clinic-emr/server/routes/star365-token.js)

W3: clinic-emr UI (kahan /opt/clinic-emr/src/pages/MedicalRecord.jsx)

W4: star365-hub (paperclip /opt/star365-hub/)

W5: E2E 검증 + cleanup

  1. μ˜μ‚¬ μ§„λ£Œμ™„λ£Œ β†’ 토큰 λ°œκΈ‰ βœ… (record_id=4, ν™˜μž κΉ€μ˜μˆ˜)
  2. paperclip /medical/token-info 검증 valid βœ…
  3. μ™ΈλΆ€ HTTPS https://members.star365.site/auth/signup β†’ κ°€μž… + medical_reward {reward_amount:5000, balance_after:5000} βœ…
  4. 같은 토큰 μž¬μ‚¬μš© β†’ medical_reward.error="already_redeemed" βœ… (κ°€μž… μžμ²΄λŠ” 성곡, 5,000P λ―Έμ§€κΈ‰)
  5. DB 6/6 검증 PASS:
    • medical_visit_tokens.redeemed_at SET
    • star365_members μ‹ κ·œ (first_platform='medical')
    • unified_point_accounts: balance=5000, lifetime_earned=5000, BRONZE
    • point_transactions: EARN 5000 HOSPITAL platform, reference_type='medical_visit_token'
    • member_journey_events: signup + medical_visit_redeem 2건
    • platform_memberships: medical real + 7 shadow (auto-shadow)
  6. ν…ŒμŠ€νŠΈ 데이터 정리: ν…ŒμŠ€νŠΈ νšŒμ› 3λͺ…/토큰 5개/transactions 2건/journey_events 5건/platform_memberships 24건 일괄 μ‚­μ œ

API 흐름

[μ˜μ‚¬] clinic-emr UI μ„œλͺ… μ™„λ£Œ
   ↓ POST /api/star365-token/issue
[clinic-emr Express :3006]
   ↓ POST kahan:3720/medical/visit-token (x-star365-key)
[star365-members :3720]
   ↓ INSERT medical_visit_tokens
   ↓ return {token, signup_url, expires_at}
[clinic-emr UI] QR λͺ¨λ‹¬ ν‘œμ‹œ (https://members.star365.site/signup?mt=mvt-...)

[ν™˜μž] QR μŠ€μΊ” β†’ λͺ¨λ°”일 λΈŒλΌμš°μ €
   ↓ GET https://members.star365.site/signup?mt=mvt-...
[star365-hub :3400]
   ↓ GET /medical/token-info?mt=... β†’ kahan /medical/visit-token/:token
[signup.html] λ°°λ„ˆ ν‘œμ‹œ "πŸ₯ 5,000P κ°€μž… λ³΄λ„ˆμŠ€"
   ↓ 이메일/PW μž…λ ₯ β†’ POST /auth/signup {email, password, medical_token}
[star365-hub /auth/signup]
   ↓ kahan /register
   ↓ kahan /sso/issue (cookie set)
   ↓ kahan /medical/visit-redeem {token, star365_uid}
[members /medical/visit-redeem] BEGIN
   - SELECT FOR UPDATE token
   - check redeemed/expired β†’ 409/410
   - INSERT/UPDATE unified_point_accounts +5000
   - INSERT point_transactions (EARN, HOSPITAL)
   - INSERT member_journey_events (medical_visit_redeem)
   - UPDATE token redeemed_at
COMMIT
   ↓ κ°€μž… 성곡 alert "πŸŽ‰ 5,000P 적립" β†’ /me λ¦¬λ‹€μ΄λ ‰νŠΈ

μ•ˆμ „ 점검

λ―Έν•΄κ²° / Phase 2 후보