Admin API모집·랭킹 에이전트 API
POST /ai/admin/recruit-agent/campaign/{collabNo}/propose
가입자 후보에게 캠페인 제안 이메일 발송
가입자 후보 제안 이메일
후보 조회에서 선택한 가입자(recommended) 후보에게 캠페인 제안 이메일을 발송합니다.
발송은 기존 크리에이터 제안 메일 경로를 그대로 재사용합니다 — nest 이메일 API에
{ campaignId, campaignName, creatorEmails } 를 위임합니다. (본문 템플릿은 nest 소유)
가입자 전용. 비가입자(discovery)는 회원 번호(influenceNo)가 없어 애초에 전달 대상이 아닙니다.
프론트에서도 제안 버튼은 가입자 탭에만 노출합니다.
대상 식별
발송 대상은 후보 조회가 응답에 담아준 가입자 후보의 회원 번호(influenceNo = TB_INFLUENCE.no)
로 지정합니다. 후보 조회 시점에 인스타 링크 → 회원 번호로 이미 해석해두므로, 제안 시에는 안정적인 PK만
전달하면 됩니다(취약한 링크 문자열 매칭을 반복하지 않음). 이메일은 이 번호로 TB_INFLUENCE.email 을 조회합니다.
HTTP 요청
POST /ai/admin/recruit-agent/campaign/{collabNo}/propose
Authorization: Bearer {access_token}
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
collabNo | Long | 예 | 캠페인 번호 |
Request Body
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
influenceNos | Integer[] | 예 | 제안할 가입자 후보의 회원 번호(influenceNo) 목록 (후보 조회 응답의 가입자 값) |
{
"influenceNos": [2438, 2436]
}응답 (200 OK)
{
"status": 200,
"code": null,
"message": "제안 이메일 발송 완료",
"data": {
"requested": 2,
"resolved": 2,
"sent": 2,
"emails": ["creator1@example.com", "creator2@example.com"]
}
}| 필드 | 설명 |
|---|---|
requested | 요청된 influenceNo 수 |
resolved | 회원 이메일로 해석된 수 (이메일 없는 회원 제외) |
sent | 실제 발송 성공 이메일 수 |
emails | 발송 대상 이메일(중복 제거) |
발송 이력 (제안 완료 뱃지)
발송 성공 시 수신자 1명당 1행씩 TB_RECRUIT_PROPOSAL_HISTORY 에 기록됩니다(append-only, 발송 시점
이메일 스냅샷 포함). 후보 조회가 이 이력으로 가입자에 proposed/proposedAt 을 채워
내려주므로, 프론트는 그 값으로 "제안 완료" 뱃지를 렌더하면 새로고침해도 상태가 유지됩니다.