Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions src/main/java/com/opus/opus/docs/asciidoc/contest-category.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
ifndef::snippets[]
:snippets: ./build/generated-snippets
endif::[]

= CONTEST CATEGORY API 문서
:doctype: book
:icons: font
:source-highlighter: highlightjs
:toc: left
:toclevels: 3
:sectnums:

== API 목록

link:./opus.html[API 목록으로 돌아가기]

== `POST`: 대회 카테고리 생성

.HTTP Request Headers
include::{snippets}/create-contest-category/request-headers.adoc[]

.HTTP Request
include::{snippets}/create-contest-category/http-request.adoc[]

.HTTP Response
include::{snippets}/create-contest-category/http-response.adoc[]

.Request Fields
include::{snippets}/create-contest-category/request-fields.adoc[]

=== ⚠️ 실패 케이스

.❌ Case 1: 동일한 카테고리 이름 존재

[%collapsible]

====

include::{snippets}/create-contest-category-fail/http-request.adoc[]

include::{snippets}/create-contest-category-fail/http-response.adoc[]

include::{snippets}/create-contest-category-fail/request-fields.adoc[]

====

== `PATCH`: 대회 카테고리 수정

NOTE: 대회 카테고리 생성과 동일하게 이미 저장되어 있는 카테고리 이름은 저장 불가

.HTTP Request Headers
include::{snippets}/update-contest-category/request-headers.adoc[]

.HTTP Request
include::{snippets}/update-contest-category/http-request.adoc[]

.HTTP Response
include::{snippets}/update-contest-category/http-response.adoc[]

.Request Fields
include::{snippets}/update-contest-category/request-fields.adoc[]

.Path Parameters
include::{snippets}/update-contest-category/path-parameters.adoc[]

== `DELETE`: 대회 카테고리 삭제

.HTTP Request Headers
include::{snippets}/delete-contest-category/request-headers.adoc[]

.HTTP Request
include::{snippets}/delete-contest-category/http-request.adoc[]

.HTTP Response
include::{snippets}/delete-contest-category/http-response.adoc[]

.Path Parameters
include::{snippets}/delete-contest-category/path-parameters.adoc[]

== `GET`: 대회 카테고리 목록 조회

.HTTP Request
include::{snippets}/get-all-contest-category/http-request.adoc[]

.HTTP Response
include::{snippets}/get-all-contest-category/http-response.adoc[]

.Response Body's Fields
include::{snippets}/get-all-contest-category/response-fields.adoc[]
92 changes: 92 additions & 0 deletions src/main/java/com/opus/opus/docs/asciidoc/contest-track.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
ifndef::snippets[]
:snippets: ./build/generated-snippets
endif::[]

= CONTEST TRACK API 문서
:doctype: book
:icons: font
:source-highlighter: highlightjs
:toc: left
:toclevels: 3
:sectnums:

== API 목록

link:./opus.html[API 목록으로 돌아가기]

== `POST`: 대회 분과 생성

.HTTP Request Headers
include::{snippets}/create-contest-track/request-headers.adoc[]

.HTTP Request
include::{snippets}/create-contest-track/http-request.adoc[]

.HTTP Response
include::{snippets}/create-contest-track/http-response.adoc[]

.Request Fields
include::{snippets}/create-contest-track/request-fields.adoc[]

.Path Parameters
include::{snippets}/create-contest-track/path-parameters.adoc[]

=== ⚠️ 실패 케이스

.❌ Case 1: 동일한 분과 이름 존재

[%collapsible]

====

include::{snippets}/create-contest-track-fail/http-request.adoc[]

include::{snippets}/create-contest-track-fail/http-response.adoc[]

include::{snippets}/create-contest-track-fail/request-fields.adoc[]

====

== `PATCH`: 대회 분과 수정

NOTE: 대회 분과 생성과 동일하게 이미 저장되어 있는 카테고리 이름은 저장 불가

.HTTP Request Headers
include::{snippets}/update-contest-track/request-headers.adoc[]

