Skip to content
Merged
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
6 changes: 6 additions & 0 deletions bottlenote-admin-api/src/docs/asciidoc/admin-api.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,9 @@ include::api/admin-help/help.adoc[]
== File API

include::api/admin-file/file.adoc[]

'''

== Reference API

include::api/admin-reference/reference.adoc[]
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,30 @@ include::{snippets}/admin/alcohols/search/http-request.adoc[]
[discrete]
include::{snippets}/admin/alcohols/search/response-fields.adoc[]
include::{snippets}/admin/alcohols/search/http-response.adoc[]

'''

=== 술(Alcohol) 단건 상세 조회 ===

- 관리자용 술 단건 상세 조회 API입니다.
- 기본 정보, 카테고리, 스펙, 지역, 증류소, 테이스팅 태그, 통계 정보를 모두 포함합니다.

[source]
----
GET /admin/api/v1/alcohols/{alcoholId}
----

[discrete]
==== 경로 파라미터 ====

[discrete]
include::{snippets}/admin/alcohols/detail/path-parameters.adoc[]
include::{snippets}/admin/alcohols/detail/curl-request.adoc[]
include::{snippets}/admin/alcohols/detail/http-request.adoc[]

[discrete]
==== 응답 파라미터 ====

[discrete]
include::{snippets}/admin/alcohols/detail/response-fields.adoc[]
include::{snippets}/admin/alcohols/detail/http-response.adoc[]
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
=== 테이스팅 태그 목록 조회 ===

- 전체 테이스팅 태그 목록을 조회합니다.
- 술의 향미를 표현하는 태그 정보를 제공합니다.

[source]
----
GET /admin/api/v1/tasting-tags
----

[discrete]
==== 요청 ====

[discrete]
include::{snippets}/admin/tasting-tags/list/curl-request.adoc[]
include::{snippets}/admin/tasting-tags/list/http-request.adoc[]

[discrete]
==== 응답 파라미터 ====

[discrete]
include::{snippets}/admin/tasting-tags/list/response-fields.adoc[]
include::{snippets}/admin/tasting-tags/list/http-response.adoc[]

'''

=== 지역 목록 조회 ===

- 전체 지역(국가) 목록을 조회합니다.
- 술의 원산지 정보를 제공합니다.

[source]
----
GET /admin/api/v1/regions
----

[discrete]
==== 요청 ====

[discrete]
include::{snippets}/admin/regions/list/curl-request.adoc[]
include::{snippets}/admin/regions/list/http-request.adoc[]

[discrete]
==== 응답 파라미터 ====

[discrete]
include::{snippets}/admin/regions/list/response-fields.adoc[]
include::{snippets}/admin/regions/list/http-response.adoc[]

'''

=== 증류소 목록 조회 ===

- 전체 증류소 목록을 조회합니다.
- 술을 생산하는 증류소 정보를 제공합니다.

[source]
----
GET /admin/api/v1/distilleries
----

[discrete]
==== 요청 ====

[discrete]
include::{snippets}/admin/distilleries/list/curl-request.adoc[]
include::{snippets}/admin/distilleries/list/http-request.adoc[]

[discrete]
==== 응답 파라미터 ====

[discrete]
include::{snippets}/admin/distilleries/list/response-fields.adoc[]
include::{snippets}/admin/distilleries/list/http-response.adoc[]
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package app.bottlenote.alcohols.persentaton
package app.bottlenote.alcohols.presentation

import app.bottlenote.alcohols.dto.request.AdminAlcoholSearchRequest
import app.bottlenote.alcohols.service.AlcoholQueryService
import app.bottlenote.global.data.response.GlobalResponse
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

