Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
49f5d27
[BOOK-480] refactor: apis - emotionTags๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๋„ ํ—ˆ์šฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— valid ํŒจํ„ด ์ œ๊ฑฐ
move-hoon Dec 24, 2025
b3c30f2
[BOOK-480] feat: infra - ๊ฐ์ • ์‹œ์Šคํ…œ DB ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ถ”๊ฐ€
move-hoon Dec 24, 2025
3a85de7
[BOOK-480] feat: domain - PrimaryEmotion ๋Œ€๋ถ„๋ฅ˜ ๊ฐ์ • enum ์ถ”๊ฐ€
move-hoon Dec 24, 2025
3b2914b
[BOOK-480] feat: domain - DetailTag ์„ธ๋ถ€๊ฐ์ • ๋„๋ฉ”์ธ ๋ฐ Repository ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€
move-hoon Dec 24, 2025
84b94c8
[BOOK-480] feat: domain - ReadingRecordDetailTag ์—ฐ๊ฒฐ ๋„๋ฉ”์ธ ๋ฐ Repository โ€ฆ
move-hoon Dec 24, 2025
4045ca8
[BOOK-480] feat: infra - DetailTag ์—”ํ‹ฐํ‹ฐ ๋ฐ Repository ๊ตฌํ˜„์ฒด ์ถ”๊ฐ€
move-hoon Dec 24, 2025
aa4cc4a
[BOOK-480] feat: infra - ReadingRecordDetailTag ์—”ํ‹ฐํ‹ฐ ๋ฐ Repository ๊ตฌํ˜„์ฒด ์ถ”๊ฐ€
move-hoon Dec 24, 2025
ee429a8
[BOOK-480] feat: domain, infra - ReadingRecord์— primaryEmotion ํ•„๋“œ ์ถ”๊ฐ€
move-hoon Dec 24, 2025
1b0caa4
[BOOK-480] feat: domain - ReadingRecordInfoVO์— V2์šฉ detailEmotions ํ•„๋“œ ์ถ”๊ฐ€
move-hoon Dec 24, 2025
900feed
[BOOK-480] feat: domain - DetailTagDomainService ์ถ”๊ฐ€
move-hoon Dec 24, 2025
28c7d82
[BOOK-480] feat: domain - ReadingRecordDetailTagDomainService ์ถ”๊ฐ€
move-hoon Dec 24, 2025
ce821c6
[BOOK-480] refactor: domain - ReadingRecordDomainService V2 ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ๋ฐ โ€ฆ
move-hoon Dec 24, 2025
8af8806
[BOOK-480] feat: apis - V2 Request/Response DTO ์ถ”๊ฐ€
move-hoon Dec 24, 2025
ff5b0b6
[BOOK-480] feat: apis - ReadingRecordServiceV2 ApplicationService ์ถ”๊ฐ€
move-hoon Dec 24, 2025
0cdf8d9
[BOOK-480] feat: apis - ReadingRecordUseCaseV2 ์œ ์Šค์ผ€์ด์Šค ์ถ”๊ฐ€
move-hoon Dec 24, 2025
31d58a3
[BOOK-480] feat: apis - ReadingRecordControllerV2 ์ปจํŠธ๋กค๋Ÿฌ ์ถ”๊ฐ€
move-hoon Dec 24, 2025
87b8b6c
[BOOK-480] feat: apis - EmotionController ๊ฐ์ • ๋ชฉ๋ก ์กฐํšŒ API ์ถ”๊ฐ€
move-hoon Dec 24, 2025
ad44b1d
[BOOK-480] fix: apis - V1 ReadingRecordResponse pageNumber nullable ํ˜ธโ€ฆ
move-hoon Dec 24, 2025
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.yapp.apis.emotion.controller

import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import org.yapp.apis.emotion.dto.response.EmotionListResponse
import org.yapp.apis.emotion.service.EmotionService

