From deb0510b7f4e3137ab489ccf987c6445005163ba Mon Sep 17 00:00:00 2001 From: dldmsql Date: Sat, 14 Sep 2024 18:13:17 +0900 Subject: [PATCH] =?UTF-8?q?feat:=204=EC=B0=A8=20MVP=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/controller/BoardController.kt | 7 +- .../board/controller/dto/BoardGetResponse.kt | 7 +- .../domain/board/entity/BoardEntity.kt | 15 --- .../board/repository/BoardJooqRepository.kt | 3 +- .../repository/BoardJooqRepositoryImpl.kt | 13 +- .../board/repository/vo/BoardGetOneVo.kt | 16 +++ .../domain/board/service/BoardService.kt | 29 ++-- .../controller/BoardStickerController.kt | 40 ++++++ .../board/sticker/dto/StickerCreateRequest.kt | 10 ++ .../board/sticker/dto/StickerGetResponse.kt | 9 ++ .../repository/BoardStickerRepository.kt | 11 ++ .../repository/BoardStickerRepositoryImpl.kt | 65 +++++++++ .../board/sticker/service/StickerService.kt | 20 +++ .../controller/BoardPolaroidV2Controller.kt | 7 +- .../controller/dto/PolaroidCreateRequest.kt | 5 +- .../controller/dto/PolaroidGetResponse.kt | 5 +- .../polaroid/enumerate/PolaroidOption.kt | 7 + .../repository/PolaroidJooqRepositoryImpl.kt | 3 + .../polaroid/service/PolaroidService.kt | 6 +- .../global/config/SecurityConfig.kt | 1 + .../sonnypolabobe/global/entity/BaseEntity.kt | 12 -- .../global/security/LoggingFilter.kt | 125 ------------------ 22 files changed, 238 insertions(+), 178 deletions(-) delete mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/entity/BoardEntity.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/vo/BoardGetOneVo.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/controller/BoardStickerController.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerCreateRequest.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerGetResponse.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepository.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepositoryImpl.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/service/StickerService.kt create mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/enumerate/PolaroidOption.kt delete mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/global/entity/BaseEntity.kt delete mode 100644 src/main/kotlin/com/ddd/sonnypolabobe/global/security/LoggingFilter.kt diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/BoardController.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/BoardController.kt index 770e4dd..06bc890 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/BoardController.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/BoardController.kt @@ -28,19 +28,18 @@ class BoardController( """ ) @PostMapping - fun create(@RequestBody request: BoardCreateRequest) - : ApplicationResponse { + fun create(@RequestBody request: BoardCreateRequest) : ApplicationResponse { val user = SecurityContextHolder.getContext().authentication.principal as UserDto.Companion.Res request.userId = user.id return ApplicationResponse.ok(this.boardService.create(request)) } - @Tag(name = "1.2.0") + @Tag(name = "1.3.0") @Operation( summary = "보드 조회", description = """ 보드를 조회합니다. - DTO 필드 수정했습니다. 폴라로이드에 닉네임 필드 추가 + DTO 필드 수정했습니다. 스티커 리스트 추가했습니다. """ ) diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/dto/BoardGetResponse.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/dto/BoardGetResponse.kt index a39545f..787e8c7 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/dto/BoardGetResponse.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/controller/dto/BoardGetResponse.kt @@ -1,11 +1,14 @@ package com.ddd.sonnypolabobe.domain.board.controller.dto +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerGetResponse import com.ddd.sonnypolabobe.domain.polaroid.controller.dto.PolaroidGetResponse import io.swagger.v3.oas.annotations.media.Schema data class BoardGetResponse( @Schema(description = "제목", example = "쏘니의 보드") val title: String, - @Schema(description = "작성자", example = "작성자입니다.") - val items: List + @Schema(description = "폴라로이드") + val items: List, + @Schema(description = "스티커 리스트") + val stickers : List? ) \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/entity/BoardEntity.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/entity/BoardEntity.kt deleted file mode 100644 index 439bb3f..0000000 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/entity/BoardEntity.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.ddd.sonnypolabobe.domain.board.entity - -import com.ddd.sonnypolabobe.global.entity.BaseEntity -import com.ddd.sonnypolabobe.global.util.UuidGenerator -import java.time.LocalDateTime -import java.util.* - -class BoardEntity() : BaseEntity { - override val id: UUID = UuidGenerator.create() - var title: String = "" - var userId : UUID? = null - override var yn: Boolean = true - override val createdAt: LocalDateTime = LocalDateTime.now() - override var updatedAt: LocalDateTime = LocalDateTime.now() -} \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepository.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepository.kt index 63e2c14..8774419 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepository.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepository.kt @@ -2,6 +2,7 @@ package com.ddd.sonnypolabobe.domain.board.repository import com.ddd.sonnypolabobe.domain.board.controller.dto.BoardCreateRequest import com.ddd.sonnypolabobe.domain.board.my.dto.MyBoardDto +import com.ddd.sonnypolabobe.domain.board.repository.vo.BoardGetOneVo import com.ddd.sonnypolabobe.domain.user.dto.GenderType import com.ddd.sonnypolabobe.jooq.polabo.tables.Board import org.jooq.Record6 @@ -12,7 +13,7 @@ import java.util.* interface BoardJooqRepository { fun insertOne(request: BoardCreateRequest): ByteArray? - fun selectOneById(id: UUID) : Array> + fun selectOneById(id: UUID) : List fun selectTotalCount(): Long fun selectTodayTotalCount(): Long fun findById(id: UUID): MyBoardDto.Companion.GetOneRes? diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepositoryImpl.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepositoryImpl.kt index ca423e7..c789736 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepositoryImpl.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/BoardJooqRepositoryImpl.kt @@ -3,12 +3,14 @@ package com.ddd.sonnypolabobe.domain.board.repository import com.ddd.sonnypolabobe.domain.board.controller.dto.BoardCreateRequest import com.ddd.sonnypolabobe.domain.board.controller.dto.BoardGetResponse import com.ddd.sonnypolabobe.domain.board.my.dto.MyBoardDto +import com.ddd.sonnypolabobe.domain.board.repository.vo.BoardGetOneVo import com.ddd.sonnypolabobe.domain.user.dto.GenderType import com.ddd.sonnypolabobe.global.util.DateConverter import com.ddd.sonnypolabobe.global.util.UuidConverter import com.ddd.sonnypolabobe.global.util.UuidGenerator import com.ddd.sonnypolabobe.jooq.polabo.enums.UserGender import com.ddd.sonnypolabobe.jooq.polabo.tables.Board +import com.ddd.sonnypolabobe.jooq.polabo.tables.BoardSticker import com.ddd.sonnypolabobe.jooq.polabo.tables.Polaroid import com.ddd.sonnypolabobe.jooq.polabo.tables.User import org.jooq.* @@ -43,18 +45,21 @@ class BoardJooqRepositoryImpl( return if (result == 1) id else null } - override fun selectOneById(id: UUID): Array> { + override fun selectOneById(id: UUID): List { val jBoard = Board.BOARD val jPolaroid = Polaroid.POLAROID + return this.dslContext .select( + jBoard.ID.convertFrom { it?.let{UuidConverter.byteArrayToUUID(it) } }, jBoard.TITLE, - jPolaroid.ID, + jPolaroid.ID.`as`(BoardGetOneVo::polaroidId.name), jPolaroid.IMAGE_KEY, jPolaroid.ONE_LINE_MESSAGE, jPolaroid.CREATED_AT, jPolaroid.USER_ID, - jPolaroid.NICKNAME + jPolaroid.NICKNAME, + jPolaroid.OPTIONS ) .from(jBoard) .leftJoin(jPolaroid).on( @@ -66,7 +71,7 @@ class BoardJooqRepositoryImpl( .and(jBoard.ACTIVEYN.eq(1)) ) .orderBy(jPolaroid.CREATED_AT.desc()) - .fetchArray() + .fetchInto(BoardGetOneVo::class.java) } diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/vo/BoardGetOneVo.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/vo/BoardGetOneVo.kt new file mode 100644 index 0000000..b178d79 --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/repository/vo/BoardGetOneVo.kt @@ -0,0 +1,16 @@ +package com.ddd.sonnypolabobe.domain.board.repository.vo + +import java.time.LocalDateTime +import java.util.UUID + +data class BoardGetOneVo( + val id: UUID?, + val title: String?, + val polaroidId : Long?, + val imageKey : String?, + val oneLineMessage: String?, + val createdAt: LocalDateTime?, + val userId : Long?, + val nickName: String?, + val options: String? +) diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/service/BoardService.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/service/BoardService.kt index 8d4b9e8..e5f715d 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/service/BoardService.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/service/BoardService.kt @@ -3,20 +3,27 @@ package com.ddd.sonnypolabobe.domain.board.service import com.ddd.sonnypolabobe.domain.board.controller.dto.BoardCreateRequest import com.ddd.sonnypolabobe.domain.board.controller.dto.BoardGetResponse import com.ddd.sonnypolabobe.domain.board.repository.BoardJooqRepository +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerGetResponse +import com.ddd.sonnypolabobe.domain.board.sticker.repository.BoardStickerRepository import com.ddd.sonnypolabobe.domain.polaroid.controller.dto.PolaroidGetResponse +import com.ddd.sonnypolabobe.domain.polaroid.enumerate.PolaroidOption import com.ddd.sonnypolabobe.domain.user.dto.UserDto import com.ddd.sonnypolabobe.global.exception.ApplicationException import com.ddd.sonnypolabobe.global.exception.CustomErrorCode import com.ddd.sonnypolabobe.global.security.AuthenticatedMember import com.ddd.sonnypolabobe.global.util.S3Util import com.ddd.sonnypolabobe.global.util.UuidConverter +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.ObjectMapper import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Service import java.util.* +import javax.swing.text.html.HTML.Tag.U @Service class BoardService( private val boardJooqRepository: BoardJooqRepository, + private val boardStickerRepository: BoardStickerRepository, private val s3Util: S3Util, @Value("\${limit.count}") private val limit: Int @@ -29,22 +36,24 @@ class BoardService( return id.run { val queryResult = boardJooqRepository.selectOneById(UuidConverter.stringToUUID(this@run)) - val groupByTitle = queryResult.groupBy { it.value1() } + val stickers = boardStickerRepository.findByBoardId(UuidConverter.stringToUUID(id)) + val groupByTitle = queryResult.groupBy { it.title } groupByTitle.map { entry -> val title = entry.key val polaroids = entry.value.map { PolaroidGetResponse( - id = it.value2() ?: 0L, - imageUrl = it.value3()?.let { it1 -> s3Util.getImgUrl(it1) } ?: "", - oneLineMessage = it.value4() ?: "폴라보와의 추억 한 줄", - userId = it.value6() ?: 0L, - nickname = it.value7() ?: "", - isMine = it.value6() == user?.id?.toLong(), - createdAt = it.value5() + id = it.polaroidId ?: 0L, + imageUrl = it.imageKey?.let { it1 -> s3Util.getImgUrl(it1) } ?: "", + oneLineMessage = it.oneLineMessage ?: "폴라보와의 추억 한 줄", + userId = it.userId ?: 0L, + nickname = it.nickName ?: "", + isMine = it.userId == user?.id?.toLong(), + createdAt = it.createdAt, + options = it.options?.let{ ObjectMapper().readValue(it, object : TypeReference>() {})} ) - }.filter { it.id != 0L } - BoardGetResponse(title = title ?: "", items = polaroids) + }.filter { it.id != 0L }.distinctBy { it.id } + BoardGetResponse(title = title ?: "", items = polaroids, stickers = stickers) } } } diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/controller/BoardStickerController.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/controller/BoardStickerController.kt new file mode 100644 index 0000000..2c7c60c --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/controller/BoardStickerController.kt @@ -0,0 +1,40 @@ +package com.ddd.sonnypolabobe.domain.board.sticker.controller + +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerCreateRequest +import com.ddd.sonnypolabobe.domain.board.sticker.service.StickerService +import com.ddd.sonnypolabobe.global.response.ApplicationResponse +import com.ddd.sonnypolabobe.global.security.JwtUtil +import io.swagger.v3.oas.annotations.tags.Tag +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/api/v1/boards/sticker") +class BoardStickerController( + private val jwtUtil: JwtUtil, + private val stickerService: StickerService +) { + + @Tag(name = "1.3.0") + @GetMapping("/recent") + fun getRecentList( @RequestHeader("Authorization") token: String?) + : ApplicationResponse> { + val user = token?.let { this.jwtUtil.getAuthenticatedMemberFromToken(it) } + return ApplicationResponse.ok(this.stickerService.getByUserId(user?.id?.toLong())) + } + + @Tag(name = "1.3.0") + @PostMapping + fun createStickerToBoard( + @RequestHeader("Authorization") token: String?, + @RequestBody req : StickerCreateRequest + ) : ApplicationResponse { + val user = token?.let { this.jwtUtil.getAuthenticatedMemberFromToken(it) } + this.stickerService.create(req, user?.id?.toLong()) + return ApplicationResponse.ok() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerCreateRequest.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerCreateRequest.kt new file mode 100644 index 0000000..21a391d --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerCreateRequest.kt @@ -0,0 +1,10 @@ +package com.ddd.sonnypolabobe.domain.board.sticker.dto + +data class StickerCreateRequest( + val boardId : String, + val stickerId: String, + val x : String, + val y : String, + val scale: String, + val rotate: String +) diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerGetResponse.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerGetResponse.kt new file mode 100644 index 0000000..a753316 --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/dto/StickerGetResponse.kt @@ -0,0 +1,9 @@ +package com.ddd.sonnypolabobe.domain.board.sticker.dto + +data class StickerGetResponse( + val id : String, + val x : String, + val y : String, + val scale: String, + val rotate : String +) diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepository.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepository.kt new file mode 100644 index 0000000..63cc2d5 --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepository.kt @@ -0,0 +1,11 @@ +package com.ddd.sonnypolabobe.domain.board.sticker.repository + +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerCreateRequest +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerGetResponse +import java.util.* + +interface BoardStickerRepository { + fun findByUserId(id: Long) : List + fun insertOne(req: StickerCreateRequest, userId: Long?) + fun findByBoardId(stringToUUID: UUID): List? +} \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepositoryImpl.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepositoryImpl.kt new file mode 100644 index 0000000..f04a7b9 --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/repository/BoardStickerRepositoryImpl.kt @@ -0,0 +1,65 @@ +package com.ddd.sonnypolabobe.domain.board.sticker.repository + +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerCreateRequest +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerGetResponse +import com.ddd.sonnypolabobe.global.util.DateConverter +import com.ddd.sonnypolabobe.global.util.UuidConverter +import com.ddd.sonnypolabobe.jooq.polabo.tables.BoardSticker +import org.jooq.DSLContext +import org.springframework.stereotype.Repository +import java.time.LocalDateTime +import java.util.* + +@Repository +class BoardStickerRepositoryImpl( + private val dslContext: DSLContext +) : BoardStickerRepository { + override fun findByUserId(userId: Long): List { + val jSticker = BoardSticker.BOARD_STICKER + return this.dslContext.selectDistinct(jSticker.STICKER_ID) + .from(jSticker) + .where(jSticker.USER_ID.eq(userId)) + .orderBy(jSticker.CREATED_AT.desc()) + .fetchInto(String::class.java) + } + + override fun insertOne(req: StickerCreateRequest, userId: Long?) { + val jSticker = BoardSticker.BOARD_STICKER + this.dslContext.insertInto(jSticker) + .columns( + jSticker.STICKER_ID, + jSticker.BOARD_ID, + jSticker.USER_ID, + jSticker.X, + jSticker.Y, + jSticker.SCALE, + jSticker.ROTATE, + jSticker.CREATED_AT + ).values( + req.stickerId, + UuidConverter.uuidToByteArray(UuidConverter.stringToUUID(req.boardId)), + userId, + req.x, + req.y, + req.scale, + req.rotate, + DateConverter.convertToKst(LocalDateTime.now()) + ).execute() + } + + override fun findByBoardId(stringToUUID: UUID): List? { + val jSticker = BoardSticker.BOARD_STICKER + return this.dslContext.select( + jSticker.ID, + jSticker.X, + jSticker.Y, + jSticker.SCALE, + jSticker.ROTATE + ) + .from(jSticker) + .where(jSticker.BOARD_ID.eq(UuidConverter.uuidToByteArray(stringToUUID))) + .fetchInto(StickerGetResponse::class.java) + } + + +} \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/service/StickerService.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/service/StickerService.kt new file mode 100644 index 0000000..4266e3a --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/board/sticker/service/StickerService.kt @@ -0,0 +1,20 @@ +package com.ddd.sonnypolabobe.domain.board.sticker.service + +import com.ddd.sonnypolabobe.domain.board.sticker.dto.StickerCreateRequest +import com.ddd.sonnypolabobe.domain.board.sticker.repository.BoardStickerRepository +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +class StickerService( + private val boardStickerRepository: BoardStickerRepository +) { + @Transactional(readOnly = true) + fun getByUserId(id: Long?): List + = id?.let { this.boardStickerRepository.findByUserId(id) } ?: emptyList() + + @Transactional + fun create(req: StickerCreateRequest, userId: Long?) { + this.boardStickerRepository.insertOne(req, userId) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/BoardPolaroidV2Controller.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/BoardPolaroidV2Controller.kt index 1ec8d84..65937ae 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/BoardPolaroidV2Controller.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/BoardPolaroidV2Controller.kt @@ -1,6 +1,7 @@ package com.ddd.sonnypolabobe.domain.polaroid.controller import com.ddd.sonnypolabobe.domain.polaroid.controller.dto.PolaroidCreateRequest +import com.ddd.sonnypolabobe.domain.polaroid.enumerate.PolaroidOption import com.ddd.sonnypolabobe.domain.polaroid.service.PolaroidService import com.ddd.sonnypolabobe.global.response.ApplicationResponse import com.ddd.sonnypolabobe.global.security.JwtUtil @@ -9,7 +10,7 @@ import io.swagger.v3.oas.annotations.tags.Tag import jakarta.validation.Valid import org.springframework.web.bind.annotation.* -@Tag(name = "1.1.0") +@Tag(name = "1.3.0") @RestController @RequestMapping("/api/v2/boards/{boardId}/polaroids") class BoardPolaroidV2Controller( @@ -21,7 +22,9 @@ class BoardPolaroidV2Controller( summary = "폴라로이드 생성", description = """ 폴라로이드를 생성합니다. - 작성자 닉네임이 추가되었습니다. + 옵션을 추가했습니다. + + enum에 따라 옵션을 선택해주세요. """ ) @PostMapping diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidCreateRequest.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidCreateRequest.kt index d9dbe69..bc93322 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidCreateRequest.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidCreateRequest.kt @@ -1,5 +1,6 @@ package com.ddd.sonnypolabobe.domain.polaroid.controller.dto +import com.ddd.sonnypolabobe.domain.polaroid.enumerate.PolaroidOption import io.swagger.v3.oas.annotations.media.Schema import jakarta.validation.constraints.Size @@ -11,5 +12,7 @@ data class PolaroidCreateRequest( @field:Size(max = 20) val oneLineMessage : String, @Schema(description = "작성자 닉네임이 null 이면서 회원가입된 유저라면, 유저의 닉네임을 자동할당합니다.", example = "작성자 닉네임") - var nickname : String? + var nickname : String?, + @Schema(description = "폴라로이드 옵션", examples = ["FONT", "FILTER", "THEMA"]) + val options : Map ) \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidGetResponse.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidGetResponse.kt index be7b0a8..c382f82 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidGetResponse.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/controller/dto/PolaroidGetResponse.kt @@ -1,5 +1,6 @@ package com.ddd.sonnypolabobe.domain.polaroid.controller.dto +import com.ddd.sonnypolabobe.domain.polaroid.enumerate.PolaroidOption import io.swagger.v3.oas.annotations.media.Schema import java.time.LocalDateTime import java.util.UUID @@ -18,5 +19,7 @@ data class PolaroidGetResponse( @Schema(description = "작성자인지 여부", example = "true") val isMine: Boolean, @Schema(description = "생성일시", example = "2021-01-01T00:00:00") - val createdAt: LocalDateTime? + val createdAt: LocalDateTime?, + @Schema(description = "옵션") + val options: Map? ) diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/enumerate/PolaroidOption.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/enumerate/PolaroidOption.kt new file mode 100644 index 0000000..84d18be --- /dev/null +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/enumerate/PolaroidOption.kt @@ -0,0 +1,7 @@ +package com.ddd.sonnypolabobe.domain.polaroid.enumerate + +enum class PolaroidOption(val description: String) { + FONT("폰트"), + FILTER("필터"), + THEMA("테마") +} \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/repository/PolaroidJooqRepositoryImpl.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/repository/PolaroidJooqRepositoryImpl.kt index 105bd08..da7e055 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/repository/PolaroidJooqRepositoryImpl.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/repository/PolaroidJooqRepositoryImpl.kt @@ -6,6 +6,7 @@ import com.ddd.sonnypolabobe.global.exception.CustomErrorCode import com.ddd.sonnypolabobe.global.util.DateConverter import com.ddd.sonnypolabobe.jooq.polabo.tables.Polaroid import com.ddd.sonnypolabobe.jooq.polabo.tables.records.PolaroidRecord +import com.fasterxml.jackson.databind.ObjectMapper import org.jooq.DSLContext import org.springframework.stereotype.Repository import java.time.LocalDateTime @@ -22,6 +23,7 @@ class PolaroidJooqRepositoryImpl(private val dslContext: DSLContext) : PolaroidJ this.yn = 1 this.activeyn = 1 this.nickname = request.nickname + this.options = ObjectMapper().writeValueAsString(request.options) } return this.dslContext.insertInto(jPolaroid) .set(insertValue) @@ -40,6 +42,7 @@ class PolaroidJooqRepositoryImpl(private val dslContext: DSLContext) : PolaroidJ this.yn = 1 this.activeyn = 1 this.nickname = request.nickname + this.options = ObjectMapper().writeValueAsString(request.options) } return this.dslContext.insertInto(jPolaroid) .set(insertValue) diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/service/PolaroidService.kt b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/service/PolaroidService.kt index 645e020..3047615 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/service/PolaroidService.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/domain/polaroid/service/PolaroidService.kt @@ -3,12 +3,15 @@ package com.ddd.sonnypolabobe.domain.polaroid.service import com.ddd.sonnypolabobe.domain.board.repository.BoardJooqRepository import com.ddd.sonnypolabobe.domain.polaroid.controller.dto.PolaroidCreateRequest import com.ddd.sonnypolabobe.domain.polaroid.controller.dto.PolaroidGetResponse +import com.ddd.sonnypolabobe.domain.polaroid.enumerate.PolaroidOption import com.ddd.sonnypolabobe.domain.polaroid.repository.PolaroidJooqRepository import com.ddd.sonnypolabobe.domain.user.dto.UserDto import com.ddd.sonnypolabobe.global.exception.ApplicationException import com.ddd.sonnypolabobe.global.exception.CustomErrorCode import com.ddd.sonnypolabobe.global.util.S3Util import com.ddd.sonnypolabobe.global.util.UuidConverter +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.ObjectMapper import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -44,7 +47,8 @@ class PolaroidService( userId = it.userId, nickname = it.nickname ?: "", isMine = boardWriter.userId == user.id, - createdAt = it.createdAt + createdAt = it.createdAt, + options = it.options?.let{ ObjectMapper().readValue(it, object : TypeReference>() {})} ) } } diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/global/config/SecurityConfig.kt b/src/main/kotlin/com/ddd/sonnypolabobe/global/config/SecurityConfig.kt index 050687b..500d5e5 100644 --- a/src/main/kotlin/com/ddd/sonnypolabobe/global/config/SecurityConfig.kt +++ b/src/main/kotlin/com/ddd/sonnypolabobe/global/config/SecurityConfig.kt @@ -38,6 +38,7 @@ class SecurityConfig( "/api/v1/polaroids/{id}", "/api/v1/boards/{boardId}/polaroids", "/api/v2/boards/{boardId}/polaroids", + "/api/v1/boards/stickers/recent" ) } @Bean diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/global/entity/BaseEntity.kt b/src/main/kotlin/com/ddd/sonnypolabobe/global/entity/BaseEntity.kt deleted file mode 100644 index 08c6aa3..0000000 --- a/src/main/kotlin/com/ddd/sonnypolabobe/global/entity/BaseEntity.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.ddd.sonnypolabobe.global.entity - -import java.time.LocalDateTime -import java.util.UUID - -interface BaseEntity { - val id : UUID - val yn : Boolean - val createdAt : LocalDateTime - val updatedAt : LocalDateTime - -} \ No newline at end of file diff --git a/src/main/kotlin/com/ddd/sonnypolabobe/global/security/LoggingFilter.kt b/src/main/kotlin/com/ddd/sonnypolabobe/global/security/LoggingFilter.kt deleted file mode 100644 index ccd0de8..0000000 --- a/src/main/kotlin/com/ddd/sonnypolabobe/global/security/LoggingFilter.kt +++ /dev/null @@ -1,125 +0,0 @@ -//package com.ddd.sonnypolabobe.global.security -// -//import com.ddd.sonnypolabobe.global.exception.CustomErrorCode -//import com.ddd.sonnypolabobe.global.util.DiscordApiClient -//import com.ddd.sonnypolabobe.global.util.HttpLog -//import com.ddd.sonnypolabobe.logger -//import jakarta.servlet.FilterChain -//import jakarta.servlet.ServletRequest -//import jakarta.servlet.ServletResponse -//import jakarta.servlet.http.HttpServletRequest -//import jakarta.servlet.http.HttpServletResponse -//import org.springframework.stereotype.Component -//import org.springframework.web.filter.GenericFilterBean -//import org.springframework.web.util.ContentCachingRequestWrapper -//import org.springframework.web.util.ContentCachingResponseWrapper -//import org.springframework.web.util.WebUtils -//import java.io.UnsupportedEncodingException -//import java.util.* -// -//@Component -//class LoggingFilter( -// private val discordApiClient: DiscordApiClient -//) : GenericFilterBean() { -// private val excludedUrls = setOf("/actuator", "/swagger-ui", "/v3/api-docs") -// -// override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { -// val requestWrapper: ContentCachingRequestWrapper = -// ContentCachingRequestWrapper(request as HttpServletRequest) -// val responseWrapper: ContentCachingResponseWrapper = -// ContentCachingResponseWrapper(response as HttpServletResponse) -// if (excludeLogging(request.requestURI)) { -// chain.doFilter(request, response) -// } else { -// val startedAt = System.currentTimeMillis() -// chain.doFilter(requestWrapper, responseWrapper) -// val endedAt = System.currentTimeMillis() -// -// logger().info( -// "\n" + -// "[REQUEST] ${request.method} - ${request.requestURI} ${responseWrapper.status} - ${(endedAt - startedAt) / 10000.0} \n" + -// "Headers : ${getHeaders(request)} \n" + -// "Parameters : ${getRequestParams(request)} \n" + -// "Request body : ${getRequestBody(requestWrapper)} \n" + -// "Response body : ${getResponseBody(responseWrapper)}" -// ) -// -// if(responseWrapper.status >= 400 && getResponseBody(responseWrapper).contains(CustomErrorCode.INTERNAL_SERVER_EXCEPTION.message)) { -// this.discordApiClient.sendErrorLog( -// HttpLog( -// request.method, -// request.requestURI, -// responseWrapper.status, -// (endedAt - startedAt) / 10000.0, -// getHeaders(request), -// getRequestParams(request), -// getRequestBody(requestWrapper), -// getResponseBody(responseWrapper) -// ) -// ) -// } -// } -// } -// -// private fun excludeLogging(requestURI: String): Boolean { -// return excludedUrls.any { requestURI.startsWith(it) } -// } -// -// private fun getResponseBody(response: ContentCachingResponseWrapper): String { -// var payload: String? = null -// response.characterEncoding = "utf-8" -// val wrapper = -// WebUtils.getNativeResponse(response, ContentCachingResponseWrapper::class.java) -// if (wrapper != null) { -// val buf = wrapper.contentAsByteArray -// if (buf.isNotEmpty()) { -// payload = String(buf, 0, buf.size, charset(wrapper.characterEncoding)) -// wrapper.copyBodyToResponse() -// } -// } -// return payload ?: " - " -// } -// -// private fun getRequestBody(request: ContentCachingRequestWrapper): String { -// request.characterEncoding = "utf-8" -// val wrapper = WebUtils.getNativeRequest( -// request, -// ContentCachingRequestWrapper::class.java -// ) -// if (wrapper != null) { -// val buf = wrapper.contentAsByteArray -// if (buf.isNotEmpty()) { -// return try { -// String(buf, 0, buf.size, charset(wrapper.characterEncoding)) -// } catch (e: UnsupportedEncodingException) { -// " - " -// } -// } -// } -// return " - " -// } -// -// private fun getRequestParams(request: HttpServletRequest): Map { -// val parameterMap: MutableMap = HashMap() -// request.characterEncoding = "utf-8" -// val parameterArray: Enumeration<*> = request.parameterNames -// -// while (parameterArray.hasMoreElements()) { -// val parameterName = parameterArray.nextElement() as String -// parameterMap[parameterName] = request.getParameter(parameterName) -// } -// -// return parameterMap -// } -// -// private fun getHeaders(request: HttpServletRequest): Map { -// val headerMap: MutableMap = HashMap() -// -// val headerArray: Enumeration<*> = request.headerNames -// while (headerArray.hasMoreElements()) { -// val headerName = headerArray.nextElement() as String -// headerMap[headerName] = request.getHeader(headerName) -// } -// return headerMap -// } -//} \ No newline at end of file