feat(backend): 아임웹 회원 유입경로·신청 기록 관리자 API 추가

아임웹 관리자 페이지에서 회원을 유입경로·그룹 기준으로 보고, 무료 강의 신청을
기록·조회하기 위한 백엔드다. 관리자 화면(아임웹)과 API(wandergo.net)가 다른 사이트라
인증은 쿠키 대신 Bearer 토큰으로 한다.

- 관리자 인증: env 단일 계정(ADMIN_USERNAME/PASSWORD)을 여러 사람이 공유,
  기기별 세션(로그아웃은 그 기기만, 비밀번호 변경 시 전체 무효)
- 아임웹 Open API 연동: OAuth 연결·토큰 갱신, 회원·그룹 주기 동기화,
  가입 폼 '홈페이지' 항목의 유입정보 파싱, 회원 엑셀 '유입경로' 가져오기 스크립트
- 회원 조회: 유입경로·그룹·기간 필터, 유입원 집계
- 강의 신청 기록: 신청 완료 화면이 보내는 공개 API(회원 확인·중복 방지·요청 제한),
  오픈카톡 클릭 기록, 관리자 신청 내역 조회
- CORS 다중 도메인, env 검증(운영 필수값), CI e2e 전 마이그레이션 적용,
  개발 컨테이너 메모리 한도 2g, 에러 코드 IMWEB_001~005·APPLY_001

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-05 16:21:25 +09:00
parent 4be82a716b
commit c54df9cefa
84 changed files with 6612 additions and 132 deletions
@@ -11,6 +11,12 @@ const Map<String, String> kErrorCodeMessages = {
'BIZ_001': '요청하신 작업을 완료하지 못했습니다. 다시 시도해 주세요.',
'FILE_001': '허용되지 않는 파일 형식입니다. 파일을 확인해 주세요.',
'FILE_002': '파일 크기가 허용 범위를 초과했습니다.',
'IMWEB_001': '아임웹 연결이 되어 있지 않습니다. 먼저 아임웹 계정을 연결해 주세요.',
'IMWEB_002': '아임웹에서 정보를 가져오지 못했습니다. 잠시 후 다시 시도해 주세요.',
'IMWEB_003': '아임웹 연결 요청이 만료되었거나 올바르지 않습니다. 처음부터 다시 연결해 주세요.',
'IMWEB_004': '회원 동기화가 이미 진행 중입니다. 잠시 후 다시 확인해 주세요.',
'IMWEB_005': '아임웹 연동 설정이 완료되지 않았습니다. 관리자에게 문의해 주세요.',
'APPLY_001': '회원 정보를 확인할 수 없어 신청을 기록하지 못했습니다.',
};
/// 매핑 실패 시 사용하는 폴백 코드