.HTTP Request
include::{snippets}/update-contest-track/http-request.adoc[]

.HTTP Response
include::{snippets}/update-contest-track/http-response.adoc[]

.Request Fields
include::{snippets}/update-contest-track/request-fields.adoc[]

.Path Parameters
include::{snippets}/update-contest-track/path-parameters.adoc[]

== `DELETE`: 대회 분과 삭제

.HTTP Request Headers
include::{snippets}/delete-contest-track/request-headers.adoc[]

.HTTP Request
include::{snippets}/delete-contest-track/http-request.adoc[]

.HTTP Response
include::{snippets}/delete-contest-track/http-response.adoc[]

.Path Parameters
include::{snippets}/delete-contest-track/path-parameters.adoc[]

== `GET`: 대회 분과 목록 조회

.HTTP Request
include::{snippets}/get-all-contest-track/http-request.adoc[]

.HTTP Response
include::{snippets}/get-all-contest-track/http-response.adoc[]

.Response Body's Fields
include::{snippets}/get-all-contest-track/response-fields.adoc[]
76 changes: 76 additions & 0 deletions src/main/java/com/opus/opus/docs/asciidoc/contest.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -193,3 +193,79 @@ include::{snippets}/delete-contest-banner/http-request.adoc[]

.HTTP Response
include::{snippets}/delete-contest-banner/http-response.adoc[]

== 대회 관리

=== `POST`: 대회 생성

.HTTP Request Headers
include::{snippets}/create-contest/request-headers.adoc[]

.HTTP Request
include::{snippets}/create-contest/http-request.adoc[]

.HTTP Response
include::{snippets}/create-contest/http-response.adoc[]

.Request Fields
include::{snippets}/create-contest/request-fields.adoc[]

==== ⚠️ 실패 케이스

.❌ Case 1: 동일한 카테고리 이름 존재

[%collapsible]

====

include::{snippets}/create-contest-fail/http-request.adoc[]

include::{snippets}/create-contest-fail/http-response.adoc[]

include::{snippets}/create-contest-fail/request-fields.adoc[]

====

=== `PATCH`: 대회 수정

NOTE: 대회 생성과 동일하게 이미 저장되어 있는 대회 이름은 저장 불가

.HTTP Request Headers
include::{snippets}/update-contest/request-headers.adoc[]

.HTTP Request
include::{snippets}/update-contest/http-request.adoc[]

.HTTP Response
include::{snippets}/update-contest/http-response.adoc[]

.Request Fields
include::{snippets}/update-contest/request-fields.adoc[]

.Path Parameters
include::{snippets}/update-contest/path-parameters.adoc[]

=== `DELETE`: 대회 삭제

.HTTP Request Headers
include::{snippets}/delete-contest/request-headers.adoc[]

.HTTP Request
include::{snippets}/delete-contest/http-request.adoc[]

.HTTP Response
include::{snippets}/delete-contest/http-response.adoc[]

.Path Parameters
include::{snippets}/delete-contest/path-parameters.adoc[]

=== `GET`: 대회 목록 조회

.HTTP Request
include::{snippets}/get-all-contest/http-request.adoc[]

.HTTP Response
include::{snippets}/get-all-contest/http-response.adoc[]

.Response Body's Fields
include::{snippets}/get-all-contest/response-fields.adoc[]
4 changes: 4 additions & 0 deletions src/main/java/com/opus/opus/docs/asciidoc/opus.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,7 @@ link:./notice.html[공지 API]

== 대회 관련 API
link:./contest.html[대회 API]

link:./contest-category.html[대회 카테고리 API]

