프로젝트

일반

사용자정보

Actions

이슈 #420

진행중
JL JL

Redeem Code 시스템 — 사용권 발급/리딤/관리 (QR 코드 기반)

이슈 #420: Redeem Code 시스템 — 사용권 발급/리딤/관리 (QR 코드 기반)

James Lee이(가) 약 7시간 전에 추가함. 약 7시간 전에 수정됨.

상태:
해결
우선순위:
높음
담당자:
목표버전:
시작일:
2026/04/28
완료일:
2026/04/29 (약 6달 지연)
진척도:

50%

추정시간:
(합계: 0:00 시간)

설명

개요

Edge Server 에서 AI Service 사용권 및 AGX 포인트 사용권을 Redeem Code (QR Code) 형태로 발급하고, Alphea App 사용자가 코드를 입력해 리딤할 수 있는 시스템을 구현한다.

사용권 종류

종류 효과 비고
AGX_POINTS AGX 포인트 일시 충전 예: 10,000 / 100,000 AGX
AI_SERVICE_MONTHLY AI Service 월간 사용권 일수로 환산 (30일 단위)
AI_SERVICE_YEARLY AI Service 연간 사용권 일수로 환산 (365일 단위)
CUSTOM 자유 조합 AGX + AI 사용권 동시 부여

코드 발급 정책

  • 포맷: ALPHEA-XXXX-XXXX-XXXX (Crockford Base32, 0/O/1/I 제외)
  • 단일 발급 + 배치 발급 (1회 최대 1,000개)
  • 만료일 설정 가능 (NULL = 무기한)
  • 재사용 횟수 설정 가능 (기본 1회용)
  • revoke (발급 취소) 기능
  • 발급 시 메모/사유, 캠페인 batch_id 기록

리딤 정책

  • 리딤은 인증된 사용자만 가능 (GoTrue JWT 필수)
  • 동일 사용자의 같은 코드 중복 리딤 금지 (UNIQUE (code, user_id))
  • AGX 적립은 wallet_adjustments ledger 테이블에 기록 (감사/롤백 가능)
  • AI Service 사용권은 ai_service_entitlements 의 expires_at 을 누적 연장

DB 스키마 (migrations/0008_redeem_codes.sql)

CREATE TABLE redeem_codes (
  code              TEXT PRIMARY KEY,
  batch_id          UUID,
  reward_type       SMALLINT NOT NULL,
  agx_amount        DOUBLE PRECISION DEFAULT 0,
  ai_service_days   INT DEFAULT 0,
  note              TEXT,
  max_redemptions   INT NOT NULL DEFAULT 1,
  redemption_count  INT NOT NULL DEFAULT 0,
  expires_at        TIMESTAMPTZ,
  created_by        UUID,
  created_at        TIMESTAMPTZ DEFAULT NOW(),
  revoked_at        TIMESTAMPTZ
);

CREATE TABLE redeem_history (
  id              BIGSERIAL PRIMARY KEY,
  code            TEXT NOT NULL REFERENCES redeem_codes(code),
  user_id         UUID NOT NULL,
  redeemed_at     TIMESTAMPTZ DEFAULT NOW(),
  agx_credited    DOUBLE PRECISION DEFAULT 0,
  ai_days_added   INT DEFAULT 0,
  UNIQUE (code, user_id)
);

CREATE TABLE ai_service_entitlements (
  user_id      UUID PRIMARY KEY,
  expires_at   TIMESTAMPTZ NOT NULL,
  updated_at   TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE wallet_adjustments (
  id             BIGSERIAL PRIMARY KEY,
  user_id        UUID NOT NULL,
  delta_agx      DOUBLE PRECISION NOT NULL,
  reason         TEXT NOT NULL,            -- 'redeem' / 'admin_credit' / 'admin_debit' 등
  ref_code       TEXT,                     -- redeem_codes.code 등 외부 참조
  created_by     UUID,
  created_at     TIMESTAMPTZ DEFAULT NOW()
);

Proto (proto/alphea/v1/redeem.proto)

service RedeemService {
  rpc RedeemCode(RedeemCodeRequest) returns (RedeemCodeResponse);
  rpc ListMyRedemptions(ListMyRedemptionsRequest) returns (ListMyRedemptionsResponse);
}

발급/관리는 admin REST API 만 제공 (gRPC 노출 X).

Admin REST API (src/admin/mod.rs)

POST   /api/redeem-codes              # 단일/배치 발급 (최대 1000)
GET    /api/redeem-codes              # 목록 (필터: type/status/batch/expires)
GET    /api/redeem-codes/{code}       # 상세 + 리딤 이력
POST   /api/redeem-codes/{code}/revoke

Dev Console UI

새 탭 "Redeem Codes" 추가:

  • 발급 폼 (단일/배치, 타입/금액/만료일/메모/배치 사이즈)
  • 목록 테이블 (필터/검색/페이지네이션)
  • 상세 패널 (리딤 이력 표시, QR 코드 실시간 렌더 — qrcode.min.js)
  • CSV 다운로드 (배치 발급 직후 / 목록 export)
  • 코드 취소 버튼

구현 단계

  • Phase 0 — AGX 잔액을 wallet-scope → account-scope 로 마이그레이션 (별도 이슈로 분리)
  • Phase 1 — DB migration + store/redeem.rs, store/wallet_adjustments.rs
  • Phase 2 — Proto + Handler (RedeemService)
  • Phase 3 — Admin REST API
  • Phase 4 — Dev Console UI

의존성

  • Phase 0 (AGX account-scope 전환) 가 선행되어야 한다 — 현재 AGX 가 wallet 종속이라 user 단위 적립 / 차감이 불가능.
  • GoTrue 인증(#411) 기반 — 리딤은 GoTrue JWT 의 user_id 로 식별.

하위 일감 2 (한 건 진행 중 — 한 건 완료)

이슈 #425: QR 코드 카드 디자인완료Jade Kim2026/04/282026/04/29

Actions
이슈 #426: 리딤 코드 SNS/문자 발송 기능신규James Lee2026/04/30

Actions

연결된 일감 3 (3 건 진행 중 — 모두 미완료)

다음 일감과 관련됨: 이슈 #411: Supabase GoTrue 인증 전환 — wallet-based auth 제거 및 GoTrue JWT 통합해결James Lee2026/04/24

Actions
다음 일감과 관련됨: 업무 #423: Docker 빌드 실패 — time crate 0.3.47 가 rustc 1.88+ 요구, builder image 가 1.85신규James Lee2026/04/27

Actions
다음 일감을 우선 진행: 이슈 #421: AGX 잔액을 Wallet 종속 → Account(GoTrue user_id) 종속으로 전환해결James Lee2026/04/27

Actions
Actions

내보내기 PDF Atom