Expand All @@ -20,4 +21,9 @@ class AdminAlcoholsController(
fun searchAlcohols(@ModelAttribute request: AdminAlcoholSearchRequest): ResponseEntity<GlobalResponse> {
return ResponseEntity.ok(alcoholQueryService.searchAdminAlcohols(request))
}

@GetMapping("/{alcoholId}")
fun getAlcoholDetail(@PathVariable alcoholId: Long): ResponseEntity<*> {
return GlobalResponse.ok(alcoholQueryService.findAdminAlcoholDetailById(alcoholId))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package app.bottlenote.alcohols.presentation

import app.bottlenote.alcohols.dto.request.AdminReferenceSearchRequest
import app.bottlenote.alcohols.service.AlcoholReferenceService
import app.bottlenote.global.data.response.GlobalResponse
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController


@RestController
@RequestMapping("/distilleries")
class AdminDistilleryController(
private val alcoholReferenceService: AlcoholReferenceService
) {

@GetMapping
fun getAllDistilleries(@ModelAttribute request: AdminReferenceSearchRequest): ResponseEntity<*> {
return ResponseEntity.ok(alcoholReferenceService.findAllDistilleries(request))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package app.bottlenote.alcohols.presentation

import app.bottlenote.alcohols.dto.request.AdminReferenceSearchRequest
import app.bottlenote.alcohols.service.AlcoholReferenceService
import app.bottlenote.global.data.response.GlobalResponse
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController


@RestController
@RequestMapping("/regions")
class AdminRegionController(
private val alcoholReferenceService: AlcoholReferenceService
) {

@GetMapping
fun getAllRegions(@ModelAttribute request: AdminReferenceSearchRequest): ResponseEntity<*> {
return ResponseEntity.ok(alcoholReferenceService.findAllRegionsForAdmin(request))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package app.bottlenote.alcohols.presentation

import app.bottlenote.alcohols.dto.request.AdminReferenceSearchRequest
import app.bottlenote.alcohols.service.AlcoholReferenceService
import app.bottlenote.global.data.response.GlobalResponse
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController


@RestController
@RequestMapping("/tasting-tags")
class AdminTastingTagController(
private val alcoholReferenceService: AlcoholReferenceService
) {

@GetMapping
fun getAllTastingTags(@ModelAttribute request: AdminReferenceSearchRequest): ResponseEntity<*> {
return ResponseEntity.ok(alcoholReferenceService.findAllTastingTags(request))
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.bottlenote.auth.persentaton
package app.bottlenote.auth.presentation

import app.bottlenote.auth.config.RootAdminProperties
import app.bottlenote.global.data.response.GlobalResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package app.docs.alcohols
import app.bottlenote.alcohols.constant.AdminAlcoholSortType
import app.bottlenote.alcohols.constant.AlcoholCategoryGroup
import app.bottlenote.alcohols.dto.request.AdminAlcoholSearchRequest
import app.bottlenote.alcohols.persentaton.AdminAlcoholsController
import app.bottlenote.alcohols.presentation.AdminAlcoholsController
import app.bottlenote.alcohols.service.AlcoholQueryService
import app.bottlenote.global.service.cursor.SortOrder
import app.helper.alcohols.AlcoholsHelper
Expand All @@ -12,6 +12,7 @@ import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.BDDMockito.given
import org.mockito.Mockito.any
import org.mockito.Mockito.anyLong
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs
Expand All @@ -21,8 +22,7 @@ import org.springframework.restdocs.operation.preprocess.Preprocessors.*
import org.springframework.restdocs.payload.JsonFieldType
import org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath
import org.springframework.restdocs.payload.PayloadDocumentation.responseFields
import org.springframework.restdocs.request.RequestDocumentation.parameterWithName
import org.springframework.restdocs.request.RequestDocumentation.queryParameters
import org.springframework.restdocs.request.RequestDocumentation.*
import org.springframework.test.context.bean.override.mockito.MockitoBean
import org.springframework.test.web.servlet.assertj.MockMvcTester

Expand Down Expand Up @@ -117,4 +117,70 @@ class AdminAlcoholsControllerDocsTest {
)
)
}

@Test
@DisplayName("관리자용 술 단건 상세 조회를 할 수 있다")
fun getAlcoholDetail() {
// given
val response = AlcoholsHelper.createAdminAlcoholDetailResponse()

given(alcoholQueryService.findAdminAlcoholDetailById(anyLong()))
.willReturn(response)

// when & then
assertThat(
mvc.get().uri("/alcohols/{alcoholId}", 1L)
)
.hasStatusOk()
.apply(
document(
"admin/alcohols/detail",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint()),
pathParameters(
parameterWithName("alcoholId").description("술 ID")
),
responseFields(
fieldWithPath("success").type(JsonFieldType.BOOLEAN).description("응답 성공 여부"),
fieldWithPath("code").type(JsonFieldType.NUMBER).description("응답 코드"),
fieldWithPath("data").type(JsonFieldType.OBJECT).description("술 상세 정보"),
fieldWithPath("data.alcoholId").type(JsonFieldType.NUMBER).description("술 ID"),
fieldWithPath("data.korName").type(JsonFieldType.STRING).description("한글 이름"),
fieldWithPath("data.engName").type(JsonFieldType.STRING).description("영문 이름"),
fieldWithPath("data.imageUrl").type(JsonFieldType.STRING).description("이미지 URL"),
fieldWithPath("data.type").type(JsonFieldType.STRING).description("술 타입 (WHISKY 등)"),
fieldWithPath("data.korCategory").type(JsonFieldType.STRING).description("카테고리 한글명"),
fieldWithPath("data.engCategory").type(JsonFieldType.STRING).description("카테고리 영문명"),
fieldWithPath("data.categoryGroup").type(JsonFieldType.STRING).description("카테고리 그룹"),
fieldWithPath("data.abv").type(JsonFieldType.STRING).description("도수"),
fieldWithPath("data.age").type(JsonFieldType.STRING).description("숙성년도"),
fieldWithPath("data.cask").type(JsonFieldType.STRING).description("캐스크 타입"),
fieldWithPath("data.volume").type(JsonFieldType.STRING).description("용량"),
fieldWithPath("data.description").type(JsonFieldType.STRING).description("설명"),
fieldWithPath("data.regionId").type(JsonFieldType.NUMBER).description("지역 ID"),
fieldWithPath("data.korRegion").type(JsonFieldType.STRING).description("지역 한글명"),
fieldWithPath("data.engRegion").type(JsonFieldType.STRING).description("지역 영문명"),
fieldWithPath("data.distilleryId").type(JsonFieldType.NUMBER).description("증류소 ID"),
fieldWithPath("data.korDistillery").type(JsonFieldType.STRING).description("증류소 한글명"),
fieldWithPath("data.engDistillery").type(JsonFieldType.STRING).description("증류소 영문명"),
fieldWithPath("data.tastingTags").type(JsonFieldType.ARRAY).description("테이스팅 태그 목록"),
fieldWithPath("data.tastingTags[].id").type(JsonFieldType.NUMBER).description("태그 ID"),
fieldWithPath("data.tastingTags[].korName").type(JsonFieldType.STRING).description("태그 한글명"),
fieldWithPath("data.tastingTags[].engName").type(JsonFieldType.STRING).description("태그 영문명"),
fieldWithPath("data.avgRating").type(JsonFieldType.NUMBER).description("평균 평점"),
fieldWithPath("data.totalRatingsCount").type(JsonFieldType.NUMBER).description("평점 수"),
fieldWithPath("data.reviewCount").type(JsonFieldType.NUMBER).description("리뷰 수"),
fieldWithPath("data.pickCount").type(JsonFieldType.NUMBER).description("찜 수"),
fieldWithPath("data.createdAt").type(JsonFieldType.STRING).description("생성일시"),
fieldWithPath("data.modifiedAt").type(JsonFieldType.STRING).description("수정일시"),
fieldWithPath("errors").type(JsonFieldType.ARRAY).description("에러 목록"),
fieldWithPath("meta").type(JsonFieldType.OBJECT).description("메타 정보"),
fieldWithPath("meta.serverVersion").type(JsonFieldType.STRING).description("서버 버전").ignored(),
fieldWithPath("meta.serverEncoding").type(JsonFieldType.STRING).description("서버 인코딩").ignored(),
fieldWithPath("meta.serverResponseTime").type(JsonFieldType.STRING).description("서버 응답 시간").ignored(),
fieldWithPath("meta.serverPathVersion").type(JsonFieldType.STRING).description("API 경로 버전").ignored()
)
)
)
}
}
Loading