사용자 신고·검토·제재 처리 및 기능 제안을 담당하는 독서 게이미피케이션 플랫폼 Frolog의 신고 도메인 서비스입니다.
사용자 간 신고 접수, 관리자 검토·승인, 제재 기간 설정 및 자 동 계정 정지, 기능 제안 등록을 처리합니다.
- 사용자 신고 접수 (신고 대상, 사유)
- 신고 검색·조회 (관리자 전용, 필터링·페이지네이션)
- 신고 검토·승인 (관리자, 상태 변경)
- 제재 처리 (정지 기간 설정, SuspendUser API 연동)
- 정지 기간 파싱 (ms 라이브러리, "7d", "24h" 등)
- 기능 제안 등록 (type, reason)
- Node.js (ESM), Express 기반
@frolog/express-api-server - ORM: Sequelize (
@frolog/models) - 공통 유틸:
@frolog/common-utils(로거, HashId 등) - API 계약:
@frolog/frolog-api - 유틸:
ms(기간 문자열 파싱) - Lint/Format: ESLint, Prettier
npm install
npm run dev # 개발 (nodemon)
npm start # 프로덕션
npm run lint # 코드 규칙 검사
npm run doc # JSDoc 생성src/
index.js # API 서버 부트스트랩 및 라우팅
services/
postUserReport.js # 사용자 신고 접수
getUserReport.js # 신고 단건 조회 (관리자)
searchUserReport.js # 신고 검색 (관리자, 필터 링·페이지네이션)
confirmUserReport.js # 신고 검토·승인 (관리자, 제재 처리)
postNewFeatureRequest.js # 기능 제안 등록src/index.js에서 @frolog/frolog-api 스펙과 서비스 로직을 매핑합니다.
- GET: SearchUserReport (admin), GetUserReport (admin)
- POST: PostUserReport (login), ConfirmUserReport (admin), PostNewFeatureRequest (login)
없음. 모든 작업은 HTTP 요청 기반으로 처리됩니다.
- PostUserReport, PostNewFeatureRequest: 로그인 필수
- SearchUserReport, GetUserReport, ConfirmUserReport: 관리자 전용 (is_admin=true)
- HashId 인코딩: 모든 사용자 ID는 해시 형식으로 처리
신고 접수 (PostUserReport)
- 신고자(issuer): 현재 로그인 사용자
- 신고 대상(target): 해시 ID로 지정
- 신고 사유(reason): 선택적
- 초기 상태: 'submitted'
- 반환: 신고 해시 ID
신고 검색 (SearchUserReport)
- 필터: 신고 대상, 신고자, 날짜 범위, 상태, 검토자
- 정렬: oldest (오래된 순), newest (최신 순), report ID 순
- 페이지네이션: limit (1-100, 기본값 10), page 오프셋
- 반환: 총 개수 + 신고 목록
신고 조회 (GetUserReport)
- 신고 ID로 단건 조회
- 반환: 신고 대상, 신고자, 사유, 생성일, 상태, 검토자, 검 토일, 제재 정보
신고 검토·승인 (ConfirmUserReport)
- 관리자가 신고 검토
- 상태 업데이트 (승인/거부 등)
- 검토자(admin) 및 검토 시각 기록
- 제재(penalty) 지정 시:
- 정지 기간 파싱 (예: "7d" → 7일, "24h" → 24시간)
- 정지 종료 시각 계산 (현재 시각 + 정지 기간)
- SuspendUser API 호출 (user-service 연동)
- 대상 사용자 계정 정지 처리
신고 상태
- 'submitted': 신고 접수 (초기 상태)
- 기타 상태는 ConfirmUserReport에서 관리 (예: 승인, 거부, 기각 등)
기능 제안 등록 (PostNewFeatureRequest)
- 제안자: 현재 로그인 사용자
- type: 제안 유형
- reason: 제안 사유/내용
- 반환: 기능 제안 해시 ID
제재 처리 정지 기간 설정:
- ms 라이브러리 사용 (기간 문자열 → 밀리초 변환)
- 예시: "7d" (7일), "24h" (24시간), "30m" (30분)
- 정지 종료 시각: new Date(Date.now() + ms(penalty))
SuspendUser API 연동
- 엔드포인트: @frolog/frolog-api의 SuspendUser
- 인증: SSC_TOKEN (서비스 간 통신 토큰)
- 파라미터: 사용자 해시 ID, 정지 종료 시각 (ISO 형식)
- user-service에서 계정 정지 처리
UserReport
- report_id (PK), target_id (FK), issuer_id (FK)
- reason, status, approver_id (FK), reviewed_at, penalty
- created_at, updated_at
NewFeatureRequest
- request_id (PK), user_id (FK)
- type, reason
- created_at, updated_at
- User Service: SuspendUser API (계정 정지 처리)
- SSC_TOKEN: 서비스 간 인증 토큰