From 3216a70cf67616cd5e999968b98803b6ca8be2fd Mon Sep 17 00:00:00 2001 From: Leafguyk <81000589+Leafguyk@users.noreply.github.com> Date: Sat, 22 Feb 2025 23:56:29 +0900 Subject: [PATCH] rollback to 1/28 --- .../memoWithTags/memo/controller/Memo.kt | 10 +++---- .../memo/controller/MemoController.kt | 27 ++++++++++++----- .../memoWithTags/memo/dto/MemoRequest.kt | 19 ++++-------- .../memoWithTags/memo/dto/MemoResponse.kt | 21 ++++++-------- .../persistence/EmbeddingVectorConverter.kt | 22 -------------- .../memo/persistence/MemoEntity.kt | 9 +++--- .../memo/persistence/MemoRepository.kt | 2 +- .../memoWithTags/memo/service/MemoService.kt | 29 +++++++++++++++---- .../memoWithTags/tag/controller/Tag.kt | 8 ++--- .../tag/controller/TagController.kt | 6 ++-- .../memoWithTags/tag/dto/TagRequest.kt | 10 ------- .../memoWithTags/tag/persistence/TagEntity.kt | 14 ++++----- .../tag/persistence/TagRepository.kt | 4 +-- .../memoWithTags/tag/service/TagService.kt | 24 +++++++-------- 14 files changed, 90 insertions(+), 115 deletions(-) delete mode 100644 src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/EmbeddingVectorConverter.kt diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/Memo.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/Memo.kt index f3a4b96..fe168f0 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/Memo.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/Memo.kt @@ -5,24 +5,22 @@ import java.time.Instant import java.util.UUID class Memo( - val id: UUID, - val embeddingVector: List, + val id: Long, val content: String, val createdAt: Instant, val updatedAt: Instant, - val tagIds: List, + val tagIds: List, val locked: Boolean ) { companion object { fun fromEntity(entity: MemoEntity): Memo { return Memo( - id = entity.id, - embeddingVector = entity.embeddingVector, + id = entity.id!!, content = entity.content, createdAt = entity.createdAt, updatedAt = entity.updatedAt, tagIds = entity.memoTags.map { memoTagEntity -> - memoTagEntity.tag.id + memoTagEntity.tag.id!! }, locked = entity.locked ) diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/MemoController.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/MemoController.kt index 5de269a..ef81630 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/MemoController.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/controller/MemoController.kt @@ -1,9 +1,11 @@ package com.wafflestudio.toyproject.memoWithTags.memo.controller import com.wafflestudio.toyproject.memoWithTags.exception.MemoNotFoundException +import com.wafflestudio.toyproject.memoWithTags.memo.dto.MemoRequest.UpdateTagRequest import com.wafflestudio.toyproject.memoWithTags.memo.dto.MemoRequest.CreateMemoRequest import com.wafflestudio.toyproject.memoWithTags.memo.dto.MemoRequest.MemoSearchRequest import com.wafflestudio.toyproject.memoWithTags.memo.dto.MemoRequest.UpdateMemoRequest +import com.wafflestudio.toyproject.memoWithTags.memo.dto.MemoResponse.AddTagResponse import com.wafflestudio.toyproject.memoWithTags.memo.dto.MemoResponse.CreateMemoResponse import com.wafflestudio.toyproject.memoWithTags.memo.dto.MemoResponse.UpdateMemoResponse import com.wafflestudio.toyproject.memoWithTags.memo.dto.SearchResult @@ -22,7 +24,6 @@ import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController import java.time.Instant -import java.util.UUID @RestController class MemoController( @@ -43,10 +44,9 @@ class MemoController( @RequestBody request: CreateMemoRequest, @AuthUser user: User ): CreateMemoResponse { - val memo = memoService.createMemo(user, request.id, request.embeddingVector, request.content, request.tagIds, locked = request.locked) + val memo = memoService.createMemo(user, request.content, request.tagIds, locked = request.locked) return CreateMemoResponse( id = memo.id, - embeddingVector = memo.embeddingVector, content = memo.content, createdAt = memo.createdAt, updatedAt = memo.updatedAt, @@ -57,11 +57,11 @@ class MemoController( @PutMapping("/api/v1/memo/{memoId}") fun updateMemo( - @PathVariable memoId: UUID, + @PathVariable memoId: Long, @RequestBody request: UpdateMemoRequest, @AuthUser user: User ): UpdateMemoResponse { - val memo = memoService.updateMemo(userId = user.id, content = request.content, memoId = memoId, tagIds = request.tagIds, locked = request.locked, embeddingVector = request.embeddingVector) + val memo = memoService.updateMemo(userId = user.id, content = request.content, memoId = memoId, tagIds = request.tagIds, locked = request.locked) return UpdateMemoResponse( id = memo.id, content = memo.content, @@ -69,12 +69,11 @@ class MemoController( updatedAt = memo.updatedAt, tagIds = memo.tagIds, locked = memo.locked, - embeddingVector = memo.embeddingVector ) } @DeleteMapping("/api/v1/memo/{memoId}") - fun deleteMemo(@PathVariable memoId: UUID, @AuthUser user: User): ResponseEntity { + fun deleteMemo(@PathVariable memoId: Long, @AuthUser user: User): ResponseEntity { memoService.deleteMemo(memoId = memoId, userId = user.id) return ResponseEntity.noContent().build() } @@ -92,6 +91,20 @@ class MemoController( ) } + @PostMapping("/api/v1/memo/{memoId}/tag") + fun addTagToMemo(@PathVariable memoId: Long, @AuthUser user: User, @RequestBody addTagRequest: UpdateTagRequest): AddTagResponse { + memoService.addTag(userId = user.id, memoId = memoId, tagId = addTagRequest.tagId) + return AddTagResponse( + tagId = addTagRequest.tagId + ) + } + + @DeleteMapping("/api/v1/memo/{memoId}/tag") + fun deleteTagFromMemo(@PathVariable memoId: Long, @AuthUser user: User, @RequestBody deleteTagRequest: UpdateTagRequest): ResponseEntity { + memoService.deleteTag(userId = user.id, memoId = memoId, tagId = deleteTagRequest.tagId) + return ResponseEntity.noContent().build() + } + @GetMapping("/api/test") fun test() { println(Instant.now()) diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoRequest.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoRequest.kt index 74bdbc5..a010342 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoRequest.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoRequest.kt @@ -5,27 +5,20 @@ import java.util.UUID sealed class MemoRequest { data class CreateMemoRequest( - val id: UUID, val content: String, - val tagIds: List, - val locked: Boolean, - val embeddingVector: List, - val createdAt: Instant, - val updatedAt: Instant + val tagIds: List, + val locked: Boolean ) : MemoRequest() data class UpdateTagRequest( - val tagId: UUID + val tagId: Long ) : MemoRequest() data class UpdateMemoRequest( - val id: UUID, + val id: Long, val content: String, - val tagIds: List, - val locked: Boolean, - val embeddingVector: List, - val createdAt: Instant, - val updatedAt: Instant + val tagIds: List, + val locked: Boolean ) : MemoRequest() data class MemoSearchRequest( diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoResponse.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoResponse.kt index e0e9bd9..e8328f3 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoResponse.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/dto/MemoResponse.kt @@ -1,30 +1,27 @@ package com.wafflestudio.toyproject.memoWithTags.memo.dto import java.time.Instant -import java.util.UUID sealed class MemoResponse { data class AddTagResponse( - val tagId: UUID + val tagId: Long ) : MemoResponse() data class CreateMemoResponse( - val id: UUID, + val id: Long, val content: String, - val tagIds: List, - val locked: Boolean, - val embeddingVector: List, + val tagIds: List, val createdAt: Instant, - val updatedAt: Instant + val updatedAt: Instant, + val locked: Boolean ) : MemoResponse() data class UpdateMemoResponse( - val id: UUID, + val id: Long, val content: String, - val tagIds: List, - val locked: Boolean, - val embeddingVector: List, + val tagIds: List, val createdAt: Instant, - val updatedAt: Instant + val updatedAt: Instant, + val locked: Boolean ) : MemoResponse() } diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/EmbeddingVectorConverter.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/EmbeddingVectorConverter.kt deleted file mode 100644 index 9e45421..0000000 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/EmbeddingVectorConverter.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.wafflestudio.toyproject.memoWithTags.memo.persistence - -import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper -import com.fasterxml.jackson.module.kotlin.readValue -import jakarta.persistence.AttributeConverter -import jakarta.persistence.Converter - -@Converter(autoApply = true) -class EmbeddingVectorConverter : AttributeConverter, String> { - - companion object { - private val objectMapper = jacksonObjectMapper() - } - - override fun convertToDatabaseColumn(attribute: List?): String? { - return attribute?.let { objectMapper.writeValueAsString(it) } - } - - override fun convertToEntityAttribute(dbData: String?): List? { - return dbData.let { objectMapper.readValue(it!!) } - } -} diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoEntity.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoEntity.kt index 64bf344..cf9fe0f 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoEntity.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoEntity.kt @@ -5,6 +5,8 @@ import jakarta.persistence.CascadeType import jakarta.persistence.Column import jakarta.persistence.Convert import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.JoinColumn import jakarta.persistence.Lob @@ -16,7 +18,8 @@ import java.util.UUID @Entity(name = "memos") class MemoEntity( @Id - val id: UUID, + @GeneratedValue(strategy = GenerationType.IDENTITY) + val id: Long? = null, @Lob @Column(name = "content", nullable = false, columnDefinition = "TEXT") var content: String, @@ -27,10 +30,6 @@ class MemoEntity( @Column(name = "updated_at", nullable = false) var updatedAt: Instant, - @Convert(converter = EmbeddingVectorConverter::class) - @Column(columnDefinition = "TEXT") - var embeddingVector: List = emptyList(), - @ManyToOne @JoinColumn(name = "user_id") val user: UserEntity, diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoRepository.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoRepository.kt index 548d84a..77e5198 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoRepository.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/persistence/MemoRepository.kt @@ -3,4 +3,4 @@ package com.wafflestudio.toyproject.memoWithTags.memo.persistence import org.springframework.data.jpa.repository.JpaRepository import java.util.UUID -interface MemoRepository : JpaRepository, MemoRepositoryCustom +interface MemoRepository : JpaRepository, MemoRepositoryCustom diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/service/MemoService.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/service/MemoService.kt index d33d6f7..247bd26 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/service/MemoService.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/memo/service/MemoService.kt @@ -2,6 +2,7 @@ package com.wafflestudio.toyproject.memoWithTags.memo.service import com.wafflestudio.toyproject.memoWithTags.exception.AccessDeniedException import com.wafflestudio.toyproject.memoWithTags.exception.MemoNotFoundException +import com.wafflestudio.toyproject.memoWithTags.exception.TagNotFoundException import com.wafflestudio.toyproject.memoWithTags.memo.controller.Memo import com.wafflestudio.toyproject.memoWithTags.memo.dto.SearchResult import com.wafflestudio.toyproject.memoWithTags.memo.persistence.MemoEntity @@ -23,12 +24,10 @@ class MemoService( private val userService: UserService ) { @Transactional - fun createMemo(user: User, id: UUID, embeddingVector: List, content: String, tagIds: List, locked: Boolean): Memo { + fun createMemo(user: User, content: String, tagIds: List, locked: Boolean): Memo { val tags: List = tagRepository.findAllById(tagIds) val userEntity = userService.getUserEntityByEmail(user.email) val memoEntity = MemoEntity( - id = id, - embeddingVector = embeddingVector, content = content, createdAt = Instant.now(), updatedAt = Instant.now(), @@ -45,7 +44,7 @@ class MemoService( } @Transactional - fun updateMemo(userId: UUID, content: String, memoId: UUID, tagIds: List, locked: Boolean, embeddingVector: List): Memo { + fun updateMemo(userId: UUID, content: String, memoId: Long, tagIds: List, locked: Boolean): Memo { val memo = memoRepository.findById(memoId) .orElseThrow { MemoNotFoundException() } if (memo.user.id != userId) { @@ -63,18 +62,36 @@ class MemoService( memo.content = content memo.updatedAt = Instant.now() memo.locked = locked - memo.embeddingVector = embeddingVector return Memo.fromEntity(memoRepository.save(memo)) } @Transactional - fun deleteMemo(userId: UUID, memoId: UUID) { + fun deleteMemo(userId: UUID, memoId: Long) { val memo = memoRepository.findById(memoId).orElseThrow { MemoNotFoundException() } if (memo.user.id != userId) { throw AccessDeniedException() } memoRepository.delete(memo) } + @Transactional + fun addTag(userId: UUID, memoId: Long, tagId: Long) { + val memo = memoRepository.findById(memoId).orElseThrow { MemoNotFoundException() } + if (memo.user.id != userId) { throw AccessDeniedException() } + val tag = tagRepository.findById(tagId).orElseThrow { TagNotFoundException() } + val memoTag = MemoTagEntity(memo = memo, tag = tag) + memo.memoTags.add(memoTag) + } + + @Transactional + fun deleteTag(userId: UUID, memoId: Long, tagId: Long) { + val memo = memoRepository.findById(memoId).orElseThrow { MemoNotFoundException() } + if (memo.user.id != userId) { throw AccessDeniedException() } + val tag = tagRepository.findById(tagId).orElseThrow { TagNotFoundException() } + val memoTag = memo.memoTags.find { it.tag.id == tagId } ?: return + + memo.memoTags.remove(memoTag) // orphanRemoval 때문에 여기까지 끝 + } + @Transactional fun searchMemo(userId: UUID, content: String?, tags: List?, startDate: Instant?, endDate: Instant?, page: Int, pageSize: Int): SearchResult { return memoRepository.searchMemo(userId = userId, content = content, tags = tags, startDate = startDate, endDate = endDate, page = page, pageSize = pageSize) diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/Tag.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/Tag.kt index 4331456..1ff0467 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/Tag.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/Tag.kt @@ -5,20 +5,18 @@ import java.time.Instant import java.util.UUID data class Tag( - val id: UUID, + val id: Long, val name: String, val colorHex: String, - val embeddingVector: List, val createdAt: Instant, - val updatedAt: Instant? + val updatedAt: Instant ) { companion object { fun fromEntity(entity: TagEntity): Tag { return Tag( - id = entity.id, + id = entity.id!!, name = entity.name, colorHex = entity.colorHex, - embeddingVector = entity.embeddingVector, createdAt = entity.createdAt, updatedAt = entity.updatedAt ) diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/TagController.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/TagController.kt index 6b7a6fc..7ffd34d 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/TagController.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/controller/TagController.kt @@ -30,12 +30,12 @@ class TagController( } @PutMapping("/api/v1/tag/{tagId}") - fun updateTag(@PathVariable tagId: UUID, @RequestBody request: UpdateTagRequest, @AuthUser user: User): Tag { - return tagService.updateTag(request, user) + fun updateTag(@PathVariable tagId: Long, @RequestBody request: UpdateTagRequest, @AuthUser user: User): Tag { + return tagService.updateTag(tagId, request, user) } @DeleteMapping("/api/v1/tag/{tagId}") - fun deleteTag(@PathVariable tagId: UUID, @AuthUser user: User): ResponseEntity { + fun deleteTag(@PathVariable tagId: Long, @AuthUser user: User): ResponseEntity { tagService.deleteTag(tagId, user) return ResponseEntity.noContent().build() } diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/dto/TagRequest.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/dto/TagRequest.kt index 80a4074..fbcb195 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/dto/TagRequest.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/dto/TagRequest.kt @@ -1,24 +1,14 @@ package com.wafflestudio.toyproject.memoWithTags.tag.dto -import java.time.Instant -import java.util.UUID sealed class TagRequest { data class CreateTagRequest( - val id: UUID, val name: String, val colorHex: String, - val embeddingVector: List, - val createdAt: Instant, - val updatedAt: Instant? ) : TagRequest() data class UpdateTagRequest( - val id: UUID, val name: String, val colorHex: String, - val embeddingVector: List, - val createdAt: Instant, - val updatedAt: Instant? ) : TagResponse() } diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagEntity.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagEntity.kt index fbadaa2..09c204d 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagEntity.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagEntity.kt @@ -1,23 +1,23 @@ package com.wafflestudio.toyproject.memoWithTags.tag.persistence -import com.wafflestudio.toyproject.memoWithTags.memo.persistence.EmbeddingVectorConverter import com.wafflestudio.toyproject.memoWithTags.memo.persistence.MemoTagEntity import com.wafflestudio.toyproject.memoWithTags.user.persistence.UserEntity import jakarta.persistence.CascadeType import jakarta.persistence.Column -import jakarta.persistence.Convert import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.JoinColumn import jakarta.persistence.ManyToOne import jakarta.persistence.OneToMany import java.time.Instant -import java.util.UUID @Entity(name = "tags") class TagEntity( @Id - val id: UUID, + @GeneratedValue(strategy = GenerationType.IDENTITY) + val id: Long? = null, @Column(name = "name", nullable = false) var name: String, @@ -25,10 +25,6 @@ class TagEntity( @Column(name = "color", nullable = false) var colorHex: String, - @Convert(converter = EmbeddingVectorConverter::class) - @Column(columnDefinition = "TEXT") - var embeddingVector: List = emptyList(), - @ManyToOne @JoinColumn(name = "user_id") var user: UserEntity, @@ -37,7 +33,7 @@ class TagEntity( val createdAt: Instant = Instant.now(), @Column(name = "updated_at") - var updatedAt: Instant? = null, + var updatedAt: Instant = Instant.now(), @OneToMany(mappedBy = "tag", cascade = [CascadeType.ALL], orphanRemoval = true) val memoTags: MutableSet = mutableSetOf() diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagRepository.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagRepository.kt index 2023872..cd61004 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagRepository.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/persistence/TagRepository.kt @@ -1,8 +1,8 @@ package com.wafflestudio.toyproject.memoWithTags.tag.persistence -import org.springframework.data.jpa.repository.JpaRepository import java.util.UUID +import org.springframework.data.jpa.repository.JpaRepository -interface TagRepository : JpaRepository { +interface TagRepository : JpaRepository { fun findByUserId(userId: UUID): List } diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/service/TagService.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/service/TagService.kt index ce791fe..5afa518 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/service/TagService.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/tag/service/TagService.kt @@ -10,6 +10,7 @@ import com.wafflestudio.toyproject.memoWithTags.tag.persistence.TagEntity import com.wafflestudio.toyproject.memoWithTags.tag.persistence.TagRepository import com.wafflestudio.toyproject.memoWithTags.user.controller.User import com.wafflestudio.toyproject.memoWithTags.user.persistence.UserRepository +import java.time.Instant import org.springframework.stereotype.Service import java.util.UUID @@ -19,52 +20,47 @@ class TagService( private val userRepository: UserRepository ) { fun getTags(user: User): List { - return tagRepository.findByUserId(user.id).map { Tag(it.id, it.name, it.colorHex, it.embeddingVector, it.createdAt, it.updatedAt) } + return tagRepository.findByUserId(user.id).map { Tag(it.id!!, it.name, it.colorHex, it.createdAt, it.updatedAt) } } fun createTag(request: CreateTagRequest, user: User): Tag { val userEntity = userRepository.findByEmail(user.email) ?: throw AuthenticationFailedException() val tagEntity = TagEntity( - id = request.id, name = request.name, colorHex = request.colorHex, - embeddingVector = request.embeddingVector, - createdAt = request.createdAt, - updatedAt = request.updatedAt, + createdAt = Instant.now(), + updatedAt = Instant.now(), user = userEntity ) val savedTagEntity = tagRepository.save(tagEntity) return Tag( - savedTagEntity.id, + savedTagEntity.id!!, savedTagEntity.name, savedTagEntity.colorHex, - savedTagEntity.embeddingVector, savedTagEntity.createdAt, savedTagEntity.updatedAt ) } - fun updateTag(request: UpdateTagRequest, user: User): Tag { - val tagEntity = tagRepository.findById(request.id).orElseThrow { throw TagNotFoundException() } + fun updateTag(tagId: Long, request: UpdateTagRequest, user: User): Tag { + val tagEntity = tagRepository.findById(tagId).orElseThrow { throw TagNotFoundException() } if (tagEntity.user.email != user.email) { throw TagNotOwnedByUserException() } tagEntity.name = request.name tagEntity.colorHex = request.colorHex - tagEntity.embeddingVector = request.embeddingVector - tagEntity.updatedAt = request.updatedAt + tagEntity.updatedAt = Instant.now() val savedTagEntity = tagRepository.save(tagEntity) return Tag( - savedTagEntity.id, + savedTagEntity.id!!, savedTagEntity.name, savedTagEntity.colorHex, - savedTagEntity.embeddingVector, savedTagEntity.createdAt, savedTagEntity.updatedAt ) } - fun deleteTag(tagId: UUID, user: User) { + fun deleteTag(tagId: Long, user: User) { val tagEntity = tagRepository.findById(tagId).orElseThrow { throw TagNotFoundException() } if (tagEntity.user.email != user.email) { throw TagNotOwnedByUserException()