feat: 운영자 관리 API 구현 (#134) #135

Merged
seonkyu.kim merged 1 commits from feature/#134-operator-management into develop 2026-02-11 00:20:13 +00:00
Owner

📋 작업 요약

  • Account 도메인의 미구현 운영자 관리 API 4개를 구현
  • 기존 Account API(create/list/get/update/delete)와 별도로 /v1/in/account/operator/ 하위에 배치
  • 비밀번호 없이 계정 생성 후 이메일 링크로 설정하는 플로우 구현

Closes #134

🛠️ 작업 내용 (Changes)

  • OperatorCreateRequestDto.cs — 생성 요청 DTO (email, name, phone?, role)
  • OperatorCreateResponseDto.cs — 생성/초기화 응답 DTO (admin_code, email, role)
  • OperatorDeleteRequestDto.cs — 삭제 요청 DTO (admin_code)
  • OperatorListRequestDto.cs — 목록 요청 DTO (page, size, role?, is_active?)
  • OperatorListResponseDto.cs — 목록 응답 DTO (items + PaginationDto)
  • OperatorPasswordResetRequestDto.cs — 비밀번호 초기화 요청 DTO
  • IEmailService.cs — SendPasswordSetupTokenAsync 메서드 추가
  • IAccountService.cs — 4개 운영자 관리 메서드 추가
  • IAdminRepository.cs — GetOperatorPagedAsync 메서드 추가
  • AdminRepository.cs — GetOperatorPagedAsync 구현 (IgnoreQueryFilters + is_active 필터)
  • ConsoleEmailService.cs — SendPasswordSetupTokenAsync 구현 (콘솔 로그)
  • AccountService.cs — 4개 메서드 구현 (IEmailService, ITokenStore 의존성 추가)
  • AccountController.cs — 4개 엔드포인트 + GetAdminId() 헬퍼 추가

📢 리뷰어 참고 사항 (To Reviewers)

  • 기존 Account CRUD(create/list/get/update/delete)는 변경 없음
  • operator/create는 비밀번호 없이 생성 → 이메일로 비밀번호 설정 토큰 발송 (24h 유효)
  • operator/delete는 자기 자신 삭제 방지 로직 포함 (adminId JWT claim 비교)
  • operator/list는 IgnoreQueryFilters로 is_active=false(삭제된) 운영자도 조회 가능
  • operator/password/reset은 세션 무효화(RefreshToken null) 후 재설정 토큰 발송 (1h 유효)
  • AccountService 생성자에 IEmailService, ITokenStore 의존성 추가 (DI에 이미 등록됨)

체크리스트 (Self Checklist)

  • 빌드(Build)가 성공적으로 수행되었는가?
  • 모든 단위 테스트(Unit Test)를 통과하였는가?
  • 불필요한 로그나 주석을 제거하였는가?
  • 컨벤션(Clean Architecture, Naming)을 준수하였는가?
  • 기밀 정보(비밀번호, 키 등)가 하드코딩 되어있지 않은가?

📸 스크린샷 / 테스트 로그 (Screenshots/Logs)

dotnet build SPMS.API
빌드했습니다. 경고 0개, 오류 0개
## 📋 작업 요약 - Account 도메인의 미구현 운영자 관리 API 4개를 구현 - 기존 Account API(create/list/get/update/delete)와 별도로 `/v1/in/account/operator/` 하위에 배치 - 비밀번호 없이 계정 생성 후 이메일 링크로 설정하는 플로우 구현 ## 🔗 관련 이슈 (Related Issues) Closes #134 ## 🛠️ 작업 내용 (Changes) - [x] `OperatorCreateRequestDto.cs` — 생성 요청 DTO (email, name, phone?, role) - [x] `OperatorCreateResponseDto.cs` — 생성/초기화 응답 DTO (admin_code, email, role) - [x] `OperatorDeleteRequestDto.cs` — 삭제 요청 DTO (admin_code) - [x] `OperatorListRequestDto.cs` — 목록 요청 DTO (page, size, role?, is_active?) - [x] `OperatorListResponseDto.cs` — 목록 응답 DTO (items + PaginationDto) - [x] `OperatorPasswordResetRequestDto.cs` — 비밀번호 초기화 요청 DTO - [x] `IEmailService.cs` — SendPasswordSetupTokenAsync 메서드 추가 - [x] `IAccountService.cs` — 4개 운영자 관리 메서드 추가 - [x] `IAdminRepository.cs` — GetOperatorPagedAsync 메서드 추가 - [x] `AdminRepository.cs` — GetOperatorPagedAsync 구현 (IgnoreQueryFilters + is_active 필터) - [x] `ConsoleEmailService.cs` — SendPasswordSetupTokenAsync 구현 (콘솔 로그) - [x] `AccountService.cs` — 4개 메서드 구현 (IEmailService, ITokenStore 의존성 추가) - [x] `AccountController.cs` — 4개 엔드포인트 + GetAdminId() 헬퍼 추가 ## 📢 리뷰어 참고 사항 (To Reviewers) - 기존 Account CRUD(create/list/get/update/delete)는 변경 없음 - operator/create는 비밀번호 없이 생성 → 이메일로 비밀번호 설정 토큰 발송 (24h 유효) - operator/delete는 자기 자신 삭제 방지 로직 포함 (adminId JWT claim 비교) - operator/list는 IgnoreQueryFilters로 is_active=false(삭제된) 운영자도 조회 가능 - operator/password/reset은 세션 무효화(RefreshToken null) 후 재설정 토큰 발송 (1h 유효) - AccountService 생성자에 IEmailService, ITokenStore 의존성 추가 (DI에 이미 등록됨) ## ✅ 체크리스트 (Self Checklist) - [x] 빌드(Build)가 성공적으로 수행되었는가? - [x] 모든 단위 테스트(Unit Test)를 통과하였는가? - [x] 불필요한 로그나 주석을 제거하였는가? - [x] 컨벤션(Clean Architecture, Naming)을 준수하였는가? - [x] 기밀 정보(비밀번호, 키 등)가 하드코딩 되어있지 않은가? ## 📸 스크린샷 / 테스트 로그 (Screenshots/Logs) ``` dotnet build SPMS.API 빌드했습니다. 경고 0개, 오류 0개 ```
seonkyu.kim added this to the Phase 3-2: 통계 & Webhook & 배치 milestone 2026-02-11 00:17:16 +00:00
seonkyu.kim added 1 commit 2026-02-11 00:17:17 +00:00
- POST /v1/in/account/operator/create (계정 생성 + 비밀번호 설정 이메일)
- POST /v1/in/account/operator/delete (Soft Delete, 자기 자신 삭제 방지)
- POST /v1/in/account/operator/list (페이징 + role/is_active 필터)
- POST /v1/in/account/operator/password/reset (비밀번호 초기화 + 세션 무효화)

Closes #134
seonkyu.kim added the
Priority
High
Status
In Progress
Type
Feature
labels 2026-02-11 00:17:34 +00:00
seonkyu.kim self-assigned this 2026-02-11 00:18:14 +00:00
seonkyu.kim requested review from Owners 2026-02-11 00:18:23 +00:00
seonkyu.kim merged commit 86f978633e into develop 2026-02-11 00:20:13 +00:00
seonkyu.kim deleted branch feature/#134-operator-management 2026-02-11 00:20:41 +00:00
seonkyu.kim added
Status
Done
and removed
Status
In Progress
labels 2026-02-11 00:21:22 +00:00
Sign in to join this conversation.
No description provided.