link:./contest-track.html[대회 분과 API]
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ public class ContestCategoryController {

@Secured("ROLE_관리자")
@PostMapping
public ResponseEntity<Void> createContestCategory(
@Valid @RequestBody final ContestCategoryRequest request) {
public ResponseEntity<Void> createContestCategory(@Valid @RequestBody final ContestCategoryRequest request) {
contestCategoryCommandService.createCategory(request);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ public ResponseEntity<List<ContestResponse>> getAllContests() {
return ResponseEntity.ok(responses);
}

@Secured("ROLE_관리자")
@PostMapping
@Secured("ROLE_관리자")
public ResponseEntity<ContestResponse> createContest(@Valid @RequestBody final ContestRequest request) {
ContestResponse response = contestCommandService.createContest(request);
return ResponseEntity.ok(response);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class ContestTrackQueryService {
private final ContestTrackRepository contestTrackRepository;

public List<ContestTrackResponse> getAllContestTracks(final Long contestId) {
List<ContestTrack> contestTracks = contestTrackRepository.findAllByContestId(contestId);
final List<ContestTrack> contestTracks = contestTrackRepository.findAllByContestId(contestId);
return contestTracks.stream()
.map(ContestTrackResponse::from)
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import jakarta.validation.constraints.NotBlank;

public record ContestCategoryRequest(

@NotBlank(message = "카테고리명을 입력해주세요.")
String categoryName
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import jakarta.validation.constraints.NotNull;

public record ContestRequest(

@NotBlank(message = "대회명은 비어 있을 수 없습니다.")
String contestName,
@NotNull(message = "카테고리ID는 비어 있을 수 없습니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import jakarta.validation.constraints.NotBlank;

public record ContestTrackRequest(

@NotBlank(message = "분과명은 비어 있을 수 없습니다.")
String trackName
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.time.LocalDateTime;

public record ContestCategoryResponse(

Long categoryId,
String categoryName,
LocalDateTime updatedAt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.time.LocalDateTime;

public record ContestResponse(

Long contestId,
String contestName,
Long categoryId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
import org.springframework.data.jpa.repository.JpaRepository;

public interface ContestCategoryRepository extends JpaRepository<ContestCategory, Long> {

boolean existsByCategoryName(final String categoryName);
}
20 changes: 20 additions & 0 deletions src/test/java/com/opus/opus/restdocs/RestDocsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,15 @@
import com.opus.opus.global.security.JwtProvider;
import com.opus.opus.global.security.annotation.MemberArgumentResolver;
import com.opus.opus.helper.ApiTestHelper;
import com.opus.opus.modules.contest.api.ContestCategoryController;
import com.opus.opus.modules.contest.api.ContestController;
import com.opus.opus.modules.contest.api.ContestTrackController;
import com.opus.opus.modules.contest.application.ContestCategoryCommandService;
import com.opus.opus.modules.contest.application.ContestCategoryQueryService;
import com.opus.opus.modules.contest.application.ContestCommandService;
import com.opus.opus.modules.contest.application.ContestQueryService;
import com.opus.opus.modules.contest.application.ContestTrackCommandService;
import com.opus.opus.modules.contest.application.ContestTrackQueryService;
import com.opus.opus.modules.member.api.MemberController;
import com.opus.opus.modules.member.application.MemberCommandService;
import com.opus.opus.modules.member.application.MemberQueryService;
Expand Down Expand Up @@ -46,6 +52,8 @@
TeamMemberController.class,
ContestController.class,
TeamCommentController.class,
ContestCategoryController.class,
ContestTrackController.class,
})
@Import(RestDocsConfig.class)
@ExtendWith(RestDocumentationExtension.class)
Expand Down Expand Up @@ -85,6 +93,18 @@ public abstract class RestDocsTest extends ApiTestHelper {
@MockitoBean
protected ContestQueryService contestQueryService;

@MockitoBean
protected ContestCategoryCommandService contestCategoryCommandService;

@MockitoBean
protected ContestCategoryQueryService contestCategoryQueryService;

@MockitoBean
protected ContestTrackCommandService contestTrackCommandService;

@MockitoBean
protected ContestTrackQueryService contestTrackQueryService;

// Setting
@Autowired
protected WebApplicationContext context;
Expand Down
Loading