From 266a2712f541f4bcc7a47eb14d2f4444d43dd948 Mon Sep 17 00:00:00 2001 From: Youngho Date: Wed, 9 Aug 2023 00:02:02 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feature:=20Tag=EC=83=9D=EC=84=B1=20service?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/repository/TagRepository.java | 7 ++++ .../ourmemory/application/tag/TagService.java | 27 ++++++++++++ .../ui/tag/dto/TagCreateRequest.java | 15 +++++++ .../application/tag/TagServiceTest.java | 41 +++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java create mode 100644 our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java create mode 100644 our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagCreateRequest.java create mode 100644 our-memory/src/test/java/keepsake/ourmemory/application/tag/TagServiceTest.java diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java b/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java new file mode 100644 index 0000000..c062cd1 --- /dev/null +++ b/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java @@ -0,0 +1,7 @@ +package keepsake.ourmemory.application.repository; + +import keepsake.ourmemory.domain.tag.Tag; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TagRepository extends JpaRepository { +} diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java new file mode 100644 index 0000000..461f88e --- /dev/null +++ b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java @@ -0,0 +1,27 @@ +package keepsake.ourmemory.application.tag; + +import keepsake.ourmemory.application.repository.TagRepository; +import keepsake.ourmemory.domain.tag.Tag; +import keepsake.ourmemory.domain.tag.TagColor; +import keepsake.ourmemory.domain.tag.TagName; +import keepsake.ourmemory.ui.tag.dto.TagCreateRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@RequiredArgsConstructor +@Service +public class TagService { + + private final TagRepository tagRepository; + + public void createTag(TagCreateRequest request) { + TagName tagName = new TagName(request.getTagName()); + TagColor tagColor = new TagColor(request.getTagColor()); + Long memberId = request.getMemberId(); + + Tag tag = new Tag(memberId, tagName, tagColor); + tagRepository.save(tag); + } +} diff --git a/our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagCreateRequest.java b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagCreateRequest.java new file mode 100644 index 0000000..782f446 --- /dev/null +++ b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagCreateRequest.java @@ -0,0 +1,15 @@ +package keepsake.ourmemory.ui.tag.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class TagCreateRequest { + + private Long memberId; + private String tagName; + private String tagColor; +} diff --git a/our-memory/src/test/java/keepsake/ourmemory/application/tag/TagServiceTest.java b/our-memory/src/test/java/keepsake/ourmemory/application/tag/TagServiceTest.java new file mode 100644 index 0000000..2d3857e --- /dev/null +++ b/our-memory/src/test/java/keepsake/ourmemory/application/tag/TagServiceTest.java @@ -0,0 +1,41 @@ +package keepsake.ourmemory.application.tag; + +import keepsake.ourmemory.application.repository.TagRepository; +import keepsake.ourmemory.domain.tag.Tag; +import keepsake.ourmemory.domain.tag.TagColor; +import keepsake.ourmemory.domain.tag.TagName; +import keepsake.ourmemory.ui.tag.dto.TagCreateRequest; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; + +@ExtendWith(MockitoExtension.class) +class TagServiceTest { + + @InjectMocks + private TagService tagService; + + @Mock + private TagRepository tagRepository; + + @Test + void 태그를_생성한다() { + Tag dummyTag = makeDummyTag(); + given(tagRepository.save(any())) + .willReturn(dummyTag); + + TagCreateRequest request = new TagCreateRequest(1L, "tagName", "tagColor"); + assertDoesNotThrow(() -> tagService.createTag(request)); + } + + private Tag makeDummyTag() { + return new Tag(1L, new TagName("tagNAme"), new TagColor("tagColor")); + } + +} From 745da7f38eb27df721804c0bf78bc8104ffeb745 Mon Sep 17 00:00:00 2001 From: Youngho Date: Wed, 9 Aug 2023 00:22:10 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feature:=20Tag=EC=83=9D=EC=84=B1=20controll?= =?UTF-8?q?er=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmemory/ui/tag/TagController.java | 23 +++++++++++ .../ourmemory/ui/tag/TagControllerTest.java | 38 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java create mode 100644 our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java diff --git a/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java new file mode 100644 index 0000000..b3c0646 --- /dev/null +++ b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java @@ -0,0 +1,23 @@ +package keepsake.ourmemory.ui.tag; + +import keepsake.ourmemory.application.tag.TagService; +import keepsake.ourmemory.ui.tag.dto.TagCreateRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +public class TagController { + + private final TagService tagService; + + @PostMapping("/tags") + public ResponseEntity createTag(@RequestBody TagCreateRequest request) { + tagService.createTag(request); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } +} diff --git a/our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java b/our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java new file mode 100644 index 0000000..62c501c --- /dev/null +++ b/our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java @@ -0,0 +1,38 @@ +package keepsake.ourmemory.ui.tag; + +import com.fasterxml.jackson.databind.ObjectMapper; +import keepsake.ourmemory.application.tag.TagService; +import keepsake.ourmemory.ui.tag.dto.TagCreateRequest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(TagController.class) +class TagControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private TagService tagService; + + @Autowired + private ObjectMapper objectMapper; + + @Test + void 태그_생성_후_201_을_반환한다() throws Exception { + TagCreateRequest request = new TagCreateRequest(1L, "tagName", "tagColor"); + String jsonRequest = objectMapper.writeValueAsString(request); + + mockMvc.perform(post("/tags") + .content(jsonRequest) + .contentType(APPLICATION_JSON)) + .andExpect(status().isCreated()); + } +} From 195f49c4896acbbd571aeff48d229d7533001a13 Mon Sep 17 00:00:00 2001 From: Youngho Date: Thu, 10 Aug 2023 14:44:07 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=EB=A9=A4=EB=B2=84=20=EB=B3=84=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=20=EC=A1=B0=ED=9A=8C=20repository=20method?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/repository/TagRepository.java | 4 ++ .../repository/TagRepositoryTest.java | 39 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java b/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java index c062cd1..5dc6a2d 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java +++ b/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java @@ -3,5 +3,9 @@ import keepsake.ourmemory.domain.tag.Tag; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface TagRepository extends JpaRepository { + + List findTagsByMemberId(Long memberId); } diff --git a/our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java b/our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java new file mode 100644 index 0000000..6af17ef --- /dev/null +++ b/our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java @@ -0,0 +1,39 @@ +package keepsake.ourmemory.application.repository; + +import keepsake.ourmemory.domain.tag.Tag; +import keepsake.ourmemory.domain.tag.TagColor; +import keepsake.ourmemory.domain.tag.TagName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +class TagRepositoryTest { + + @Autowired + private TagRepository tagRepository; + + @Test + void 멤버의_태그를_조회한다() { + // given + Long memberId = 1L; + Tag tag1 = new Tag(memberId, new TagName("tagName1"), new TagColor("tagColor1")); + Tag tag2 = new Tag(memberId, new TagName("tagName2"), new TagColor("tagColor2")); + Tag tag3 = new Tag(2L, new TagName("tagName3"), new TagColor("tagColor3")); + + tagRepository.save(tag1); + tagRepository.save(tag2); + tagRepository.save(tag3); + + // when + List tagsByMember = tagRepository.findTagsByMemberId(memberId); + + // then + assertThat(tagsByMember).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") + .containsExactlyInAnyOrder(tag1, tag2); + } +} From 7a0df56dee4bc0a0cbee1e0436177cfa58f72f93 Mon Sep 17 00:00:00 2001 From: Youngho Date: Thu, 10 Aug 2023 15:25:53 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=EB=A9=A4=EB=B2=84=EC=9D=98=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?service=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmemory/application/tag/TagService.java | 11 ++++++++++ .../tag/dto/TagFindResponseDto.java | 22 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 our-memory/src/main/java/keepsake/ourmemory/application/tag/dto/TagFindResponseDto.java diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java index 461f88e..811871c 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java +++ b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java @@ -1,6 +1,7 @@ package keepsake.ourmemory.application.tag; import keepsake.ourmemory.application.repository.TagRepository; +import keepsake.ourmemory.application.tag.dto.TagFindResponseDto; import keepsake.ourmemory.domain.tag.Tag; import keepsake.ourmemory.domain.tag.TagColor; import keepsake.ourmemory.domain.tag.TagName; @@ -9,6 +10,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Transactional @RequiredArgsConstructor @Service @@ -24,4 +27,12 @@ public void createTag(TagCreateRequest request) { Tag tag = new Tag(memberId, tagName, tagColor); tagRepository.save(tag); } + + @Transactional(readOnly = true) + public List findTagsByMember(Long memberId) { + List tags = tagRepository.findTagsByMemberId(memberId); + return tags.stream() + .map(TagFindResponseDto::from) + .toList(); + } } diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/tag/dto/TagFindResponseDto.java b/our-memory/src/main/java/keepsake/ourmemory/application/tag/dto/TagFindResponseDto.java new file mode 100644 index 0000000..f100d0c --- /dev/null +++ b/our-memory/src/main/java/keepsake/ourmemory/application/tag/dto/TagFindResponseDto.java @@ -0,0 +1,22 @@ +package keepsake.ourmemory.application.tag.dto; + +import keepsake.ourmemory.domain.tag.Tag; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class TagFindResponseDto { + + private Long tagId; + private String tagName; + private String tagColor; + + public static TagFindResponseDto from(Tag tag) { + return new TagFindResponseDto( + tag.getId(), + tag.getTagNameValue(), + tag.getTagColorValue() + ); + } +} From e578b498777b4777791108224e8815925549dfe1 Mon Sep 17 00:00:00 2001 From: Youngho Date: Thu, 10 Aug 2023 15:31:34 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=EB=A9=A4=EB=B2=84=EC=9D=98=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?controller=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmemory/ui/tag/TagController.java | 14 +++++++++++--- .../ourmemory/ui/tag/dto/TagFindResponse.java | 18 ++++++++++++++++++ .../ourmemory/ui/tag/TagControllerTest.java | 7 +++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagFindResponse.java diff --git a/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java index b3c0646..9d69a5a 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java +++ b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java @@ -1,13 +1,15 @@ package keepsake.ourmemory.ui.tag; import keepsake.ourmemory.application.tag.TagService; +import keepsake.ourmemory.application.tag.dto.TagFindResponseDto; import keepsake.ourmemory.ui.tag.dto.TagCreateRequest; +import keepsake.ourmemory.ui.tag.dto.TagFindResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RequiredArgsConstructor @RestController @@ -20,4 +22,10 @@ public ResponseEntity createTag(@RequestBody TagCreateRequest request) { tagService.createTag(request); return ResponseEntity.status(HttpStatus.CREATED).build(); } + + @GetMapping("/tags/members/{memberId}") + public ResponseEntity findTagsByMember(@PathVariable Long memberId) { + List tags = tagService.findTagsByMember(memberId); + return ResponseEntity.ok(new TagFindResponse(tags)); + } } diff --git a/our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagFindResponse.java b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagFindResponse.java new file mode 100644 index 0000000..0946111 --- /dev/null +++ b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/dto/TagFindResponse.java @@ -0,0 +1,18 @@ +package keepsake.ourmemory.ui.tag.dto; + +import keepsake.ourmemory.application.tag.dto.TagFindResponseDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +import static lombok.AccessLevel.PROTECTED; + +@AllArgsConstructor +@NoArgsConstructor(access = PROTECTED) +@Getter +public class TagFindResponse { + + private List tags; +} diff --git a/our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java b/our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java index 62c501c..0b6f425 100644 --- a/our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java +++ b/our-memory/src/test/java/keepsake/ourmemory/ui/tag/TagControllerTest.java @@ -10,6 +10,7 @@ import org.springframework.test.web.servlet.MockMvc; import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -35,4 +36,10 @@ class TagControllerTest { .contentType(APPLICATION_JSON)) .andExpect(status().isCreated()); } + + @Test + void 멤버의_태그_조회에_성공하면_200을_반환한다() throws Exception { + mockMvc.perform(get("/tags/members/{memberId}", 1L)) + .andExpect(status().isOk()); + } } From 8c9858623d78b274bcf84447fee2722bc59d4ac4 Mon Sep 17 00:00:00 2001 From: Youngho Date: Thu, 10 Aug 2023 18:23:40 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=EB=A9=A4=EB=B2=84=20=EB=B3=84=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=20soft=20delete=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/repository/TagRepository.java | 2 +- .../ourmemory/application/tag/TagService.java | 2 +- .../keepsake/ourmemory/domain/tag/Tag.java | 12 +++++------ .../repository/TagRepositoryTest.java | 20 ++++++++++++++++++- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java b/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java index 5dc6a2d..8d5d76d 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java +++ b/our-memory/src/main/java/keepsake/ourmemory/application/repository/TagRepository.java @@ -7,5 +7,5 @@ public interface TagRepository extends JpaRepository { - List findTagsByMemberId(Long memberId); + List findTagsByMemberIdAndDeletedIsFalse(Long memberId); } diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java index 811871c..418f992 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java +++ b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java @@ -30,7 +30,7 @@ public void createTag(TagCreateRequest request) { @Transactional(readOnly = true) public List findTagsByMember(Long memberId) { - List tags = tagRepository.findTagsByMemberId(memberId); + List tags = tagRepository.findTagsByMemberIdAndDeletedIsFalse(memberId); return tags.stream() .map(TagFindResponseDto::from) .toList(); diff --git a/our-memory/src/main/java/keepsake/ourmemory/domain/tag/Tag.java b/our-memory/src/main/java/keepsake/ourmemory/domain/tag/Tag.java index 699458d..ba85944 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/domain/tag/Tag.java +++ b/our-memory/src/main/java/keepsake/ourmemory/domain/tag/Tag.java @@ -1,20 +1,17 @@ package keepsake.ourmemory.domain.tag; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; import keepsake.ourmemory.domain.BaseEntity; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; import java.util.Objects; @Entity @Getter +@SQLDelete(sql = "UPDATE tag SET deleted = true WHERE id = ?") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Tag extends BaseEntity { @Id @@ -30,6 +27,9 @@ public class Tag extends BaseEntity { @Embedded private TagColor tagColor; + @Column(nullable = false) + private boolean deleted = false; + public Tag(Long memberId, TagName tagName, TagColor tagColor) { this.memberId = memberId; this.tagName = tagName; diff --git a/our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java b/our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java index 6af17ef..6bfc1b4 100644 --- a/our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java +++ b/our-memory/src/test/java/keepsake/ourmemory/application/repository/TagRepositoryTest.java @@ -30,10 +30,28 @@ class TagRepositoryTest { tagRepository.save(tag3); // when - List tagsByMember = tagRepository.findTagsByMemberId(memberId); + List tagsByMember = tagRepository.findTagsByMemberIdAndDeletedIsFalse(memberId); // then assertThat(tagsByMember).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") .containsExactlyInAnyOrder(tag1, tag2); } + + @Test + void 멤버의_태그를_삭제한다() { + // given + Long memberId = 1L; + Tag tag1 = new Tag(memberId, new TagName("tagName1"), new TagColor("tagColor1")); + Tag tag2 = new Tag(memberId, new TagName("tagName2"), new TagColor("tagColor2")); + + Tag savedTag1 = tagRepository.save(tag1); + Tag savedTag2 = tagRepository.save(tag2); + + // when + tagRepository.deleteById(savedTag2.getId()); + List tagsByMember = tagRepository.findTagsByMemberIdAndDeletedIsFalse(memberId); + // then + assertThat(tagsByMember).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") + .containsExactlyInAnyOrder(savedTag1); + } } From 294a87855dee47494be3e93f334b1bc55a72f0a3 Mon Sep 17 00:00:00 2001 From: Youngho Date: Thu, 10 Aug 2023 18:26:40 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat:=20=ED=83=9C=EA=B7=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20service,=20controller=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/keepsake/ourmemory/application/tag/TagService.java | 4 ++++ .../main/java/keepsake/ourmemory/ui/tag/TagController.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java index 418f992..1f4111a 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java +++ b/our-memory/src/main/java/keepsake/ourmemory/application/tag/TagService.java @@ -35,4 +35,8 @@ public List findTagsByMember(Long memberId) { .map(TagFindResponseDto::from) .toList(); } + + public void deleteTagById(Long tagId) { + tagRepository.deleteById(tagId); + } } diff --git a/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java index 9d69a5a..1a8ce72 100644 --- a/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java +++ b/our-memory/src/main/java/keepsake/ourmemory/ui/tag/TagController.java @@ -28,4 +28,10 @@ public ResponseEntity findTagsByMember(@PathVariable Long membe List tags = tagService.findTagsByMember(memberId); return ResponseEntity.ok(new TagFindResponse(tags)); } + + @DeleteMapping("tags/{tagId}") + public ResponseEntity deleteTag(@PathVariable Long tagId) { + tagService.deleteTagById(tagId); + return ResponseEntity.noContent().build(); + } }