1. API 목록

2. 투표 기간 관련

2.1. GET: 투표 기간 조회

HTTP Request
GET /contests/1/vote HTTP/1.1
Host: localhost:8080
HTTP Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 82

{
  "voteStartAt" : "2026-01-01T00:00:00",
  "voteEndAt" : "2026-01-02T00:00:00"
}
Table 1. /contests/{contestId}/vote
Parameter Description

contestId

대회 ID

Table 2. Response Fields
Path Type Description

voteStartAt

String

투표 시작일 (ISO-8601)

voteEndAt

String

투표 종료일 (ISO-8601)

2.2. PUT: 투표 기간 수정

HTTP Request
PUT /contests/1/vote HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 82
Host: localhost:8080

{
  "voteStartAt" : "2026-02-01T00:00:00",
  "voteEndAt" : "2026-02-10T00:00:00"
}
HTTP Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Table 3. /contests/{contestId}/vote
Parameter Description

contestId

대회 ID

Table 4. Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

Table 5. Request Fields
Path Type Description

voteStartAt

String

투표 시작일 (ISO-8601)

voteEndAt

String

투표 종료일 (ISO-8601)

3. 최대 투표 개수 관리

3.1. PATCH: 최대 투표 개수 설정

Table 6. /contests/{contestId}/votes
Parameter Description

contestId

대회의 고유 ID

Table 7. HTTP Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

HTTP Request
PATCH /contests/1/votes HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 25
Host: localhost:8080

{
  "maxVotesLimit" : 2
}
HTTP Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Table 8. Request Fields
Path Type Description

maxVotesLimit

Number

최대 투표 개수

3.1.1. ⚠️ 실패 케이스

❌ Case 1: 존재하지 않는 대회
PATCH /contests/999/votes HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 25
Host: localhost:8080

{
  "maxVotesLimit" : 2
}
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56

{
  "message" : "존재하지 않는 대회입니다."
}
❌ Case 2: 투표 진행 중
PATCH /contests/1/votes HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 25
Host: localhost:8080

{
  "maxVotesLimit" : 2
}
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 94

{
  "message" : "투표 진행중에는 최대 투표 개수를 변경할 수 없습니다."
}

3.2. GET: 최대 투표 개수 조회

Table 9. /contests/{contestId}/votes
Parameter Description

contestId

대회의 고유 ID

Table 10. HTTP Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

HTTP Request
GET /contests/1/votes HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 25

{
  "maxVotesLimit" : 2
}
Table 11. Response Body’s Fields
Path Type Description

maxVotesLimit

Number

최대 투표 개수

3.2.1. ⚠️ 실패 케이스

❌ Case 1: 존재하지 않는 대회
GET /contests/999/votes HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56

{
  "message" : "존재하지 않는 대회입니다."
}