푸시 완료됐습니다. CI/CD가 자동으로 배포합니다.
**변경 내용:**
- 모바일에서 2단 컬럼 유지 (column 전환 제거)
- 왼쪽 유저 리스트: 너비 72px의 좁은 사이드바로 고정
- 닉네임 텍스트 숨김, 아바타 이미지만 표시 (36×36px)
- 검색창 숨김 (공간 절약)
- 아바타 탭으로 유저 선택 가능
- 오른쪽 메인 영역이 나머지 공간 전부 차지
## 수정 내용
**CAPTCHA TOO FREQUENT 해결:**
- `redeemOne`에서 **불필요한 PLAYER API 호출 완전 제거** (각 쿠폰마다 player 호출하던 것 삭제)
- 캡차 재시도 시 **2초 딜레이** 추가
- 쿠폰 간 딜레이 **1.5초 → 3초**로 증가
**모바일 반응형:**
- 640px 이하에서 2단 컬럼 → **세로 1단** 전환
- FID 입력창 + 버튼 세로 배치
- 카드 패딩/글자 크기 모바일에 맞게 조정
로그에서 `err_code=40011, msg=SAME TYPE EXCHANGE.`가 확인됩니다.
**SAME TYPE EXCHANGE**는 WOS에서 **같은 종류(유형)의 보상을 이미 다른 쿠폰으로 받은 경우** 발생합니다.
예: `gogoWOS`와 `VpqG7dDK7` 둘 다 같은 종류의 아이템을 주는 쿠폰이라면, 하나를 이미 받았을 때 나머지는 이 에러가 납니다.
- `40008 RECEIVED` → **이 쿠폰 자체를** 이미 수령
- `40011 SAME TYPE EXCHANGE` → **다른 쿠폰으로** 같은 유형 보상 이미 수령
두 가지 처리 방법이 있습니다:
1. **성공으로 처리** (40008처럼): 어차피 받을 수 없으니 다음에 재시도 안 함
2. **실패로 처리**: 다음날 다시 시도 (다음날 가능성 있는 경우)
어떻게 처리할까요?
## 수정 내용
- **Sign Error 근본 원인 2가지 수정**:
1. `now()` 함수가 **초** 단위(`Date.now()/1000`)를 반환하고 있었음 → **밀리초**(`Date.now()`)로 수정 (설계서 명시 사항)
2. 세션 쿠키 추출 시 쿠키 이름에 'session'이 없으면 빈 값으로 보내고 있었음 → **모든 쿠키를 전체 전송**으로 수정
- **쿠폰 코드 대소문자 유지**: `toUpperCase()` 제거
- **FID localStorage 저장**: 한번 입력하면 다음 방문 시 자동으로 로드되어 바로 쿠폰 지급 시작
- **쿠폰 추가 시 자동 리딤**: 새 쿠폰 등록하면 DB에 저장된 **모든 유저**에게 백그라운드로 자동 지급
완료됐습니다. 변경 내용 요약:
---
## 변경 사항
### 버그 수정
- TypeORM `upsert` → MySQL 호환 `findOne + update/save` 방식으로 수정 → 500 에러 해결
### 신규 기능
**쿠폰 관리 (관리자)**
- **https://coupon.wageulwageul.com/admin** 에서 쿠폰 추가/삭제/활성화 토글
- 쿠폰 코드 + 이름 저장 (예: `ABC123` / `신년 이벤트`)
**자동 전체 지급 (사용자)**
- FID 입력 → 조회 → **⚡ 전체 쿠폰 자동 지급** 버튼 클릭
- DB에 등록된 활성 쿠폰을 전부 자동으로 시도
- 결과(쿠폰명 + 코드 + 성공/실패)가 바로 표시되고 DB에 영구 저장
- 이력은 FID별로 조회 시 자동 로드
**사용 흐름:**
1. `/admin` 에서 쿠폰 등록
2. 사용자는 `/` 에서 FID 입력 → 버튼 한 번으로 모든 쿠폰 자동 지급
배포 완료됐습니다. 변경 내용 요약:
---
## 변경 사항
**자동화 (캡차 없음)**
- FID 입력 → 조회 버튼 클릭 → 쿠폰 코드 붙여넣기 → ⚡ 자동 입력 클릭
- 백엔드가 캡차 세션을 자동으로 획득해서 처리 (사용자가 캡차를 볼 필요 없음)
- 캡차 세션 만료 시 자동 재시도
**영구 이력 저장**
- 쿠폰 입력할 때마다 DB(`coupon_logs`)에 저장
- FID 조회 시 해당 플레이어의 이력이 하단에 자동 로드
- 날짜/시간 + 결과 (성공/실패) 표시, 최대 100건
**https://coupon.wageulwageul.com** 에서 바로 확인하세요.