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 @@ -52,6 +52,12 @@ include::api/admin-file/file.adoc[]

'''

== Tasting Tag API

include::api/admin-tasting-tags/tasting-tags.adoc[]

'''

== Reference API

include::api/admin-reference/reference.adoc[]
Original file line number Diff line number Diff line change
@@ -1,29 +1,3 @@
=== 테이스팅 태그 목록 조회 ===

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

[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[]

'''

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

- 전체 지역(국가) 목록을 조회합니다.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
=== 테이스팅 태그 목록 조회 ===

- 테이스팅 태그 목록을 페이지네이션으로 조회합니다.
- 키워드로 한글명/영문명 검색이 가능합니다.

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

[discrete]
==== 요청 파라미터 ====

[discrete]
include::{snippets}/admin/tasting-tags/list/query-parameters.adoc[]
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/tasting-tags/{tagId}
----

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

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

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

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

'''

=== 테이스팅 태그 생성 ===

- 새로운 테이스팅 태그를 생성합니다.
- parentId를 지정하여 계층 구조를 만들 수 있습니다.

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

[discrete]
==== 요청 파라미터 ====

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

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

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

'''

=== 테이스팅 태그 수정 ===

- 기존 테이스팅 태그 정보를 수정합니다.

[source]
----
PUT /admin/api/v1/tasting-tags/{tagId}
----

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

[discrete]
include::{snippets}/admin/tasting-tags/update/path-parameters.adoc[]

[discrete]
==== 요청 파라미터 ====

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

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

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

'''

=== 테이스팅 태그 삭제 ===

- 테이스팅 태그를 삭제합니다.
- 자식 태그가 있는 경우 삭제할 수 없습니다.

[source]
----
DELETE /admin/api/v1/tasting-tags/{tagId}
----

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

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

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

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

'''

=== 테이스팅 태그 위스키 연결 ===

- 테이스팅 태그에 위스키를 벌크로 연결합니다.

[source]
----
POST /admin/api/v1/tasting-tags/{tagId}/alcohols
----

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

[discrete]
include::{snippets}/admin/tasting-tags/add-alcohols/path-parameters.adoc[]

[discrete]
==== 요청 파라미터 ====

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

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

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

'''

=== 테이스팅 태그 위스키 연결 해제 ===

- 테이스팅 태그에서 위스키 연결을 벌크로 해제합니다.

[source]
----
DELETE /admin/api/v1/tasting-tags/{tagId}/alcohols
----

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

[discrete]
include::{snippets}/admin/tasting-tags/remove-alcohols/path-parameters.adoc[]

[discrete]
==== 요청 파라미터 ====

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

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

[discrete]
include::{snippets}/admin/tasting-tags/remove-alcohols/response-fields.adoc[]
include::{snippets}/admin/tasting-tags/remove-alcohols/http-response.adoc[]
Original file line number Diff line number Diff line change
@@ -1,23 +1,72 @@
package app.bottlenote.alcohols.presentation

import app.bottlenote.alcohols.dto.request.AdminReferenceSearchRequest
import app.bottlenote.alcohols.dto.request.AdminTastingTagAlcoholRequest
import app.bottlenote.alcohols.dto.request.AdminTastingTagUpsertRequest
import app.bottlenote.alcohols.service.AlcoholReferenceService
import app.bottlenote.alcohols.service.TastingTagService
import app.bottlenote.global.data.response.GlobalResponse
import jakarta.validation.Valid
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.DeleteMapping
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.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController


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

@GetMapping
fun getAllTastingTags(@ModelAttribute request: AdminReferenceSearchRequest): ResponseEntity<*> {
return ResponseEntity.ok(alcoholReferenceService.findAllTastingTags(request))
}

@GetMapping("/{tagId}")
fun getTagDetail(@PathVariable tagId: Long): ResponseEntity<*> {
return GlobalResponse.ok(tastingTagService.getTagDetail(tagId))
}

@PostMapping
fun createTag(@RequestBody @Valid request: AdminTastingTagUpsertRequest): ResponseEntity<*> {
return GlobalResponse.ok(tastingTagService.createTag(request))
}

@PutMapping("/{tagId}")
fun updateTag(
@PathVariable tagId: Long,
@RequestBody @Valid request: AdminTastingTagUpsertRequest
): ResponseEntity<*> {
return GlobalResponse.ok(tastingTagService.updateTag(tagId, request))
}

@DeleteMapping("/{tagId}")
fun deleteTag(@PathVariable tagId: Long): ResponseEntity<*> {
return GlobalResponse.ok(tastingTagService.deleteTag(tagId))
}

@PostMapping("/{tagId}/alcohols")
fun addAlcoholsToTag(
@PathVariable tagId: Long,
@RequestBody @Valid request: AdminTastingTagAlcoholRequest
): ResponseEntity<*> {
return GlobalResponse.ok(tastingTagService.addAlcoholsToTag(tagId, request.alcoholIds()))
}

@DeleteMapping("/{tagId}/alcohols")
fun removeAlcoholsFromTag(
@PathVariable tagId: Long,
@RequestBody @Valid request: AdminTastingTagAlcoholRequest
): ResponseEntity<*> {
return GlobalResponse.ok(tastingTagService.removeAlcoholsFromTag(tagId, request.alcoholIds()))
}
}
Loading