- 메시지 저장 API (POST /v1/in/message/save)
- 메시지 목록 조회 API (POST /v1/in/message/list)
- 메시지 상세 조회 API (POST /v1/in/message/info)
- 메시지 삭제 API (POST /v1/in/message/delete)
- message_code 자동 생성 (접두3+순번4+접미3)
- 변수 추출 ({{변수명}} 패턴)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- RabbitMQInitializer를 BackgroundService로 변경 (30초 간격 재시도)
- RabbitMQConnection에 IsConnected 속성 추가
- Health check에 RabbitMQ 연결/초기화 상태 반영
- DI 등록 변경 (Singleton + HostedService 패턴)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- MessageValidationService: title/body/image_url/link_url/link_type/data 검증
- POST /v1/in/message/validate 엔드포인트 추가
- MessageController 기반 구성
Closes#118
- POST /v1/in/push/schedule (예약 발송 등록)
- POST /v1/in/push/schedule/cancel (예약 취소)
- ScheduleCancelStore: Redis 기반 예약 취소 추적
- ScheduleWorker: 취소된 예약 메시지 ACK 후 스킵 로직 추가
Closes#116
- POST /v1/in/push/send (단건 발송)
- POST /v1/in/push/send/tag (태그 발송)
- PushService: 메시지 조회 → 변수 치환 → RabbitMQ 큐 발행
- MessageNotFound(151) 에러 코드 추가
Closes#114
- ServiceTagsRequestDto, UpdateServiceTagsRequestDto, ServiceTagsResponseDto 생성
- IServiceManagementService에 GetTagsAsync, UpdateTagsAsync 추가
- ServiceManagementService에 태그 JSON 파싱/직렬화 로직 구현
- ServiceController에 POST tags/list, tags/update 엔드포인트 추가
- 태그 최대 10개 제한, 변경 없음 감지
Closes#70
- ITokenStore, IEmailService 인터페이스 정의
- InMemoryTokenStore (IMemoryCache 기반), ConsoleEmailService (로그 출력) 구현
- SignupAsync에 6자리 인증 코드 생성/저장/발송 로직 추가
- VerifyEmailAsync 구현 (코드 검증 → EmailVerified 업데이트)
- POST /v1/in/auth/email/verify 엔드포인트 추가
- DI 등록 (ITokenStore, IEmailService, MemoryCache)
- APNs 키 등록 API (POST /v1/in/service/{serviceCode}/apns)
- FCM 키 등록 API (POST /v1/in/service/{serviceCode}/fcm)
- 키 정보 조회 API (POST /v1/in/service/{serviceCode}/credentials)
- AES-256 암호화로 민감 정보 저장
- 조회 시 메타 정보만 반환 (Private Key 미노출)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ApiKeyRefreshResponseDto 추가
- IServiceManagementService.RefreshApiKeyAsync 인터페이스 추가
- ServiceManagementService.RefreshApiKeyAsync 구현 (32~64자 랜덤 키 생성)
- ServiceController.RefreshApiKeyAsync 엔드포인트 추가
- ServiceController: 서비스 목록/상세/상태변경 엔드포인트
- ServiceManagementService: 비즈니스 로직 구현
- Service DTOs: 요청/응답 DTO 4종
- DI 등록
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AccountController: 운영자 CRUD 엔드포인트 (create, list, detail, update, delete)
- AccountService: 비즈니스 로직 구현
- Account DTOs: 요청/응답 DTO 5종
- ErrorCodes: Forbidden 코드 추가
- DI 등록
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ChangePasswordRequestDto 추가
- IAuthService/AuthService에 ChangePasswordAsync 구현
- AuthController에 POST /v1/in/auth/password/change 엔드포인트 추가
- 현재 비밀번호 검증 및 BCrypt 해싱 적용
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- LoginRequestDto, LoginResponseDto 추가
- IAuthService, AuthService 구현 (BCrypt 비밀번호 검증)
- AdminRepository 구현 (GetByEmailAsync)
- AuthController 추가 (POST /v1/in/auth/login)
- DI 등록 (IAuthService, IAdminRepository)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ServiceRepository: IServiceRepository 구현 (GetByServiceCode, GetByApiKey)
- ServiceCodeMiddleware: X-Service-Code 헤더 검증, DB 조회, 서비스 상태 확인
- ApiKeyMiddleware: /v1/in/device/* 경로 X-API-KEY 검증
- ApplicationBuilderExtensions: 미들웨어 파이프라인 12~13번 등록
- DependencyInjection: IServiceRepository DI 등록
Closes#32
- ASP.NET Core 내장 Rate Limiting (FixedWindow, IP 기반 분당 100회)
- 한도 초과 시 HTTP 429 + ApiResponse(에러코드 106) 반환
- Swashbuckle.AspNetCore 6.9.0 기반 Swagger UI 추가
- 도메인별 API 문서 그룹 (all, public, auth 등 10개)
- JWT Bearer 인증 UI (Authorize 버튼)
- X-Service-Code/X-API-KEY 커스텀 헤더 자동 표시 필터
- Microsoft.AspNetCore.OpenApi 제거 (Swashbuckle과 호환 충돌)
Closes#30