@RestController
@RequestMapping("/api/v2/emotions")
class EmotionController(
private val emotionService: EmotionService
) : EmotionControllerApi {

@GetMapping
override fun getEmotions(): ResponseEntity<EmotionListResponse> {
val response = emotionService.getEmotionList()
return ResponseEntity.ok(response)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.yapp.apis.emotion.controller

import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.media.Content
import io.swagger.v3.oas.annotations.media.Schema
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import io.swagger.v3.oas.annotations.tags.Tag
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.yapp.apis.emotion.dto.response.EmotionListResponse

@Tag(name = "Emotions", description = "๊ฐ์ • ๊ด€๋ จ API")
@RequestMapping("/api/v2/emotions")
interface EmotionControllerApi {

@Operation(
summary = "๊ฐ์ • ๋ชฉ๋ก ์กฐํšŒ",
description = "๋Œ€๋ถ„๋ฅ˜ ๊ฐ์ •๊ณผ ์„ธ๋ถ€ ๊ฐ์ • ๋ชฉ๋ก์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค."
)
@ApiResponses(
value = [
ApiResponse(
responseCode = "200",
description = "๊ฐ์ • ๋ชฉ๋ก ์กฐํšŒ ์„ฑ๊ณต",
content = [Content(schema = Schema(implementation = EmotionListResponse::class))]
)
]
)
@GetMapping
fun getEmotions(): ResponseEntity<EmotionListResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.yapp.apis.emotion.dto.response

import io.swagger.v3.oas.annotations.media.Schema
import org.yapp.domain.detailtag.DetailTag
import org.yapp.domain.readingrecord.PrimaryEmotion
import java.util.UUID

@Schema(name = "EmotionListResponse", description = "๊ฐ์ • ๋ชฉ๋ก ์‘๋‹ต")
data class EmotionListResponse(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private construct ์•ˆ๋ถ™์–ด์žˆ๋Š” dtoํด๋ž˜์Šค๋“ค์ด ๋ช‡๋ช‡๊ฐœ ๋ณด์—ฌ์„œ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆด๊ฒŒ์š” !!

@field:Schema(description = "๊ฐ์ • ๊ทธ๋ฃน ๋ชฉ๋ก")
val emotions: List<EmotionGroupDto>
) {
companion object {
fun from(detailTags: List<DetailTag>): EmotionListResponse {
val grouped = detailTags.groupBy { it.primaryEmotion }

val emotions = PrimaryEmotion.entries.map { primary ->
EmotionGroupDto(
code = primary.name,
displayName = primary.displayName,
detailEmotions = grouped[primary]
?.sortedBy { it.displayOrder }
?.map { EmotionDetailDto(id = it.id.value, name = it.name) }
?: emptyList()
)
}

return EmotionListResponse(emotions = emotions)
}
}
}

@Schema(name = "EmotionGroupDto", description = "๊ฐ์ • ๊ทธ๋ฃน (๋Œ€๋ถ„๋ฅ˜ + ์„ธ๋ถ€๊ฐ์ •)")
data class EmotionGroupDto(
@field:Schema(description = "๋Œ€๋ถ„๋ฅ˜ ์ฝ”๋“œ", example = "JOY")
val code: String,

@field:Schema(description = "๋Œ€๋ถ„๋ฅ˜ ํ‘œ์‹œ ์ด๋ฆ„", example = "์ฆ๊ฑฐ์›€")
val displayName: String,

@field:Schema(description = "์„ธ๋ถ€ ๊ฐ์ • ๋ชฉ๋ก")
val detailEmotions: List<EmotionDetailDto>
)

@Schema(name = "EmotionDetailDto", description = "์„ธ๋ถ€ ๊ฐ์ •")
data class EmotionDetailDto(
@field:Schema(description = "์„ธ๋ถ€ ๊ฐ์ • ID", example = "123e4567-e89b-12d3-a456-426614174000")
val id: UUID,

@field:Schema(description = "์„ธ๋ถ€ ๊ฐ์ • ์ด๋ฆ„", example = "์„ค๋ ˆ๋Š”")
val name: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.yapp.apis.emotion.service

import org.yapp.apis.emotion.dto.response.EmotionListResponse
import org.yapp.domain.detailtag.DetailTagDomainService
import org.yapp.globalutils.annotation.ApplicationService

@ApplicationService
class EmotionService(
private val detailTagDomainService: DetailTagDomainService
) {
fun getEmotionList(): EmotionListResponse {
val detailTags = detailTagDomainService.findAll()
return EmotionListResponse.from(detailTags)
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
package org.yapp.apis.readingrecord.controller

import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.Parameter
import io.swagger.v3.oas.annotations.media.Content
import io.swagger.v3.oas.annotations.media.Schema
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import io.swagger.v3.oas.annotations.tags.Tag
import jakarta.validation.Valid
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import org.springframework.data.domain.Sort
import org.springframework.data.web.PageableDefault
import org.springframework.http.ResponseEntity
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.web.bind.annotation.*
import org.yapp.apis.readingrecord.dto.request.CreateReadingRecordRequestV2
import org.yapp.apis.readingrecord.dto.request.UpdateReadingRecordRequestV2
import org.yapp.apis.readingrecord.dto.response.ReadingRecordResponseV2
import org.yapp.domain.readingrecord.ReadingRecordSortType
import org.yapp.globalutils.exception.ErrorResponse
import java.util.*

@Tag(name = "Reading Records V2", description = "๋…์„œ ๊ธฐ๋ก ๊ด€๋ จ API (V2)")
@RequestMapping("/api/v2/reading-records")
interface ReadingRecordControllerApiV2 {

@Operation(
summary = "๋…์„œ ๊ธฐ๋ก ์ƒ์„ฑ (V2)",
description = "์‚ฌ์šฉ์ž์˜ ์ฑ…์— ๋Œ€ํ•œ ๋…์„œ ๊ธฐ๋ก์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ„๋ฅ˜ ๊ฐ์ •์€ ํ•„์ˆ˜, ์„ธ๋ถ€ ๊ฐ์ •์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค."
)
@ApiResponses(
value = [
ApiResponse(
responseCode = "201",
description = "๋…์„œ ๊ธฐ๋ก ์ƒ์„ฑ ์„ฑ๊ณต",
content = [Content(schema = Schema(implementation = ReadingRecordResponseV2::class))]
),
ApiResponse(
responseCode = "400",
description = "์ž˜๋ชป๋œ ์š”์ฒญ",
content = [Content(schema = Schema(implementation = ErrorResponse::class))]
),
ApiResponse(
responseCode = "404",
description = "์‚ฌ์šฉ์ž ๋˜๋Š” ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ",
content = [Content(schema = Schema(implementation = ErrorResponse::class))]
)
]
)
@PostMapping("/{userBookId}")
fun createReadingRecord(
@AuthenticationPrincipal @Parameter(description = "์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ID") userId: UUID,
@PathVariable @Parameter(description = "๋…์„œ ๊ธฐ๋ก์„ ์ƒ์„ฑํ•  ์‚ฌ์šฉ์ž ์ฑ… ID") userBookId: UUID,
@Valid @RequestBody @Parameter(description = "๋…์„œ ๊ธฐ๋ก ์ƒ์„ฑ ์š”์ฒญ ๊ฐ์ฒด") request: CreateReadingRecordRequestV2
): ResponseEntity<ReadingRecordResponseV2>

@Operation(
summary = "๋…์„œ ๊ธฐ๋ก ์ƒ์„ธ ์กฐํšŒ (V2)",
description = "๋…์„œ ๊ธฐ๋ก ID๋กœ ๋…์„œ ๊ธฐ๋ก ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค."
)
@ApiResponses(
value = [
ApiResponse(
responseCode = "200",
description = "๋…์„œ ๊ธฐ๋ก ์ƒ์„ธ ์กฐํšŒ ์„ฑ๊ณต",
content = [Content(schema = Schema(implementation = ReadingRecordResponseV2::class))]
),
ApiResponse(
responseCode = "404",
description = "์‚ฌ์šฉ์ž ๋˜๋Š” ๋…์„œ ๊ธฐ๋ก์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ",
content = [Content(schema = Schema(implementation = ErrorResponse::class))]
)
]
)
@GetMapping("/detail/{readingRecordId}")
fun getReadingRecordDetail(
@AuthenticationPrincipal @Parameter(description = "์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ID") userId: UUID,
@PathVariable @Parameter(description = "์กฐํšŒํ•  ๋…์„œ ๊ธฐ๋ก ID") readingRecordId: UUID
): ResponseEntity<ReadingRecordResponseV2>

@Operation(
summary = "๋…์„œ ๊ธฐ๋ก ๋ชฉ๋ก ์กฐํšŒ (V2)",
description = "์‚ฌ์šฉ์ž์˜ ์ฑ…์— ๋Œ€ํ•œ ๋…์„œ ๊ธฐ๋ก์„ ํŽ˜์ด์ง•ํ•˜์—ฌ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค."
)
@ApiResponses(
value = [
ApiResponse(
responseCode = "200",
description = "๋…์„œ ๊ธฐ๋ก ๋ชฉ๋ก ์กฐํšŒ ์„ฑ๊ณต"
),
ApiResponse(
responseCode = "404",
description = "์‚ฌ์šฉ์ž ๋˜๋Š” ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ",
content = [Content(schema = Schema(implementation = ErrorResponse::class))]
)
]
)
@GetMapping("/{userBookId}")
fun getReadingRecords(
@AuthenticationPrincipal @Parameter(description = "์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ID") userId: UUID,
@PathVariable @Parameter(description = "๋…์„œ ๊ธฐ๋ก์„ ์กฐํšŒํ•  ์‚ฌ์šฉ์ž ์ฑ… ID") userBookId: UUID,
@RequestParam(required = false) @Parameter(description = "์ •๋ ฌ ํƒ€์ž…") sort: ReadingRecordSortType?,
@PageableDefault(size = 10, sort = ["createdAt"], direction = Sort.Direction.DESC)
@Parameter(description = "ํŽ˜์ด์ง• ์ •๋ณด") pageable: Pageable
): ResponseEntity<Page<ReadingRecordResponseV2>>
Comment on lines +104 to +107
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿงน Nitpick | ๐Ÿ”ต Trivial

์ •๋ ฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ†  ํ•„์š”

sort ํŒŒ๋ผ๋ฏธํ„ฐ(ReadingRecordSortType)์™€ Pageable์˜ ๊ธฐ๋ณธ ์ •๋ ฌ(createdAt DESC)์ด ํ•จ๊ป˜ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ •๋ ฌ ์˜ต์…˜์ด ๋™์‹œ์— ์ „๋‹ฌ๋  ๊ฒฝ์šฐ ์–ด๋–ค ๊ฒƒ์ด ์šฐ์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ReadingRecordSortType์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์šฐ์„  ์ ์šฉ๋œ๋‹ค๋ฉด, Pageable์˜ sort ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API ๋ฌธ์„œ์— ์ด ๋™์ž‘์„ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜, Pageable์—์„œ sort๋ฅผ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”.

๐Ÿค– Prompt for AI Agents
In
apis/src/main/kotlin/org/yapp/apis/readingrecord/controller/ReadingRecordControllerApiV2.kt
around lines 104 to 107, the request accepts both a ReadingRecordSortType (sort)
and a Pageable with a default sort (createdAt DESC), causing ambiguity when both
are present; change handling so ReadingRecordSortType takes precedence by
ignoring Pageable.sort when sort != null: remove or neutralize the sort in the
@PageableDefault (or stop relying on its sort), and in the controller construct
a new Pageable (PageRequest.of(pageable.pageNumber, pageable.pageSize,
sortFromEnum)) when sort is provided, otherwise use the incoming pageable as-is;
alternatively document explicitly in the API that ReadingRecordSortType
overrides Pageable.sort if you prefer not to change code.


@Operation(
summary = "๋…์„œ ๊ธฐ๋ก ์ˆ˜์ • (V2)",
description = "๋…์„œ ๊ธฐ๋ก์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ„๋ฅ˜ ๊ฐ์ •๊ณผ ์„ธ๋ถ€ ๊ฐ์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
)
@ApiResponses(
value = [
ApiResponse(
responseCode = "200",
description = "๋…์„œ ๊ธฐ๋ก ์ˆ˜์ • ์„ฑ๊ณต",
content = [Content(schema = Schema(implementation = ReadingRecordResponseV2::class))]
),
ApiResponse(
responseCode = "404",
description = "๋…์„œ ๊ธฐ๋ก์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ",
content = [Content(schema = Schema(implementation = ErrorResponse::class))]
)
]
)
@PutMapping("/{readingRecordId}")
fun updateReadingRecord(
@AuthenticationPrincipal @Parameter(description = "์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ID") userId: UUID,
@PathVariable @Parameter(description = "์ˆ˜์ •ํ•  ๋…์„œ ๊ธฐ๋ก ID") readingRecordId: UUID,
@Valid @RequestBody @Parameter(description = "๋…์„œ ๊ธฐ๋ก ์ˆ˜์ • ์š”์ฒญ ๊ฐ์ฒด") request: UpdateReadingRecordRequestV2
): ResponseEntity<ReadingRecordResponseV2>

@Operation(
summary = "๋…์„œ ๊ธฐ๋ก ์‚ญ์ œ",
description = "๋…์„œ ๊ธฐ๋ก์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค."
)
@ApiResponses(
value = [
ApiResponse(responseCode = "204", description = "๋…์„œ ๊ธฐ๋ก ์‚ญ์ œ ์„ฑ๊ณต"),
ApiResponse(
responseCode = "404",
description = "๋…์„œ ๊ธฐ๋ก์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ",
content = [Content(schema = Schema(implementation = ErrorResponse::class))]
)
]
)
@DeleteMapping("/{readingRecordId}")
fun deleteReadingRecord(
@AuthenticationPrincipal @Parameter(description = "์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ID") userId: UUID,
@PathVariable @Parameter(description = "์‚ญ์ œํ•  ๋…์„œ ๊ธฐ๋ก ID") readingRecordId: UUID
): ResponseEntity<Void>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package org.yapp.apis.readingrecord.controller

import jakarta.validation.Valid
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import org.springframework.data.domain.Sort
import org.springframework.data.web.PageableDefault
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.web.bind.annotation.*
import org.yapp.apis.readingrecord.dto.request.CreateReadingRecordRequestV2
import org.yapp.apis.readingrecord.dto.request.UpdateReadingRecordRequestV2
import org.yapp.apis.readingrecord.dto.response.ReadingRecordResponseV2
import org.yapp.apis.readingrecord.usecase.ReadingRecordUseCaseV2
import org.yapp.domain.readingrecord.ReadingRecordSortType
import java.util.UUID

@RestController
@RequestMapping("/api/v2/reading-records")
class ReadingRecordControllerV2(
private val readingRecordUseCaseV2: ReadingRecordUseCaseV2
) : ReadingRecordControllerApiV2 {

@PostMapping("/{userBookId}")
override fun createReadingRecord(
@AuthenticationPrincipal userId: UUID,
@PathVariable userBookId: UUID,
@Valid @RequestBody request: CreateReadingRecordRequestV2
): ResponseEntity<ReadingRecordResponseV2> {
val response = readingRecordUseCaseV2.createReadingRecord(
userId = userId,
userBookId = userBookId,
request = request
)
return ResponseEntity.status(HttpStatus.CREATED).body(response)
}

@GetMapping("/detail/{readingRecordId}")
override fun getReadingRecordDetail(
@AuthenticationPrincipal userId: UUID,
@PathVariable readingRecordId: UUID
): ResponseEntity<ReadingRecordResponseV2> {
val response = readingRecordUseCaseV2.getReadingRecordDetail(
userId = userId,
readingRecordId = readingRecordId
)
return ResponseEntity.ok(response)
}

@GetMapping("/{userBookId}")
override fun getReadingRecords(
@AuthenticationPrincipal userId: UUID,
@PathVariable userBookId: UUID,
@RequestParam(required = false) sort: ReadingRecordSortType?,
@PageableDefault(size = 10, sort = ["createdAt"], direction = Sort.Direction.DESC)
pageable: Pageable
): ResponseEntity<Page<ReadingRecordResponseV2>> {
val response = readingRecordUseCaseV2.getReadingRecordsByUserBookId(
userId = userId,
userBookId = userBookId,
sort = sort,
pageable = pageable
)
return ResponseEntity.ok(response)
}

@PutMapping("/{readingRecordId}")
override fun updateReadingRecord(
@AuthenticationPrincipal userId: UUID,
@PathVariable readingRecordId: UUID,
@Valid @RequestBody request: UpdateReadingRecordRequestV2
): ResponseEntity<ReadingRecordResponseV2> {
val response = readingRecordUseCaseV2.updateReadingRecord(
userId = userId,
readingRecordId = readingRecordId,
request = request
)
return ResponseEntity.ok(response)
}

@DeleteMapping("/{readingRecordId}")
override fun deleteReadingRecord(
@AuthenticationPrincipal userId: UUID,
@PathVariable readingRecordId: UUID
): ResponseEntity<Void> {
readingRecordUseCaseV2.deleteReadingRecord(userId, readingRecordId)
return ResponseEntity.noContent().build()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,4 @@ data class CreateReadingRecordRequest private constructor(

fun validQuote(): String =
requireNotNull(quote) { "quote๋Š” null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." }

fun validEmotionTags(): List<String> = emotionTags
}
Loading