finance์์ 1๋งP ๋ฐ์ผ๋ฉด shop์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ง์ง ํตํฉ ์๊ณ
| DB | point_accounts | point_transactions | ๋น๊ณ |
|---|---|---|---|
| medical_platform | 17 | 44 | ๐ข ๊ฐ์ฅ ํ์ฑ |
| assistant_platform | 4 | 10 | ๐ก |
| legal_platform | point_balances=3 | 4 | ๐ก (์คํค๋ง ๋ค๋ฆ) |
| finance_platform | 2 | 2 | ๐ก |
| pet_platform | 0 | 0 | โช skip |
| hospital_db | 0 | 0 | โช skip |
| shop_db (common) | 0 | 0 | โช skip |
ํต์ฌ ๊ฐญ: unified_point_accounts ํ
์ด๋ธ์ ์กด์ฌํ์ผ๋ ๋
ธ์ถ API ๋ถ์ฌ. ์ด๋ค ํ๋ซํผ๋ ํธ์ถ ๋ถ๊ฐ.
| ์ต์ | ์ฌ์ฉ | ๋ฆฌ์คํฌ |
|---|---|---|
| A. 7 ํ๋ซํผ ์ฝ๋ hook ์ฃผ์ | ๋ฏธ์ฑํ | 7 ๋ผ์ด๋ธ ์๋น์ค ๋์ ๋ณ๊ฒฝ = ํ๊ท ๋ฆฌ์คํฌ |
| B. ์ค์ API ์ ๊ท + ๋ฐฑํ | โ | ๋ฌด์ค๋จ, ์ฝ๋ ๋ณ๊ฒฝ 1 ํ์ผ(server.mjs) |
| C. View only | ๋ฏธ์ฑํ | spend ๋ถ๊ฐ |
/opt/star365-members/server.mjs (kahan)GET /points/balance/:uidPOST /points/earn (๋ฉฑ๋ฑ์ฑ)POST /points/spend (์๊ณ ๋ถ์กฑ ๊ฑฐ์ + ๋ฉฑ๋ฑ์ฑ)GET /points/history/:uidPOST /points/backfill-from-platforms (๋ฐฐ์น)x-star365-key ์ฌ์ฌ์ฉFOR UPDATE ํ ์ ๊ธ/opt/backups/2026-04-30-points-migration/ (180KB, 6 SQL dumps)
| # | ๊ธฐ์ค | ๊ฒฐ๊ณผ | ์ฆ๊ฑฐ |
|---|---|---|---|
| 1 | /points/balance ์๋ | โ PASS | samshin balance 200 ์๋ต, account_exists ์ ํ |
| 2 | /points/earn ์๋ | โ PASS | samshin 1๋งP โ balance 10000 |
| 3 | /points/earn ๋ฉฑ๋ฑ์ฑ | โ PASS | ๊ฐ์ idempotency_key ์ฌํธ์ถ โ idempotent_replay:true |
| 4 | /points/spend ์๋ | โ PASS | shop 5000 spend โ balance 5000 |
| 5 | cross-platform spend | โ PASS | finance ์ ๋ฆฝ โ SHOP/HOSPITAL spend ๊ฐ๋ฅ |
| 6 | insufficient balance ๊ฑฐ์ | โ PASS | 9999 ์์ฒญ / ์๊ณ 3500 โ 400 ๊ฑฐ์ |
| 7 | invalid platform ๊ฑฐ์ | โ PASS | 400 + allowed ๋ชฉ๋ก ๋ฐํ |
| 8 | 24 active accounts ๋ฐฑํ | โ PASS | 24/24 ok, 0 errors |
| 9 | ๋ฉฑ๋ฑ ๋ฐฑํ (์ฌ์คํ ์) | โ PASS | ์ฌ์คํ 24/24 idempotent_replay |
| 10 | cross-platform ํฉ์ฐ | โ PASS | eb9322@naver.com: assistant 5000 + hospital 5200 + legal 5000 = 15,200P |
| 11 | ๋ฌด์ค๋จ ๋ผ์ด๋ธ | โ PASS | systemd restart 1์ด ๋ฏธ๋ง, /health 200 |
| 12 | ํธ๋ ์ด๋ฉ/UFW ์ํฅ 0 | โ PASS | star365-members.service ๋จ์ผ ์ํฅ |
| 13 | ๋ฐฑ์ ๋ณด๊ด | โ PASS | /opt/backups/2026-04-30-points-migration/ 6 dumps |
13/13 PASS (100%)
| platform | EARN cnt | EARN sum | SPEND cnt | SPEND sum |
|---|---|---|---|---|
| ASSISTANT | 4 | 19,100 | 0 | 0 |
| HOSPITAL | 16 | 70,700 | 1 | 1,500 |
| FINANCE | 2 | 15,000 | 0 | 0 |
| LEGAL | 3 | 14,900 | 0 | 0 |
| SHOP | 0 | 0 | 1 | 5,000 |
| ํฉ๊ณ | 25 | 119,700 | 2 | 6,500 |
EARN +10,000 โ 10,000 on FINANCE | welcome bonus
SPEND -5,000 โ 5,000 on SHOP | shop purchase test
SPEND -1,500 โ 3,500 on HOSPITAL | medical service test
์ต์ข ์๊ณ : 3,500P (lifetime_earned 10,000 / lifetime_spent 6,500). ์ฌ์ฉ์ ์ง๋ฌธ "๋ค๋ฅธ ํ๋ซํผ์์ ๋ฐ์ ํฌ์ธํธ๋ฅผ ํ ๊ณณ์์ ์ฌ์ฉ"์ ์ ํํ ๋ตํ๋ ๊ธฐ๋ฅ ์๋.
POST /points/earn,spend ํธ์ถ wire| # | ํญ๋ชฉ | ์ํฅ | ๋์ |
|---|---|---|---|
| 1 | ๋ฐฑํ์ด lifetime_earned์๋ง ๋์ , ์์ฒด plat์ lifetime_spent ๋ณ๋ ๋ณด์กด | metadata ๊ธฐ๋ก | source_lifetime_spent metadata ๋ณด๊ด |
| 2 | medical_platform โ HOSPITAL enum ๋งคํ (์ด๋ฆ ๋ค๋ฆ) | ๋งคํ ์ผ๊ด์ฑ | PLATFORM_ENUM_MAP 17 ๋ณ์นญ ๋ฑ๋ก |
| 3 | ์์ฒด plat point_accounts ์ฝ๋๋ ์ฌ์ ํ ์์ฒด ์ปฌ๋ผ ์ฌ์ฉ | dual reality ์ผ์์ | ๋ณ๋ sprint๋ก hook ์ฃผ์ |
| 4 | samshin "welcome 1๋งP" ํ ์คํธ ๋ฐ์ดํฐ ์์กด | ์ค ์ฌ์ฉ์ ์๊ณ ์ค์ผ | ์ฌ์ฉ์ ์ ํ: ์ ์ง (์์ฐ ์ฆ๊ฑฐ) vs ํ์ |
M /opt/star365-members/server.mjs +99 lines (kahan)
+ /opt/backups/2026-04-30-points-migration/ 6 SQL dumps
+ /opt/star365-hq/docs/01-plan/unified-points-migration-20260430.plan.md
+ /opt/star365-hq/docs/04-report/unified-points-migration-20260430.report.md
+ /tmp/backfill_runner.py (์ฌ์คํ ๊ฐ๋ฅ)
| ๊ธฐ์ค | ์ ์ | ๋น๊ณ |
|---|---|---|
| product_depth | 8/10 | API 5๊ฐ + ๋ฉฑ๋ฑ์ฑ + ์๊ณ ๊ฒ์ฆ + ๋ฌด์ค๋จ. (-2) hook ๋ฏธ์ฃผ์ = ํฅํ ๋ณ๊ฒฝ๋ถ ์๋ sync ์ ๋จ |
| functionality | 9/10 | 13/13 DC PASS. (-1) tier ์น๊ธ ๋ฏธ๊ตฌํ |
| code_quality | 8/10 | ํธ๋์ญ์ ๊ฒฉ๋ฆฌ + FOR UPDATE ์ ๊ธ + ๋ฉฑ๋ฑ์ฑ + enum validation. (-2) ๋จ์ ํ ์คํธ ๋ถ์ฌ |
| design | 8/10 | ๊ธฐ์กด ์ธ์ฆ/์คํค๋ง/์ด๋ฒคํธ ์์ฐ์ค๋ฝ๊ฒ ํ์ฅ. (-2) backfill API๋ admin only ํ์ ์ ํจ |
Overall: 8.25/10 โ PASS
๋ณด๊ณ ์๋ฃ. ์ฌ์ฉ์ ํ์ ๊ฒฐ์ ์ฌํญ: (a) samshin ํ ์คํธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, (b) ๋ค์ sprint(ํ๋ซํผ hook ์ฃผ์ ) ์ฐ์ ์์.