From 7920f3022e5f229a075f812e1d714080dd603445 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 28 Mar 2025 13:23:23 +0900 Subject: [PATCH 01/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20DB=20cleaner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/global/DatabaseCleaner.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java diff --git a/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java new file mode 100644 index 00000000..75550f90 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java @@ -0,0 +1,51 @@ +package com.ourmenu.backend.global; + +import jakarta.annotation.PostConstruct; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +public class DatabaseCleaner implements InitializingBean { + + // 테이블 이름들을 저장할 List + private final List tables = new ArrayList<>(); + + // 엔티티 매니저를 선언한다 + @PersistenceContext + private EntityManager entityManager; + + @SuppressWarnings("unchecked") + @PostConstruct + public void findDatabaseTableNames() { + List tableInfos = entityManager.createNativeQuery("SHOW TABLES").getResultList(); + for (String tableInfo : tableInfos) { + String tableName = tableInfo; + tables.add(tableName); + } + } + + // 테이블을 초기화한다 + private void truncate() { + entityManager.createNativeQuery(String.format("SET FOREIGN_KEY_CHECKS = %d", 0)).executeUpdate(); + for (String tableName : tables) { + entityManager.createNativeQuery(String.format("TRUNCATE TABLE %s", tableName)).executeUpdate(); + } + entityManager.createNativeQuery(String.format("SET FOREIGN_KEY_CHECKS = %d", 1)).executeUpdate(); + } + + @Override + public void afterPropertiesSet() throws Exception { + findDatabaseTableNames(); + } + + @Transactional + public void clear() { + entityManager.clear(); + truncate(); + } +} \ No newline at end of file From 2b3488f275e87385f494a548499707f59d077da7 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 28 Mar 2025 13:24:03 +0900 Subject: [PATCH 02/83] feat: ApiResponse Getter --- .../java/com/ourmenu/backend/global/response/ApiResponse.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java b/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java index 44832ee2..febec78c 100644 --- a/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java +++ b/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java @@ -5,9 +5,11 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.ourmenu.backend.global.exception.ErrorResponse; import lombok.AllArgsConstructor; +import lombok.Getter; @AllArgsConstructor @JsonInclude(Include.NON_NULL) +@Getter public class ApiResponse { @JsonProperty(value = "isSuccess") From b71d552165aecfdaa87327391415a255f0191eec Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 28 Mar 2025 13:24:37 +0900 Subject: [PATCH 03/83] =?UTF-8?q?test:=20=EB=A9=94=EB=89=B4=ED=8C=90=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메뉴판을 저장 할 수 있다. - 메뉴판을 조회 할 수 있다. --- .../domain/menu/api/MenuFolderApiTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java new file mode 100644 index 00000000..dcb02962 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -0,0 +1,76 @@ +package com.ourmenu.backend.domain.menu.api; + +import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.menu.dto.GetMenuFolderResponse; +import com.ourmenu.backend.domain.menu.dto.SaveMenuFolderRequest; +import com.ourmenu.backend.domain.menu.dto.SaveMenuFolderResponse; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.response.ApiResponse; +import jakarta.persistence.EntityManager; +import java.util.Collections; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +public class MenuFolderApiTest { + + @Autowired + MenuFolderController menuFolderController; + + @Autowired + EntityManager entityManager; + + @Autowired + DatabaseCleaner databaseCleaner; + + @BeforeEach + void setUp() { + databaseCleaner.clear(); + } + + @Test + void 메뉴판을_저장_할_수_있다() { + + //given + String menuFolderTitle = "메뉴판 제목"; + SaveMenuFolderRequest saveMenuFolderRequest = new SaveMenuFolderRequest(null, menuFolderTitle, + MenuFolderIcon.ANGRY, + Collections.emptyList()); + CustomUserDetails customUserDetails = new CustomUserDetails(1L, "email@naver.com", "password1!"); + + //when + ApiResponse response = menuFolderController.saveMenuFolder( + saveMenuFolderRequest, customUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().getMenuFolderTitle()).isEqualTo(menuFolderTitle); + } + + @Test + @Transactional + void 메뉴판을_조회_할_수_있다() { + //given + String menuFolderTitle = "메뉴판 제목"; + SaveMenuFolderRequest saveMenuFolderRequest = new SaveMenuFolderRequest(null, menuFolderTitle, + MenuFolderIcon.ANGRY, + Collections.emptyList()); + CustomUserDetails customUserDetails = new CustomUserDetails(1L, "email@naver.com", "password1!"); + menuFolderController.saveMenuFolder(saveMenuFolderRequest, customUserDetails); + entityManager.flush(); + + //when + ApiResponse> response = menuFolderController.getMenuFolder(customUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().size()).isEqualTo(1); + Assertions.assertThat(response.getResponse().get(0).getMenuFolderTitle()).isEqualTo(menuFolderTitle); + } +} From d33da2b07f5d236a19bce6bfce683173162f4fc0 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 4 Apr 2025 21:50:02 +0900 Subject: [PATCH 04/83] =?UTF-8?q?feat:=20testData=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메뉴 폴더 테스트 용 데이터 - 테스트 추가 --- .../domain/menu/api/MenuFolderApiTest.java | 39 ++++++++++------ .../domain/menu/config/MenuTestConfig.java | 25 +++++++++++ .../domain/menu/data/MenuTestData.java | 30 +++++++++++++ .../domain/menu/data/UserTestData.java | 45 +++++++++++++++++++ .../backend/global/DatabaseCleaner.java | 10 +---- 5 files changed, 128 insertions(+), 21 deletions(-) create mode 100644 src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java create mode 100644 src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java create mode 100644 src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index dcb02962..58410862 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -1,13 +1,16 @@ package com.ourmenu.backend.domain.menu.api; import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.menu.config.MenuTestConfig; +import com.ourmenu.backend.domain.menu.data.MenuTestData; +import com.ourmenu.backend.domain.menu.data.UserTestData; +import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.dto.GetMenuFolderResponse; import com.ourmenu.backend.domain.menu.dto.SaveMenuFolderRequest; import com.ourmenu.backend.domain.menu.dto.SaveMenuFolderResponse; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.response.ApiResponse; -import jakarta.persistence.EntityManager; import java.util.Collections; import java.util.List; import org.assertj.core.api.Assertions; @@ -15,16 +18,20 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.context.annotation.Import; @SpringBootTest +@Import(MenuTestConfig.class) public class MenuFolderApiTest { @Autowired MenuFolderController menuFolderController; @Autowired - EntityManager entityManager; + UserTestData userTestData; + + @Autowired + MenuTestData menuTestData; @Autowired DatabaseCleaner databaseCleaner; @@ -54,23 +61,29 @@ void setUp() { } @Test - @Transactional + //@Transactional void 메뉴판을_조회_할_수_있다() { //given - String menuFolderTitle = "메뉴판 제목"; - SaveMenuFolderRequest saveMenuFolderRequest = new SaveMenuFolderRequest(null, menuFolderTitle, - MenuFolderIcon.ANGRY, - Collections.emptyList()); - CustomUserDetails customUserDetails = new CustomUserDetails(1L, "email@naver.com", "password1!"); - menuFolderController.saveMenuFolder(saveMenuFolderRequest, customUserDetails); - entityManager.flush(); + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + MenuFolder testMenuFolder = menuTestData.createTestMenuFolder(testCustomUserDetails); //when - ApiResponse> response = menuFolderController.getMenuFolder(customUserDetails); + ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); Assertions.assertThat(response.getResponse().size()).isEqualTo(1); - Assertions.assertThat(response.getResponse().get(0).getMenuFolderTitle()).isEqualTo(menuFolderTitle); + Assertions.assertThat(response.getResponse().get(0).getMenuFolderTitle()).isEqualTo(testMenuFolder.getTitle()); + } + + @Test + void 테스트_유저를_생성_할_수_있다() { + //given + + //when + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + + //then + Assertions.assertThat(testCustomUserDetails.getId()).isEqualTo(1L); } } diff --git a/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java b/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java new file mode 100644 index 00000000..b03e664b --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java @@ -0,0 +1,25 @@ +package com.ourmenu.backend.domain.menu.config; + +import com.ourmenu.backend.domain.menu.data.MenuTestData; +import com.ourmenu.backend.domain.menu.data.UserTestData; +import jakarta.persistence.EntityManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class MenuTestConfig { + + @Autowired + EntityManager entityManager; + + @Bean + public UserTestData userTestData() { + return new UserTestData(entityManager); + } + + @Bean + public MenuTestData menuTestData() { + return new MenuTestData(entityManager); + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java new file mode 100644 index 00000000..046e8a02 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java @@ -0,0 +1,30 @@ +package com.ourmenu.backend.domain.menu.data; + +import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.menu.domain.MenuFolder; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import jakarta.persistence.EntityManager; +import org.springframework.transaction.annotation.Transactional; + +public class MenuTestData { + + private EntityManager entityManager; + + public MenuTestData(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Transactional + public MenuFolder createTestMenuFolder(CustomUserDetails customUserDetails) { + MenuFolder menuFolder = MenuFolder.builder() + .title("테스트 메뉴 폴더") + .imgUrl("테스트 메뉴 폴더 이미지 url") + .icon(MenuFolderIcon.ANGRY) + .index(1) + .userId(customUserDetails.getId()) + .build(); + entityManager.persist(menuFolder); + entityManager.flush(); + return menuFolder; + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java new file mode 100644 index 00000000..6f9f1de0 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java @@ -0,0 +1,45 @@ +package com.ourmenu.backend.domain.menu.data; + +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.domain.user.domain.SignInType; +import com.ourmenu.backend.domain.user.domain.User; +import jakarta.persistence.EntityManager; +import org.springframework.transaction.annotation.Transactional; + +public class UserTestData { + + private EntityManager entityManager; + + public UserTestData(EntityManager entityManager) { + this.entityManager = entityManager; + } + + + @Transactional + public CustomUserDetails createTestEmailUser() { + String email = "testEmailUser@naver.com"; + String password = "password1!"; + User user = User.builder() + .email(email) + .password(password) + .signInType(SignInType.EMAIL) + .build(); + entityManager.persist(user); + entityManager.flush(); + return new CustomUserDetails(user.getId(), email, password); + } + + @Transactional + public CustomUserDetails createTestKakaoUser() { + String email = "testKakaoUser@naver.com"; + String password = "password1!"; + User user = User.builder() + .email(email) + .password(password) + .signInType(SignInType.KAKAO) + .build(); + entityManager.persist(user); + entityManager.flush(); + return new CustomUserDetails(user.getId(), email, password); + } +} diff --git a/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java index 75550f90..fa0685c7 100644 --- a/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java +++ b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java @@ -12,10 +12,8 @@ @Component public class DatabaseCleaner implements InitializingBean { - // 테이블 이름들을 저장할 List private final List tables = new ArrayList<>(); - // 엔티티 매니저를 선언한다 @PersistenceContext private EntityManager entityManager; @@ -23,13 +21,9 @@ public class DatabaseCleaner implements InitializingBean { @PostConstruct public void findDatabaseTableNames() { List tableInfos = entityManager.createNativeQuery("SHOW TABLES").getResultList(); - for (String tableInfo : tableInfos) { - String tableName = tableInfo; - tables.add(tableName); - } + tables.addAll(tableInfos); } - // 테이블을 초기화한다 private void truncate() { entityManager.createNativeQuery(String.format("SET FOREIGN_KEY_CHECKS = %d", 0)).executeUpdate(); for (String tableName : tables) { @@ -39,7 +33,7 @@ private void truncate() { } @Override - public void afterPropertiesSet() throws Exception { + public void afterPropertiesSet() { findDatabaseTableNames(); } From 16d0f04f29d60f129ebba1f58092807f3712f4ca Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 4 Apr 2025 21:54:52 +0900 Subject: [PATCH 05/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index 58410862..50f215a6 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -15,6 +15,7 @@ import java.util.List; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -22,6 +23,7 @@ @SpringBootTest @Import(MenuTestConfig.class) +@DisplayName("메뉴 폴더 통합 테스트") public class MenuFolderApiTest { @Autowired @@ -61,7 +63,6 @@ void setUp() { } @Test - //@Transactional void 메뉴판을_조회_할_수_있다() { //given CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); From 3949ede2636ef8e2af4c66c5c6c3f58a777a230e Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 4 Apr 2025 22:29:19 +0900 Subject: [PATCH 06/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/UpdateMenuFolderIndexRequest.java | 2 + .../domain/menu/api/MenuFolderApiTest.java | 97 +++++++++++++++++-- .../domain/menu/data/MenuTestData.java | 34 ++++++- 3 files changed, 126 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderIndexRequest.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderIndexRequest.java index f6eba902..5df5ad58 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderIndexRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderIndexRequest.java @@ -1,9 +1,11 @@ package com.ourmenu.backend.domain.menu.dto; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @NoArgsConstructor +@AllArgsConstructor @Getter public class UpdateMenuFolderIndexRequest { diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index 50f215a6..072e70f0 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -8,6 +8,9 @@ import com.ourmenu.backend.domain.menu.dto.GetMenuFolderResponse; import com.ourmenu.backend.domain.menu.dto.SaveMenuFolderRequest; import com.ourmenu.backend.domain.menu.dto.SaveMenuFolderResponse; +import com.ourmenu.backend.domain.menu.dto.UpdateMenuFolderIndexRequest; +import com.ourmenu.backend.domain.menu.dto.UpdateMenuFolderRequest; +import com.ourmenu.backend.domain.menu.dto.UpdateMenuFolderResponse; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.response.ApiResponse; @@ -44,18 +47,28 @@ void setUp() { } @Test - void 메뉴판을_저장_할_수_있다() { + void 테스트_유저를_생성_할_수_있다() { + //given + + //when + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + + //then + Assertions.assertThat(testCustomUserDetails.getId()).isEqualTo(1L); + } + @Test + void 메뉴판을_저장_할_수_있다() { //given String menuFolderTitle = "메뉴판 제목"; SaveMenuFolderRequest saveMenuFolderRequest = new SaveMenuFolderRequest(null, menuFolderTitle, MenuFolderIcon.ANGRY, Collections.emptyList()); - CustomUserDetails customUserDetails = new CustomUserDetails(1L, "email@naver.com", "password1!"); + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); //when ApiResponse response = menuFolderController.saveMenuFolder( - saveMenuFolderRequest, customUserDetails); + saveMenuFolderRequest, testCustomUserDetails); //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); @@ -63,7 +76,28 @@ void setUp() { } @Test - void 메뉴판을_조회_할_수_있다() { + void 메뉴판_저장시_시간순으로_순서가_정해진다() { + //given + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + MenuFolder testMenuFolder = menuTestData.createTestMenuFolder(testCustomUserDetails); + + String menuFolderTitle = "새로운 메뉴판 제목"; + SaveMenuFolderRequest saveMenuFolderRequest = new SaveMenuFolderRequest(null, menuFolderTitle, + MenuFolderIcon.ANGRY, + Collections.emptyList()); + menuFolderController.saveMenuFolder(saveMenuFolderRequest, testCustomUserDetails); + + //when + ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().get(0).getIndex()).isEqualTo(2); + Assertions.assertThat(response.getResponse().get(1).getIndex()).isEqualTo(1); + } + + @Test + void 메뉴판들을_조회_할_수_있다() { //given CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); MenuFolder testMenuFolder = menuTestData.createTestMenuFolder(testCustomUserDetails); @@ -78,13 +112,64 @@ void setUp() { } @Test - void 테스트_유저를_생성_할_수_있다() { + void 메뉴_폴더를_변경_할_수_있다() { + //given + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + MenuFolder testMenuFolder = menuTestData.createTestMenuFolder(testCustomUserDetails); + + String modifiedMenuFolderName = "수정된 메뉴폴더 이름"; + UpdateMenuFolderRequest updateMenuFolderRequest = new UpdateMenuFolderRequest(null, false, + modifiedMenuFolderName, null, null); + + //when + ApiResponse updateMenuFolderResponseApiResponse = menuFolderController.updateMenuFolder( + testMenuFolder.getId(), updateMenuFolderRequest, testCustomUserDetails); + + //then + Assertions.assertThat(updateMenuFolderResponseApiResponse.isSuccess()).isEqualTo(true); + Assertions.assertThat(updateMenuFolderResponseApiResponse.getResponse().getMenuFolderTitle()) + .isEqualTo(modifiedMenuFolderName); + Assertions.assertThat(updateMenuFolderResponseApiResponse.getResponse().getMenuFolderIcon()) + .isEqualTo(testMenuFolder.getIcon()); + + } + + @Test + void 메뉴_폴더_순서를_변경_할_수_있다() { //given + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + menuTestData.createTestMenuFolderList(testCustomUserDetails); //when + ApiResponse> preResponse = menuFolderController.getMenuFolder( + testCustomUserDetails); + UpdateMenuFolderIndexRequest updateMenuFolderIndexRequest = new UpdateMenuFolderIndexRequest(3); + ApiResponse updateMenuFolderResponseApiResponse = menuFolderController.updateMenuFolderIndex( + 1L, updateMenuFolderIndexRequest, testCustomUserDetails); + ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); + + //then + Assertions.assertThat(updateMenuFolderResponseApiResponse.isSuccess()).isEqualTo(true); + Assertions.assertThat(preResponse.getResponse().get(0).getMenuFolderTitle()) + .isEqualTo(response.getResponse().get(1).getMenuFolderTitle()); + Assertions.assertThat(preResponse.getResponse().get(1).getMenuFolderTitle()) + .isEqualTo(response.getResponse().get(2).getMenuFolderTitle()); + Assertions.assertThat(preResponse.getResponse().get(2).getMenuFolderTitle()) + .isEqualTo(response.getResponse().get(0).getMenuFolderTitle()); + } + + @Test + void 메뉴_폴더를_삭제_할_수_있다() { + //given CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + MenuFolder testMenuFolder = menuTestData.createTestMenuFolder(testCustomUserDetails); + + //when + menuFolderController.deleteMenuFolder(testMenuFolder.getId(), testCustomUserDetails); + ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); //then - Assertions.assertThat(testCustomUserDetails.getId()).isEqualTo(1L); + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().size()).isEqualTo(0); } } diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java index 046e8a02..a58c4d9c 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java @@ -4,6 +4,8 @@ import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import jakarta.persistence.EntityManager; +import java.util.ArrayList; +import java.util.List; import org.springframework.transaction.annotation.Transactional; public class MenuTestData { @@ -18,7 +20,7 @@ public MenuTestData(EntityManager entityManager) { public MenuFolder createTestMenuFolder(CustomUserDetails customUserDetails) { MenuFolder menuFolder = MenuFolder.builder() .title("테스트 메뉴 폴더") - .imgUrl("테스트 메뉴 폴더 이미지 url") + .imgUrl(null) .icon(MenuFolderIcon.ANGRY) .index(1) .userId(customUserDetails.getId()) @@ -27,4 +29,34 @@ public MenuFolder createTestMenuFolder(CustomUserDetails customUserDetails) { entityManager.flush(); return menuFolder; } + + @Transactional + public List createTestMenuFolderList(CustomUserDetails customUserDetails) { + List menuFolderList = new ArrayList<>(); + MenuFolder menuFolder1 = MenuFolder.builder() + .title("테스트 메뉴 폴더1") + .imgUrl(null) + .icon(MenuFolderIcon.ANGRY) + .index(1) + .userId(customUserDetails.getId()) + .build(); + MenuFolder menuFolder2 = MenuFolder.builder() + .title("테스트 메뉴 폴더2") + .imgUrl(null) + .icon(MenuFolderIcon.BAEKSUK) + .index(2) + .userId(customUserDetails.getId()) + .build(); + MenuFolder menuFolder3 = MenuFolder.builder() + .title("테스트 메뉴 폴더3") + .imgUrl(null) + .icon(MenuFolderIcon.BASKET) + .index(3) + .userId(customUserDetails.getId()) + .build(); + entityManager.persist(menuFolder1); + entityManager.persist(menuFolder2); + entityManager.persist(menuFolder3); + return menuFolderList; + } } From bfa7e6e67bb66741d09abc90ebc6f552f3d01cb8 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 4 Apr 2025 22:35:48 +0900 Subject: [PATCH 07/83] =?UTF-8?q?test:=20testConfig=20=EB=B9=88=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/menu/api/MenuFolderApiTest.java | 3 ++- .../com/ourmenu/backend/global/DatabaseCleaner.java | 2 -- .../java/com/ourmenu/backend/global/TestConfig.java | 13 +++++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/ourmenu/backend/global/TestConfig.java diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index 072e70f0..6be24ade 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -13,6 +13,7 @@ import com.ourmenu.backend.domain.menu.dto.UpdateMenuFolderResponse; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.response.ApiResponse; import java.util.Collections; import java.util.List; @@ -25,7 +26,7 @@ import org.springframework.context.annotation.Import; @SpringBootTest -@Import(MenuTestConfig.class) +@Import({TestConfig.class, MenuTestConfig.class}) @DisplayName("메뉴 폴더 통합 테스트") public class MenuFolderApiTest { diff --git a/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java index fa0685c7..4f337f88 100644 --- a/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java +++ b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java @@ -6,10 +6,8 @@ import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -@Component public class DatabaseCleaner implements InitializingBean { private final List tables = new ArrayList<>(); diff --git a/src/test/java/com/ourmenu/backend/global/TestConfig.java b/src/test/java/com/ourmenu/backend/global/TestConfig.java new file mode 100644 index 00000000..8b5b09ba --- /dev/null +++ b/src/test/java/com/ourmenu/backend/global/TestConfig.java @@ -0,0 +1,13 @@ +package com.ourmenu.backend.global; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class TestConfig { + + @Bean + public DatabaseCleaner databaseCleaner() { + return new DatabaseCleaner(); + } +} From 2a498150b0a20a2c6792384bf2dc0cfab3482ccb Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 8 Apr 2025 15:56:24 +0900 Subject: [PATCH 08/83] =?UTF-8?q?test:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 리뷰 반영 --- .../com/ourmenu/backend/domain/menu/data/MenuTestData.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java index a58c4d9c..eb2d3d04 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java @@ -4,7 +4,6 @@ import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import jakarta.persistence.EntityManager; -import java.util.ArrayList; import java.util.List; import org.springframework.transaction.annotation.Transactional; @@ -26,13 +25,11 @@ public MenuFolder createTestMenuFolder(CustomUserDetails customUserDetails) { .userId(customUserDetails.getId()) .build(); entityManager.persist(menuFolder); - entityManager.flush(); return menuFolder; } @Transactional public List createTestMenuFolderList(CustomUserDetails customUserDetails) { - List menuFolderList = new ArrayList<>(); MenuFolder menuFolder1 = MenuFolder.builder() .title("테스트 메뉴 폴더1") .imgUrl(null) @@ -57,6 +54,6 @@ public List createTestMenuFolderList(CustomUserDetails customUserDet entityManager.persist(menuFolder1); entityManager.persist(menuFolder2); entityManager.persist(menuFolder3); - return menuFolderList; + return List.of(menuFolder1, menuFolder2, menuFolder3); } } From 5e8f36014acb19e678e8d374877eeecc650c56c0 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 8 Apr 2025 16:03:50 +0900 Subject: [PATCH 09/83] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java index 4f337f88..1a6f44a8 100644 --- a/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java +++ b/src/test/java/com/ourmenu/backend/global/DatabaseCleaner.java @@ -14,8 +14,7 @@ public class DatabaseCleaner implements InitializingBean { @PersistenceContext private EntityManager entityManager; - - @SuppressWarnings("unchecked") + @PostConstruct public void findDatabaseTableNames() { List tableInfos = entityManager.createNativeQuery("SHOW TABLES").getResultList(); From 1eab0e8ba68b769bf2f756382620d531caeb1022 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 8 Apr 2025 16:39:45 +0900 Subject: [PATCH 10/83] =?UTF-8?q?test:=20response=20=EB=B3=80=EA=B2=BD=20&?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/menu/api/MenuFolderApiTest.java | 57 +++++++++++++------ .../domain/menu/data/MenuTestData.java | 18 ++++++ 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index 6be24ade..4c25ec32 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -16,7 +16,6 @@ import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.response.ApiResponse; import java.util.Collections; -import java.util.List; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -86,15 +85,18 @@ void setUp() { SaveMenuFolderRequest saveMenuFolderRequest = new SaveMenuFolderRequest(null, menuFolderTitle, MenuFolderIcon.ANGRY, Collections.emptyList()); - menuFolderController.saveMenuFolder(saveMenuFolderRequest, testCustomUserDetails); + ApiResponse saveMenuFolderResponseApiResponse = menuFolderController.saveMenuFolder( + saveMenuFolderRequest, testCustomUserDetails); //when - ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); + ApiResponse response = menuFolderController.getMenuFolder(testCustomUserDetails); //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); - Assertions.assertThat(response.getResponse().get(0).getIndex()).isEqualTo(2); - Assertions.assertThat(response.getResponse().get(1).getIndex()).isEqualTo(1); + Assertions.assertThat(response.getResponse().getMenuFolders().get(0).getIndex()) + .isEqualTo(saveMenuFolderResponseApiResponse.getResponse().getIndex()); + Assertions.assertThat(response.getResponse().getMenuFolders().get(1).getIndex()) + .isEqualTo(testMenuFolder.getIndex()); } @Test @@ -104,12 +106,31 @@ void setUp() { MenuFolder testMenuFolder = menuTestData.createTestMenuFolder(testCustomUserDetails); //when - ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); + ApiResponse response = menuFolderController.getMenuFolder(testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().getMenuFolders().size()).isEqualTo(1); + Assertions.assertThat(response.getResponse().getMenuFolders().get(0).getMenuFolderTitle()) + .isEqualTo(testMenuFolder.getTitle()); + } + + @Test + void 메뉴판들을_조회시_유저_메뉴_전체_개수_를_확인_할_수_있다() { + //given + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + MenuFolder testMenuFolder = menuTestData.createTestMenuFolder(testCustomUserDetails); + menuTestData.createTestMenu(testCustomUserDetails); + + //when + ApiResponse response = menuFolderController.getMenuFolder(testCustomUserDetails); //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); - Assertions.assertThat(response.getResponse().size()).isEqualTo(1); - Assertions.assertThat(response.getResponse().get(0).getMenuFolderTitle()).isEqualTo(testMenuFolder.getTitle()); + Assertions.assertThat(response.getResponse().getMenuFolders().size()).isEqualTo(1); + Assertions.assertThat(response.getResponse().getMenuCount()).isEqualTo(1); + Assertions.assertThat(response.getResponse().getMenuFolders().get(0).getMenuFolderTitle()) + .isEqualTo(testMenuFolder.getTitle()); } @Test @@ -142,21 +163,21 @@ void setUp() { menuTestData.createTestMenuFolderList(testCustomUserDetails); //when - ApiResponse> preResponse = menuFolderController.getMenuFolder( + ApiResponse preResponse = menuFolderController.getMenuFolder( testCustomUserDetails); UpdateMenuFolderIndexRequest updateMenuFolderIndexRequest = new UpdateMenuFolderIndexRequest(3); ApiResponse updateMenuFolderResponseApiResponse = menuFolderController.updateMenuFolderIndex( 1L, updateMenuFolderIndexRequest, testCustomUserDetails); - ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); + ApiResponse response = menuFolderController.getMenuFolder(testCustomUserDetails); //then Assertions.assertThat(updateMenuFolderResponseApiResponse.isSuccess()).isEqualTo(true); - Assertions.assertThat(preResponse.getResponse().get(0).getMenuFolderTitle()) - .isEqualTo(response.getResponse().get(1).getMenuFolderTitle()); - Assertions.assertThat(preResponse.getResponse().get(1).getMenuFolderTitle()) - .isEqualTo(response.getResponse().get(2).getMenuFolderTitle()); - Assertions.assertThat(preResponse.getResponse().get(2).getMenuFolderTitle()) - .isEqualTo(response.getResponse().get(0).getMenuFolderTitle()); + Assertions.assertThat(preResponse.getResponse().getMenuFolders().get(0).getMenuFolderTitle()) + .isEqualTo(response.getResponse().getMenuFolders().get(1).getMenuFolderTitle()); + Assertions.assertThat(preResponse.getResponse().getMenuFolders().get(1).getMenuFolderTitle()) + .isEqualTo(response.getResponse().getMenuFolders().get(2).getMenuFolderTitle()); + Assertions.assertThat(preResponse.getResponse().getMenuFolders().get(2).getMenuFolderTitle()) + .isEqualTo(response.getResponse().getMenuFolders().get(0).getMenuFolderTitle()); } @Test @@ -167,10 +188,10 @@ void setUp() { //when menuFolderController.deleteMenuFolder(testMenuFolder.getId(), testCustomUserDetails); - ApiResponse> response = menuFolderController.getMenuFolder(testCustomUserDetails); + ApiResponse response = menuFolderController.getMenuFolder(testCustomUserDetails); //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); - Assertions.assertThat(response.getResponse().size()).isEqualTo(0); + Assertions.assertThat(response.getResponse().getMenuFolders().size()).isEqualTo(0); } } diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java index eb2d3d04..65794301 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java @@ -1,6 +1,8 @@ package com.ourmenu.backend.domain.menu.data; import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import jakarta.persistence.EntityManager; @@ -56,4 +58,20 @@ public List createTestMenuFolderList(CustomUserDetails customUserDet entityManager.persist(menuFolder3); return List.of(menuFolder1, menuFolder2, menuFolder3); } + + @Transactional + public Menu createTestMenu(CustomUserDetails customUserDetails) { + Menu menu = Menu.builder() + .title("테스트 메뉴 비비큐") + .price(1000) + .pin(MenuPin.BBQ) + .memoTitle("테스트 메뉴 메모 제목") + .memoContent("테스트 메뉴 메모 내용") + .isCrawled(Boolean.FALSE) + .userId(customUserDetails.getId()) + .build(); + + entityManager.persist(menu); + return menu; + } } From a97d2e905e2c1cfdd01999eee51bfa94bbd51d65 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 14:46:00 +0900 Subject: [PATCH 11/83] =?UTF-8?q?fix:=20workflow=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd-with-discord.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd-with-discord.yml b/.github/workflows/cd-with-discord.yml index 525066bc..414565fe 100644 --- a/.github/workflows/cd-with-discord.yml +++ b/.github/workflows/cd-with-discord.yml @@ -1,4 +1,4 @@ -name: CI and request Discord Message to review +name: CD and request Discord Message to deploy on: push: From 2ed0b72fb663fb522e50bf0f6e6bdc77969f1638 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 14:47:04 +0900 Subject: [PATCH 12/83] fix: .gitignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - act 관련 파일 추가 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a00fec87..189cd414 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ out/ .vscode/ .env +.act_secrets From 2ccaece7254c5b9094627f6489a67727d30aacec Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 14:47:33 +0900 Subject: [PATCH 13/83] del: hibernate auto ddl --- src/main/resources/application.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index be6e2df8..0fc86f3a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,7 +13,6 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #MongoDb spring.data.mongodb.uri=${MONGO_URL} # JPA Configuration -spring.jpa.hibernate.ddl-auto=create spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect From d40c22185d2c9ebf923e9892765d2df3aa04821d Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 14:49:09 +0900 Subject: [PATCH 14/83] docs: ddl.sql --- infra/sql/ddl.sql | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 infra/sql/ddl.sql diff --git a/infra/sql/ddl.sql b/infra/sql/ddl.sql new file mode 100644 index 00000000..997b8a4a --- /dev/null +++ b/infra/sql/ddl.sql @@ -0,0 +1,136 @@ +SET FOREIGN_KEY_CHECKS = 0; + +create table home_question_answer ( + id bigint not null auto_increment, + user_id bigint, + answer enum ('DISLIKE','LIKE','MOUNTAIN','RAINY','SEA','SPICY','SUMMER','SUNNY','SWEET','WINTER'), + question enum ('FEEL','SEASON','STRESS','TRIP','WEATHER'), + primary key (id) +) engine=InnoDB; + +create table map ( + created_at datetime(6), + id bigint not null auto_increment, + modified_at datetime(6), + location POINT SRID 4326 not null, + primary key (id) +) engine=InnoDB; + +create table meal_time ( + meal_time time(6), + created_at datetime(6), + id bigint not null auto_increment, + modified_at datetime(6), + user_id bigint, + primary key (id) +) engine=InnoDB; + +create table menu ( + is_crawled bit, + pin tinyint check (pin between 0 and 22), + price integer not null, + created_at datetime(6), + id bigint not null auto_increment, + modified_at datetime(6), + store_id bigint, + user_id bigint not null, + memo_content varchar(255), + memo_title varchar(255), + title varchar(255) not null, + primary key (id) +) engine=InnoDB; + +create table menu_folder ( + custom_index integer not null, + icon tinyint check (icon between 0 and 31), + created_at datetime(6), + id bigint not null auto_increment, + modified_at datetime(6), + user_id bigint not null, + img_url varchar(255), + title varchar(255) not null, + primary key (id) +) engine=InnoDB; + +create table menu_menu_folder ( + created_at datetime(6), + folder_id bigint, + id bigint not null auto_increment, + menu_id bigint, + modified_at datetime(6), + primary key (id) +) engine=InnoDB; + +create table menu_img ( + created_at datetime(6), + id bigint not null auto_increment, + menu_id bigint, + modified_at datetime(6), + img_url varchar(255), + primary key (id) +) engine=InnoDB; + +create table menu_tag ( + created_at datetime(6), + id bigint not null auto_increment, + menu_id bigint not null, + modified_at datetime(6), + tag enum ('ASIA','BREAD','BUSINESS','BUY_FOOD','CAFE','CHINA','COOL','DATE','DESSERT','FAST_FOOD','FISH','HOT','HOT_SPICY','JAPAN','KOREA','MEAT','NOODLE','ORGANIZATION','PROMISE','RICE','SOLO','SPICY','SWEET','WESTERN'), + primary key (id) +) engine=InnoDB; + +create table not_owned_search_history ( + created_at datetime(6), + id bigint not null auto_increment, + modified_at datetime(6), + user_id bigint not null, + address varchar(255) not null, + title varchar(255) not null, + primary key (id) +) engine=InnoDB; + +create table not_found_store ( + mapx float(53) not null, + mapy float(53) not null, + created_at datetime(6), + id bigint not null auto_increment, + modified_at datetime(6), + address varchar(255) not null, + store_id varchar(255), + title varchar(255) not null, + primary key (id) +) engine=InnoDB; + +create table owned_menu_search ( + created_at datetime(6), + id bigint not null auto_increment, + menu_id bigint not null, + modified_at datetime(6), + user_id bigint not null, + menu_title varchar(255) not null, + store_address varchar(255) not null, + store_title varchar(255) not null, + primary key (id) +) engine=InnoDB; + +create table store ( + created_at datetime(6), + id bigint not null auto_increment, + map_id bigint, + modified_at datetime(6), + address varchar(255), + title varchar(255) not null, + primary key (id) +) engine=InnoDB; + +create table user ( + created_at datetime(6), + id bigint not null auto_increment, + modified_at datetime(6), + email varchar(255), + password varchar(255), + sign_in_type enum ('EMAIL','KAKAO'), + primary key (id) +) engine=InnoDB; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file From 2e2886fc805fd2c0be4cb05b4445b377591e6334 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 14:49:52 +0900 Subject: [PATCH 15/83] fix: cd worflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - act 관련 workflow 추가 - ddl insert --- .github/workflows/ci-with-discord.yml | 40 ++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-with-discord.yml b/.github/workflows/ci-with-discord.yml index 5d043ac7..9a8493ca 100644 --- a/.github/workflows/ci-with-discord.yml +++ b/.github/workflows/ci-with-discord.yml @@ -25,7 +25,7 @@ jobs: mysql: image: mysql:8.0 ports: - - 3306:3306 + - 3307:3306 env: MYSQL_DATABASE: testdb MYSQL_ROOT_PASSWORD: testdb @@ -35,6 +35,16 @@ jobs: --health-timeout=5s --health-retries=3 + redis: + image: redis + ports: + - 6380:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: - uses: actions/checkout@v4 - name: JDK 17 를 준비한다. @@ -49,13 +59,35 @@ jobs: - name: Gradle 를 준비한다. uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 + - name: ACT 환경에 대해서 패키지를 업데이터 & 설치한다 + if: ${{ env.ACT }} + run: | + apt-get update && apt-get install sudo -y + + - name: sudo 설치 테스트한다 + run: | + sudo id + + - name: DDL 경로 확인 + run: | + ls -al infra/sql/ + cat infra/sql/ddl.sql + + - name: DDL 파일을 실행하여 테이블을 생성한다. + if: ${{ !github.event.ACT }} + run: | + sudo apt-get update + echo "DDL insert" + sudo apt-get install -y default-mysql-client + mysql -h 127.0.0.1 -P 3307 -uroot -ptestdb testdb --verbose < infra/sql/ddl.sql + - name: 빌드한다. env: - SPRING_DATASOURCE_URL: jdbc:mysql://127.0.0.1:3306/testdb + SPRING_DATASOURCE_URL: jdbc:mysql://127.0.0.1:3307/testdb SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: testdb - SPRING_JPA_HIBERNATE_DDL_AUTO: update - SPRING_DATA_REDIS_HOST: localhost + SPRING_DATA_REDIS_HOST: 127.0.0.1 + SPRING_DATA_REDIS_PORT: 6380 SPRING_DATA_REDIS_PASSWORD: MONGO_URL: ${{ secrets.MONGO_URL }} S3_BUCKET: ${{ secrets.S3_BUCKET }} From 49b942c5e5ef6d4ff84610b0d5ca97a733ec1854 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 15:53:42 +0900 Subject: [PATCH 16/83] =?UTF-8?q?del:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-with-discord.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci-with-discord.yml b/.github/workflows/ci-with-discord.yml index 9a8493ca..10637343 100644 --- a/.github/workflows/ci-with-discord.yml +++ b/.github/workflows/ci-with-discord.yml @@ -65,6 +65,7 @@ jobs: apt-get update && apt-get install sudo -y - name: sudo 설치 테스트한다 + if: ${{ env.ACT }} run: | sudo id @@ -74,10 +75,7 @@ jobs: cat infra/sql/ddl.sql - name: DDL 파일을 실행하여 테이블을 생성한다. - if: ${{ !github.event.ACT }} run: | - sudo apt-get update - echo "DDL insert" sudo apt-get install -y default-mysql-client mysql -h 127.0.0.1 -P 3307 -uroot -ptestdb testdb --verbose < infra/sql/ddl.sql From c78979a4baf6cc6bba19d76ecaebe6dd8f7f80d3 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 16:48:11 +0900 Subject: [PATCH 17/83] =?UTF-8?q?fix:=20=EB=A9=94=EB=89=B4=ED=8C=90=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메뉴판 정보 포함 --- .../domain/menu/api/MenuController.java | 4 +- .../menu/application/MenuFolderService.java | 2 +- .../domain/menu/application/MenuService.java | 15 +++++-- .../menu/dto/GetMenuFolderMenuResponse.java | 39 +++++++++++-------- .../menu/dto/MenuFolderMenuResponse.java | 33 ++++++++++++++++ 5 files changed, 69 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java diff --git a/src/main/java/com/ourmenu/backend/domain/menu/api/MenuController.java b/src/main/java/com/ourmenu/backend/domain/menu/api/MenuController.java index e67bbed3..d890255d 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/api/MenuController.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/api/MenuController.java @@ -60,12 +60,12 @@ public ApiResponse deleteMenu(@PathVariable("menuId") Long menuId, @Operation(summary = "메뉴판 메뉴 리스트 조회", description = "메뉴판의 메뉴 리스트를 조회한다. 필터를 사용할 수 있다") @GetMapping("/menu-folders/{menuFolderId}/menus") - public ApiResponse> getMenuFolderMenus( + public ApiResponse getMenuFolderMenus( @PathVariable("menuFolderId") Long menuFolderId, @RequestParam(value = "sortOrder") SortOrder sortOrder, @AuthenticationPrincipal CustomUserDetails userDetails) { MenuFilterDto menuFilterDto = MenuFilterDto.from(sortOrder); - List response = menuService.findMenusByMenuFolder(userDetails.getId(), + GetMenuFolderMenuResponse response = menuService.findMenusByMenuFolder(userDetails.getId(), menuFolderId, menuFilterDto); return ApiUtil.success(response); } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java index ea89b722..25db347d 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java @@ -174,7 +174,7 @@ private MenuFolder saveMenuFolder(MenuFolderDto menuFolderDto, String imgUrl) { return saveMenuFolder; } - private MenuFolder findOne(Long userId, Long menuFolderId) { + public MenuFolder findOne(Long userId, Long menuFolderId) { MenuFolder menuFolder = menuFolderRepository.findById(menuFolderId) .orElseThrow(NotFoundMenuFolderException::new); Long findUserId = menuFolder.getUserId(); diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java index 1d065e0e..ff012e9b 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java @@ -12,10 +12,12 @@ import com.ourmenu.backend.domain.menu.dto.GetSimpleMenuResponse; import com.ourmenu.backend.domain.menu.dto.MenuDto; import com.ourmenu.backend.domain.menu.dto.MenuFilterDto; +import com.ourmenu.backend.domain.menu.dto.MenuFolderMenuResponse; import com.ourmenu.backend.domain.menu.dto.MenuSimpleDto; import com.ourmenu.backend.domain.menu.dto.SaveMenuResponse; import com.ourmenu.backend.domain.menu.exception.ForbiddenMenuException; import com.ourmenu.backend.domain.menu.exception.NotFoundMenuException; +import com.ourmenu.backend.domain.menu.util.DefaultImgConverter; import com.ourmenu.backend.domain.store.application.StoreService; import com.ourmenu.backend.domain.store.domain.Store; import com.ourmenu.backend.domain.tag.application.MenuTagService; @@ -37,6 +39,7 @@ public class MenuService { private final StoreService storeService; private final MenuImgService menuImgService; private final MenuFolderService menuFolderService; + private final DefaultImgConverter defaultImgConverter; /** * 메뉴 저장(메뉴 사진, 메뉴판, 태그 의존 엔티티 생성 @@ -100,8 +103,8 @@ public void deleteMenu(Long userId, Long menuId) { * @return */ @Transactional - public List findMenusByMenuFolder(Long userId, Long menuFolderId, - MenuFilterDto menuFilterDto) { + public GetMenuFolderMenuResponse findMenusByMenuFolder(Long userId, Long menuFolderId, + MenuFilterDto menuFilterDto) { List findMenuSimpleDto = new ArrayList<>(); SortOrder sortOrder = menuFilterDto.getSortOrder(); if (sortOrder.equals(SortOrder.TITLE_ASC)) { @@ -113,12 +116,16 @@ public List findMenusByMenuFolder(Long userId, Long m if (sortOrder.equals(SortOrder.PRICE_ASC)) { findMenuSimpleDto.addAll(menuRepository.findByMenuFolderIdOrderByPriceAsc(userId, menuFolderId)); } - return findMenuSimpleDto.stream() + List menuResponses = findMenuSimpleDto.stream() .map(menuSimpleDto -> { String imgUrl = menuImgService.findUniqueImg(menuSimpleDto.getMenuId()); - return GetMenuFolderMenuResponse.of(menuSimpleDto, imgUrl); + return MenuFolderMenuResponse.of(menuSimpleDto, imgUrl); }) .toList(); + MenuFolder menuFolder = menuFolderService.findOne(userId, menuFolderId); + + return GetMenuFolderMenuResponse.of(menuFolder, defaultImgConverter.getDefaultMenuFolderImgUrl(), + menuResponses); } /** diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java index 6b41af40..45b2306c 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java @@ -1,33 +1,38 @@ package com.ourmenu.backend.domain.menu.dto; -import java.time.LocalDateTime; +import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.menu.domain.MenuFolder; +import java.util.List; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder @Getter -@Builder(access = AccessLevel.PRIVATE) public class GetMenuFolderMenuResponse { - private Long menuId; - private String menuTitle; - private String storeTitle; - private String storeAddress; - private int menuPrice; - private String menuImgUrl; - private LocalDateTime createdAt; + private Long menuFolderId; + private String menuFolderTitle; + private String menuFolderImgUrl; + private MenuFolderIcon menuFolderIcon; + private List menus; + + public static GetMenuFolderMenuResponse of(MenuFolder menuFolder, String defaultMenuFolderImgUrl, + List menus) { + String menuFolderImgUrl = menuFolder.getImgUrl(); + if (menuFolderImgUrl == null) { + menuFolderImgUrl = defaultMenuFolderImgUrl; + } - public static GetMenuFolderMenuResponse of(MenuSimpleDto menuSimpleDto, String menuImgUrl) { return GetMenuFolderMenuResponse.builder() - .menuId(menuSimpleDto.getMenuId()) - .menuTitle(menuSimpleDto.getMenuTitle()) - .storeTitle(menuSimpleDto.getStoreTitle()) - .storeAddress(menuSimpleDto.getStoreAddress()) - .menuPrice(menuSimpleDto.getMenuPrice()) - .menuImgUrl(menuImgUrl) - .createdAt(menuSimpleDto.getCreatedAt()) + .menuFolderId(menuFolder.getId()) + .menuFolderTitle(menuFolder.getTitle()) + .menuFolderImgUrl(menuFolderImgUrl) + .menuFolderIcon(menuFolder.getIcon()) + .menus(menus) .build(); } + } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java new file mode 100644 index 00000000..4683d340 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java @@ -0,0 +1,33 @@ +package com.ourmenu.backend.domain.menu.dto; + +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +@Builder(access = AccessLevel.PRIVATE) +public class MenuFolderMenuResponse { + + private Long menuId; + private String menuTitle; + private String storeTitle; + private String storeAddress; + private int menuPrice; + private String menuImgUrl; + private LocalDateTime createdAt; + + public static MenuFolderMenuResponse of(MenuSimpleDto menuSimpleDto, String menuImgUrl) { + return MenuFolderMenuResponse.builder() + .menuId(menuSimpleDto.getMenuId()) + .menuTitle(menuSimpleDto.getMenuTitle()) + .storeTitle(menuSimpleDto.getStoreTitle()) + .storeAddress(menuSimpleDto.getStoreAddress()) + .menuPrice(menuSimpleDto.getMenuPrice()) + .menuImgUrl(menuImgUrl) + .createdAt(menuSimpleDto.getCreatedAt()) + .build(); + } +} From b9f19ed62a8c82a11191bbd5b1f29a28f67cbf43 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 17:06:56 +0900 Subject: [PATCH 18/83] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20@Transactional=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - public 변경으로 인한 위치 변경 --- .../menu/application/MenuFolderService.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java index 25db347d..285015c3 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java @@ -134,7 +134,6 @@ public UpdateMenuFolderResponse updateMenuFolderIndex(Long userId, Long menuFold * @param userId * @return index 기준 내림 차순 메뉴판 리스트 */ - @Transactional public GetMenuFolderResponse findAllMenuFolder(Long userId) { List menuFolders = menuFolderRepository.findAllByUserIdOrderByIndexDesc(userId); @@ -149,11 +148,20 @@ public GetMenuFolderResponse findAllMenuFolder(Long userId) { return GetMenuFolderResponse.of(menuCount, menuFolderResponses); } - @Transactional public List findAllByMenuId(Long menuId) { return menuFolderRepository.findMenuFoldersByMenuId(menuId); } + public MenuFolder findOne(Long userId, Long menuFolderId) { + MenuFolder menuFolder = menuFolderRepository.findById(menuFolderId) + .orElseThrow(NotFoundMenuFolderException::new); + Long findUserId = menuFolder.getUserId(); + if (!userId.equals(findUserId)) { + throw new ForbiddenMenuFolderException(); + } + return menuFolder; + } + /** * 메뉴폴더 저장 * @@ -173,14 +181,4 @@ private MenuFolder saveMenuFolder(MenuFolderDto menuFolderDto, String imgUrl) { menuMenuFolderService.saveMenuMenuFolders(menuFolderDto.getMenuIds(), menuFolder.getUserId(), saveMenuFolder); return saveMenuFolder; } - - public MenuFolder findOne(Long userId, Long menuFolderId) { - MenuFolder menuFolder = menuFolderRepository.findById(menuFolderId) - .orElseThrow(NotFoundMenuFolderException::new); - Long findUserId = menuFolder.getUserId(); - if (!userId.equals(findUserId)) { - throw new ForbiddenMenuFolderException(); - } - return menuFolder; - } } From f7fc06f1a69f4bfe7ad527d452f357cf8f6b8ace Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 17:45:17 +0900 Subject: [PATCH 19/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메뉴판_정보_및_메뉴판에_속한_메뉴들을_조회_할_수_있다 --- .../backend/domain/menu/api/MenuApiTest.java | 59 ++++++++++++++++ .../domain/menu/config/MenuTestConfig.java | 8 ++- .../domain/menu/data/MenuTestData.java | 68 ++++++++++++++++++- .../domain/menu/data/StoreTestData.java | 39 +++++++++++ 4 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java create mode 100644 src/test/java/com/ourmenu/backend/domain/menu/data/StoreTestData.java diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java new file mode 100644 index 00000000..c308fbe6 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java @@ -0,0 +1,59 @@ +package com.ourmenu.backend.domain.menu.api; + +import com.ourmenu.backend.domain.menu.config.MenuTestConfig; +import com.ourmenu.backend.domain.menu.data.MenuTestData; +import com.ourmenu.backend.domain.menu.data.UserTestData; +import com.ourmenu.backend.domain.menu.domain.MenuFolder; +import com.ourmenu.backend.domain.menu.domain.SortOrder; +import com.ourmenu.backend.domain.menu.dto.GetMenuFolderMenuResponse; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.response.ApiResponse; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +@SpringBootTest +@Import({TestConfig.class, MenuTestConfig.class}) +@DisplayName("메뉴 통합 테스트") +public class MenuApiTest { + + @Autowired + MenuController menuController; + + @Autowired + UserTestData userTestData; + + @Autowired + MenuTestData menuTestData; + + @Autowired + DatabaseCleaner databaseCleaner; + + @BeforeEach + void setUp() { + databaseCleaner.clear(); + } + + @Test + void 메뉴판_정보_및_메뉴판에_속한_메뉴들을_조회_할_수_있다() { + //given + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + MenuFolder testMenuFolder = menuTestData.createMenuFolderWithMenu(testCustomUserDetails); + + //when + ApiResponse response = menuController.getMenuFolderMenus( + testMenuFolder.getId(), SortOrder.TITLE_ASC, testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + Assertions.assertThat(response.getResponse().getMenuFolderIcon()).isEqualTo(testMenuFolder.getIcon()); + Assertions.assertThat(response.getResponse().getMenuFolderTitle()).isEqualTo(testMenuFolder.getTitle()); + Assertions.assertThat(response.getResponse().getMenus().size()).isEqualTo(3); + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java b/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java index b03e664b..40601996 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.menu.config; import com.ourmenu.backend.domain.menu.data.MenuTestData; +import com.ourmenu.backend.domain.menu.data.StoreTestData; import com.ourmenu.backend.domain.menu.data.UserTestData; import jakarta.persistence.EntityManager; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +21,11 @@ public UserTestData userTestData() { @Bean public MenuTestData menuTestData() { - return new MenuTestData(entityManager); + return new MenuTestData(entityManager, storeTestData()); + } + + @Bean + public StoreTestData storeTestData() { + return new StoreTestData(entityManager); } } diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java index 65794301..40c0620d 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java @@ -4,6 +4,8 @@ import com.ourmenu.backend.domain.cache.domain.MenuPin; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuFolder; +import com.ourmenu.backend.domain.menu.domain.MenuMenuFolder; +import com.ourmenu.backend.domain.store.domain.Store; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import jakarta.persistence.EntityManager; import java.util.List; @@ -12,9 +14,11 @@ public class MenuTestData { private EntityManager entityManager; + private StoreTestData storeTestData; - public MenuTestData(EntityManager entityManager) { + public MenuTestData(EntityManager entityManager, StoreTestData storeTestData) { this.entityManager = entityManager; + this.storeTestData = storeTestData; } @Transactional @@ -74,4 +78,66 @@ public Menu createTestMenu(CustomUserDetails customUserDetails) { entityManager.persist(menu); return menu; } + + @Transactional + public List createTestMenusWithStore(CustomUserDetails customUserDetails) { + Store store = storeTestData.createTestStore(); + + Menu menu1 = Menu.builder() + .title("테스트 메뉴1 비비큐") + .price(1000) + .pin(MenuPin.BBQ) + .memoTitle("테스트 메뉴1 메모 제목") + .memoContent("테스트 메뉴1 메모 내용") + .store(store) + .isCrawled(Boolean.FALSE) + .userId(customUserDetails.getId()) + .build(); + + Menu menu2 = Menu.builder() + .title("테스트 메뉴2 빵") + .price(2000) + .pin(MenuPin.BREAD) + .memoTitle("테스트 메뉴2 메모 제목") + .memoContent("테스트 메뉴2 메모 내용") + .store(store) + .isCrawled(Boolean.FALSE) + .userId(customUserDetails.getId()) + .build(); + + Menu menu3 = Menu.builder() + .title("테스트 메뉴3 케익") + .price(3000) + .pin(MenuPin.CAKE) + .memoTitle("테스트 메뉴3 메모 제목") + .memoContent("테스트 메뉴3 메모 내용") + .store(store) + .isCrawled(Boolean.FALSE) + .userId(customUserDetails.getId()) + .build(); + + entityManager.persist(menu1); + entityManager.persist(menu2); + entityManager.persist(menu3); + return List.of(menu1, menu2, menu3); + } + + /** + * 메뉴판 생성 및 메뉴들과 연결합니다. + * + * @param customUserDetails + * @return + */ + @Transactional + public MenuFolder createMenuFolderWithMenu(CustomUserDetails customUserDetails) { + MenuFolder menuFolder = createTestMenuFolder(customUserDetails); + List menus = createTestMenusWithStore(customUserDetails); + menus.stream() + .map(menu -> MenuMenuFolder.builder() + .menu(menu) + .folderId(menuFolder.getId()) + .build()) + .forEach(entityManager::persist); + return menuFolder; + } } diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/StoreTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/StoreTestData.java new file mode 100644 index 00000000..0824ee7b --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/StoreTestData.java @@ -0,0 +1,39 @@ +package com.ourmenu.backend.domain.menu.data; + +import com.ourmenu.backend.domain.store.domain.Map; +import com.ourmenu.backend.domain.store.domain.Store; +import jakarta.persistence.EntityManager; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.PrecisionModel; + +public class StoreTestData { + + private EntityManager entityManager; + + public StoreTestData(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public Store createTestStore() { + int srid = 4326; + GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), srid); + + Coordinate coordinate = new Coordinate(127.085, 37.538); + Point location = geometryFactory.createPoint(coordinate); + + Map map = Map.builder() + .location(location) + .build(); + entityManager.persist(map); + + Store store = Store.builder() + .title("테스트 식당1") + .address("광진구 어딘가") + .map(map) + .build(); + entityManager.persist(store); + return store; + } +} From f2056b6cddc97f80a1639aec03a80d4752822c39 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 17:52:44 +0900 Subject: [PATCH 20/83] =?UTF-8?q?fix:=20response=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/menu/dto/MenuFolderResponse.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java index 8080d2f1..6a684b52 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java @@ -16,7 +16,7 @@ public class MenuFolderResponse { private Long menuFolderId; private String menuFolderTitle; - private String menuFolderUrl; + private String menuFolderImgUrl; private MenuFolderIcon menuFolderIcon; private List menuIds; private int index; @@ -34,7 +34,7 @@ public static MenuFolderResponse of(MenuFolder menuFolder, List return MenuFolderResponse.builder() .menuFolderId(menuFolder.getId()) .menuFolderTitle(menuFolder.getTitle()) - .menuFolderUrl(menuFolderImgUrl) + .menuFolderImgUrl(menuFolderImgUrl) .menuFolderIcon(menuFolder.getIcon()) .menuIds(menuIds) .index(menuFolder.getIndex()) From fe583dfca2798a33ba5249ddce7a41d5fcf5a556 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 10 Apr 2025 17:49:21 +0900 Subject: [PATCH 21/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java | 2 +- .../java/com/ourmenu/backend/domain/menu/data/MenuTestData.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index 4c25ec32..36866145 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -160,7 +160,7 @@ void setUp() { void 메뉴_폴더_순서를_변경_할_수_있다() { //given CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); - menuTestData.createTestMenuFolderList(testCustomUserDetails); + menuTestData.createTestMenuFolders(testCustomUserDetails); //when ApiResponse preResponse = menuFolderController.getMenuFolder( diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java index 40c0620d..bc7519af 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java @@ -35,7 +35,7 @@ public MenuFolder createTestMenuFolder(CustomUserDetails customUserDetails) { } @Transactional - public List createTestMenuFolderList(CustomUserDetails customUserDetails) { + public List createTestMenuFolders(CustomUserDetails customUserDetails) { MenuFolder menuFolder1 = MenuFolder.builder() .title("테스트 메뉴 폴더1") .imgUrl(null) From 1573988ce7fa0cccc7c7a5c51ad1a762b8b6fc3c Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 14:45:45 +0900 Subject: [PATCH 22/83] =?UTF-8?q?fix:=20gitignore=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 189cd414..e1175e49 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ +.DS_Store ### STS ### .apt_generated From 0de9c160c1ddc28c7a8582e1ef26df4428c50efe Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 14:46:02 +0900 Subject: [PATCH 23/83] =?UTF-8?q?test=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메뉴를_등록_할_수_있다 --- .../backend/domain/menu/api/MenuApiTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java index c308fbe6..1f9c7c81 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java @@ -1,11 +1,14 @@ package com.ourmenu.backend.domain.menu.api; +import com.ourmenu.backend.domain.cache.domain.MenuPin; import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; import com.ourmenu.backend.domain.menu.data.UserTestData; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.domain.SortOrder; import com.ourmenu.backend.domain.menu.dto.GetMenuFolderMenuResponse; +import com.ourmenu.backend.domain.menu.dto.SaveMenuRequest; +import com.ourmenu.backend.domain.menu.dto.SaveMenuResponse; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; @@ -56,4 +59,23 @@ void setUp() { Assertions.assertThat(response.getResponse().getMenuFolderTitle()).isEqualTo(testMenuFolder.getTitle()); Assertions.assertThat(response.getResponse().getMenus().size()).isEqualTo(3); } + + @Test + void 메뉴를_등록_할_수_있다() { + //given + CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); + String menuMemoTitle = "비비큐"; + SaveMenuRequest request = new SaveMenuRequest(null, "테스트 메뉴", 1000, MenuPin.BBQ, menuMemoTitle, + "맛있다", null, "31060661", true, null); + + //when + ApiResponse response = menuController.saveMenu(request, + testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + Assertions.assertThat(response.getResponse().getMenuPin()).isEqualTo(MenuPin.BBQ); + Assertions.assertThat(response.getResponse().getMenuMemoTitle()).isEqualTo(menuMemoTitle); + } + } From 56f7f4f12fa4468d6f2a466630e9926e8724074e Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 14:54:13 +0900 Subject: [PATCH 24/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메뉴를_전체_조회_할_수_있다 --- .../backend/domain/menu/api/MenuApiTest.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java index 1f9c7c81..08ba8700 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java @@ -4,15 +4,18 @@ import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; import com.ourmenu.backend.domain.menu.data.UserTestData; +import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.domain.SortOrder; import com.ourmenu.backend.domain.menu.dto.GetMenuFolderMenuResponse; +import com.ourmenu.backend.domain.menu.dto.GetSimpleMenuResponse; import com.ourmenu.backend.domain.menu.dto.SaveMenuRequest; import com.ourmenu.backend.domain.menu.dto.SaveMenuResponse; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.response.ApiResponse; +import java.util.List; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -38,15 +41,17 @@ public class MenuApiTest { @Autowired DatabaseCleaner databaseCleaner; + CustomUserDetails testCustomUserDetails; + @BeforeEach void setUp() { databaseCleaner.clear(); + testCustomUserDetails = userTestData.createTestEmailUser(); } @Test void 메뉴판_정보_및_메뉴판에_속한_메뉴들을_조회_할_수_있다() { //given - CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); MenuFolder testMenuFolder = menuTestData.createMenuFolderWithMenu(testCustomUserDetails); //when @@ -63,7 +68,6 @@ void setUp() { @Test void 메뉴를_등록_할_수_있다() { //given - CustomUserDetails testCustomUserDetails = userTestData.createTestEmailUser(); String menuMemoTitle = "비비큐"; SaveMenuRequest request = new SaveMenuRequest(null, "테스트 메뉴", 1000, MenuPin.BBQ, menuMemoTitle, "맛있다", null, "31060661", true, null); @@ -78,4 +82,17 @@ void setUp() { Assertions.assertThat(response.getResponse().getMenuMemoTitle()).isEqualTo(menuMemoTitle); } + @Test + void 메뉴를_전체_조회_할_수_있다() { + //given + List preStoredMenus = menuTestData.createTestMenusWithStore(testCustomUserDetails); + + //when + ApiResponse> response = menuController.getMenus(null, null, null, 0, 10, + SortOrder.CREATED_AT_DESC, testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + Assertions.assertThat(response.getResponse().size()).isEqualTo(preStoredMenus.size()); + } } From ba254a8832b06622ce746a3289da2877bcd5181d Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 15:21:37 +0900 Subject: [PATCH 25/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메뉴를_삭제할_수_있다 --- .../backend/domain/menu/api/MenuApiTest.java | 15 +++++++++++++++ .../backend/domain/menu/data/MenuTestData.java | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java index 08ba8700..8c2d548c 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java @@ -11,6 +11,7 @@ import com.ourmenu.backend.domain.menu.dto.GetSimpleMenuResponse; import com.ourmenu.backend.domain.menu.dto.SaveMenuRequest; import com.ourmenu.backend.domain.menu.dto.SaveMenuResponse; +import com.ourmenu.backend.domain.menu.exception.NotFoundMenuException; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; @@ -95,4 +96,18 @@ void setUp() { Assertions.assertThat(response.isSuccess()).isTrue(); Assertions.assertThat(response.getResponse().size()).isEqualTo(preStoredMenus.size()); } + + @Test + void 메뉴를_삭제할_수_있다() { + //given + Menu testMenu = menuTestData.createTestMenu(testCustomUserDetails); + + //when + ApiResponse response = menuController.deleteMenu(testMenu.getId(), testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + Assertions.assertThatThrownBy(() -> menuController.getMenu(testMenu.getId(), testCustomUserDetails)) + .isInstanceOf(NotFoundMenuException.class); + } } diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java index bc7519af..2492818c 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/data/MenuTestData.java @@ -65,12 +65,15 @@ public List createTestMenuFolders(CustomUserDetails customUserDetail @Transactional public Menu createTestMenu(CustomUserDetails customUserDetails) { + Store store = storeTestData.createTestStore(); + Menu menu = Menu.builder() .title("테스트 메뉴 비비큐") .price(1000) .pin(MenuPin.BBQ) .memoTitle("테스트 메뉴 메모 제목") .memoContent("테스트 메뉴 메모 내용") + .store(store) .isCrawled(Boolean.FALSE) .userId(customUserDetails.getId()) .build(); From fa8827107ad9181ab5e0c3eddb44f7060184c731 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 15:56:54 +0900 Subject: [PATCH 26/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 식당을_최대_5개_검색_할_수_있디 --- .../domain/search/api/SearchApiTest.java | 54 +++++++++++++++++++ .../search/config/SearchTestConfig.java | 19 +++++++ 2 files changed, 73 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java create mode 100644 src/test/java/com/ourmenu/backend/domain/search/config/SearchTestConfig.java diff --git a/src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java b/src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java new file mode 100644 index 00000000..69c44b9c --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java @@ -0,0 +1,54 @@ +package com.ourmenu.backend.domain.search.api; + +import com.ourmenu.backend.domain.menu.config.MenuTestConfig; +import com.ourmenu.backend.domain.menu.data.UserTestData; +import com.ourmenu.backend.domain.search.dto.SearchStoreResponse; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.response.ApiResponse; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +@SpringBootTest +@Import({TestConfig.class, MenuTestConfig.class}) +@DisplayName("검색 통합 테스트") +public class SearchApiTest { + + @Autowired + SearchController searchController; + + @Autowired + UserTestData userTestData; + + @Autowired + DatabaseCleaner databaseCleaner; + + CustomUserDetails testCustomUserDetails; + + @BeforeEach + void setUp() { + databaseCleaner.clear(); + testCustomUserDetails = userTestData.createTestEmailUser(); + } + + @Test + void 식당을_최대_5개_검색_할_수_있디() { + //given + String searchWord = "고기"; + + //when + ApiResponse> response = searchController.searchStore(searchWord, 127.0759204, + 37.5423265); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + Assertions.assertThat(response.getResponse().size()).isBetween(1, 5); + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/search/config/SearchTestConfig.java b/src/test/java/com/ourmenu/backend/domain/search/config/SearchTestConfig.java new file mode 100644 index 00000000..f99f8b12 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/search/config/SearchTestConfig.java @@ -0,0 +1,19 @@ +package com.ourmenu.backend.domain.search.config; + +import com.ourmenu.backend.domain.menu.data.UserTestData; +import jakarta.persistence.EntityManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class SearchTestConfig { + + @Autowired + EntityManager entityManager; + + @Bean + public UserTestData userTestData() { + return new UserTestData(entityManager); + } +} From fb96861f12f0361f3a1899f1b6ddab0872d28594 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 16:16:16 +0900 Subject: [PATCH 27/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 식당을_최대_5개_검색_할_수_있디 - 검색한_식당을_상세조회_할_수_있다 --- .../domain/search/api/SearchApiTest.java | 39 +++++++++++++++++++ .../domain/search/data/SearchTestData.java | 13 +++++++ 2 files changed, 52 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java diff --git a/src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java b/src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java index 69c44b9c..9e91905c 100644 --- a/src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/search/api/SearchApiTest.java @@ -2,6 +2,8 @@ import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.UserTestData; +import com.ourmenu.backend.domain.search.dto.GetSearchHistoryResponse; +import com.ourmenu.backend.domain.search.dto.GetStoreResponse; import com.ourmenu.backend.domain.search.dto.SearchStoreResponse; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; @@ -51,4 +53,41 @@ void setUp() { Assertions.assertThat(response.isSuccess()).isTrue(); Assertions.assertThat(response.getResponse().size()).isBetween(1, 5); } + + @Test + void 검색한_식당을_상세조회_할_수_있다() { + //given + String searchWord = "고기"; + String storeId = getStoreIds(searchWord).stream().findFirst().orElseThrow(() -> new RuntimeException("테스트 실패")); + + //when + ApiResponse response = searchController.getStore(true, storeId, testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + } + + @Test + void 검색_기록을_조회_할_수_있다() { + //given + String searchWord = "고기"; + String storeId = getStoreIds(searchWord).stream().findFirst().orElseThrow(() -> new RuntimeException("테스트 실패")); + searchController.getStore(true, storeId, testCustomUserDetails); + + //when + ApiResponse> response = searchController.getSearchHistory( + testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + Assertions.assertThat(response.getResponse().size()).isEqualTo(1); + } + + private List getStoreIds(String query) { + ApiResponse> response = searchController.searchStore(query, 127.0759204, + 37.5423265); + return response.getResponse().stream() + .map(SearchStoreResponse::getStoreId) + .toList(); + } } diff --git a/src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java b/src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java new file mode 100644 index 00000000..77833f6e --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java @@ -0,0 +1,13 @@ +package com.ourmenu.backend.domain.search.data; + +import jakarta.persistence.EntityManager; + +public class SearchTestData { + + private EntityManager entityManager; + + public SearchTestData(EntityManager entityManager) { + this.entityManager = entityManager; + } + +} From 3d9a0f7f9aece22edd3f1ee49183947624bfb8ed Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 17:19:38 +0900 Subject: [PATCH 28/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 온보딩_질문을_갱신_또는_생성_할_수_있다 - 온보딩_질문_답을_저장_할_수_있다 - 올바르지_않는_온보딩_질문_답에_대해서_예외를_발생시킨다 --- .../domain/home/dto/SaveAnswerRequest.java | 2 + .../backend/domain/home/api/HomeApiTest.java | 84 +++++++++++++++++++ .../domain/home/config/HomeTestConfig.java | 25 ++++++ .../domain/home/data/HomeTestData.java | 25 ++++++ .../domain/home/data/UserTestData.java | 60 +++++++++++++ 5 files changed, 196 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java create mode 100644 src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java create mode 100644 src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java create mode 100644 src/test/java/com/ourmenu/backend/domain/home/data/UserTestData.java diff --git a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAnswerRequest.java b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAnswerRequest.java index a12eb159..01055308 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAnswerRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAnswerRequest.java @@ -1,10 +1,12 @@ package com.ourmenu.backend.domain.home.dto; import com.ourmenu.backend.domain.home.domain.Answer; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @NoArgsConstructor +@AllArgsConstructor @Getter public class SaveAnswerRequest { diff --git a/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java new file mode 100644 index 00000000..abae37c1 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java @@ -0,0 +1,84 @@ +package com.ourmenu.backend.domain.home.api; + +import com.ourmenu.backend.domain.home.config.HomeTestConfig; +import com.ourmenu.backend.domain.home.data.HomeTestData; +import com.ourmenu.backend.domain.home.data.UserTestData; +import com.ourmenu.backend.domain.home.domain.Answer; +import com.ourmenu.backend.domain.home.dto.SaveAndGetQuestionRequest; +import com.ourmenu.backend.domain.home.dto.SaveAnswerRequest; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.response.ApiResponse; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +@SpringBootTest +@Import({TestConfig.class, HomeTestConfig.class}) +@DisplayName("홈 통합 테스트") +public class HomeApiTest { + + @Autowired + HomeController homeController; + + @Autowired + HomeTestData homeTestData; + + @Autowired + UserTestData userTestData; + + @Autowired + DatabaseCleaner databaseCleaner; + + CustomUserDetails testCustomUserDetails; + + @BeforeEach + void setUp() { + databaseCleaner.clear(); + testCustomUserDetails = userTestData.createTestEmailUserWithMealTime(); + } + + @Test + void 온보딩_질문을_갱신_또는_생성_할_수_있다() { + //given + + //when + ApiResponse response = homeController.saveAndGetQuestion( + testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + } + + @Test + void 온보딩_질문_답을_저장_할_수_있다() { + //given + homeTestData.createQuestion(testCustomUserDetails.getId()); + + //when + SaveAnswerRequest request = new SaveAnswerRequest(Answer.LIKE); + ApiResponse response = homeController.saveQuestionAnswer(request, testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isTrue(); + } + + @Test + void 올바르지_않는_온보딩_질문_답에_대해서_예외를_발생시킨다() { + //given + homeTestData.createQuestion(testCustomUserDetails.getId()); + + //when + SaveAnswerRequest request = new SaveAnswerRequest(Answer.SEA); + + //then + Assertions.assertThatThrownBy(() -> homeController.saveQuestionAnswer(request, testCustomUserDetails)) + .isInstanceOf(RuntimeException.class); + } + +} diff --git a/src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java b/src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java new file mode 100644 index 00000000..6444e357 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java @@ -0,0 +1,25 @@ +package com.ourmenu.backend.domain.home.config; + +import com.ourmenu.backend.domain.home.data.HomeTestData; +import com.ourmenu.backend.domain.home.data.UserTestData; +import jakarta.persistence.EntityManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class HomeTestConfig { + + @Autowired + EntityManager entityManager; + + @Bean + public UserTestData userTestData() { + return new UserTestData(entityManager); + } + + @Bean + public HomeTestData homeTestData() { + return new HomeTestData(entityManager); + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java b/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java new file mode 100644 index 00000000..ca5645fb --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java @@ -0,0 +1,25 @@ +package com.ourmenu.backend.domain.home.data; + +import com.ourmenu.backend.domain.home.domain.HomeQuestionAnswer; +import com.ourmenu.backend.domain.home.domain.Question; +import jakarta.persistence.EntityManager; +import org.springframework.transaction.annotation.Transactional; + +public class HomeTestData { + + EntityManager entityManager; + + public HomeTestData(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Transactional + public HomeQuestionAnswer createQuestion(Long userId) { + HomeQuestionAnswer homeQuestionAnswer = HomeQuestionAnswer.builder() + .question(Question.FEEL) + .userId(userId) + .build(); + entityManager.persist(homeQuestionAnswer); + return homeQuestionAnswer; + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/home/data/UserTestData.java b/src/test/java/com/ourmenu/backend/domain/home/data/UserTestData.java new file mode 100644 index 00000000..383cdc78 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/home/data/UserTestData.java @@ -0,0 +1,60 @@ +package com.ourmenu.backend.domain.home.data; + +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.domain.user.domain.MealTime; +import com.ourmenu.backend.domain.user.domain.SignInType; +import com.ourmenu.backend.domain.user.domain.User; +import jakarta.persistence.EntityManager; +import java.time.LocalTime; +import org.springframework.transaction.annotation.Transactional; + +public class UserTestData { + + private EntityManager entityManager; + + public UserTestData(EntityManager entityManager) { + this.entityManager = entityManager; + } + + + @Transactional + public CustomUserDetails createTestEmailUser() { + String email = "testEmailUser@naver.com"; + String password = "password1!"; + User user = User.builder() + .email(email) + .password(password) + .signInType(SignInType.EMAIL) + .build(); + entityManager.persist(user); + entityManager.flush(); + return new CustomUserDetails(user.getId(), email, password); + } + + @Transactional + public CustomUserDetails createTestEmailUserWithMealTime() { + CustomUserDetails testEmailUser = createTestEmailUser(); + + MealTime mealTime = MealTime.builder() + .userId(testEmailUser.getId()) + .mealTime(LocalTime.NOON) + .build(); + entityManager.persist(mealTime); + + return testEmailUser; + } + + @Transactional + public CustomUserDetails createTestKakaoUser() { + String email = "testKakaoUser@naver.com"; + String password = "password1!"; + User user = User.builder() + .email(email) + .password(password) + .signInType(SignInType.KAKAO) + .build(); + entityManager.persist(user); + entityManager.flush(); + return new CustomUserDetails(user.getId(), email, password); + } +} From 266f1dc01f101861bfe5dea01be69e41bd08ec42 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 17:55:09 +0900 Subject: [PATCH 29/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 온보딩_질문_응답에_대한_추천_메뉴를_구성한다 --- .../backend/domain/home/api/HomeApiTest.java | 21 ++++- .../domain/home/data/HomeTestData.java | 83 ++++++++++++++++++- 2 files changed, 101 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java index abae37c1..0b6448e2 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java @@ -4,6 +4,7 @@ import com.ourmenu.backend.domain.home.data.HomeTestData; import com.ourmenu.backend.domain.home.data.UserTestData; import com.ourmenu.backend.domain.home.domain.Answer; +import com.ourmenu.backend.domain.home.dto.GetHomeRecommendResponse; import com.ourmenu.backend.domain.home.dto.SaveAndGetQuestionRequest; import com.ourmenu.backend.domain.home.dto.SaveAnswerRequest; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; @@ -58,7 +59,7 @@ void setUp() { @Test void 온보딩_질문_답을_저장_할_수_있다() { //given - homeTestData.createQuestion(testCustomUserDetails.getId()); + homeTestData.createTestQuestion(testCustomUserDetails.getId()); //when SaveAnswerRequest request = new SaveAnswerRequest(Answer.LIKE); @@ -71,7 +72,7 @@ void setUp() { @Test void 올바르지_않는_온보딩_질문_답에_대해서_예외를_발생시킨다() { //given - homeTestData.createQuestion(testCustomUserDetails.getId()); + homeTestData.createTestQuestion(testCustomUserDetails.getId()); //when SaveAnswerRequest request = new SaveAnswerRequest(Answer.SEA); @@ -81,4 +82,20 @@ void setUp() { .isInstanceOf(RuntimeException.class); } + @Test + void 온보딩_질문_응답에_대한_추천_메뉴를_구성한다() { + //given + homeTestData.createTestHomeMenu(testCustomUserDetails); + + //when + SaveAnswerRequest request = new SaveAnswerRequest(Answer.LIKE); + homeController.saveQuestionAnswer(request, testCustomUserDetails); + ApiResponse response = homeController.getHomeMenus(testCustomUserDetails); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().getAnswer()).isEqualTo(Answer.LIKE); + Assertions.assertThat(response.getResponse().getAnswerRecommendMenus().size()).isEqualTo(2); + } + } diff --git a/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java b/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java index ca5645fb..e2f6b542 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java @@ -1,8 +1,19 @@ package com.ourmenu.backend.domain.home.data; +import com.ourmenu.backend.domain.cache.domain.MenuPin; import com.ourmenu.backend.domain.home.domain.HomeQuestionAnswer; import com.ourmenu.backend.domain.home.domain.Question; +import com.ourmenu.backend.domain.menu.domain.Menu; +import com.ourmenu.backend.domain.store.domain.Map; +import com.ourmenu.backend.domain.store.domain.Store; +import com.ourmenu.backend.domain.tag.domain.MenuTag; +import com.ourmenu.backend.domain.tag.domain.Tag; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import jakarta.persistence.EntityManager; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.PrecisionModel; import org.springframework.transaction.annotation.Transactional; public class HomeTestData { @@ -14,7 +25,7 @@ public HomeTestData(EntityManager entityManager) { } @Transactional - public HomeQuestionAnswer createQuestion(Long userId) { + public HomeQuestionAnswer createTestQuestion(Long userId) { HomeQuestionAnswer homeQuestionAnswer = HomeQuestionAnswer.builder() .question(Question.FEEL) .userId(userId) @@ -22,4 +33,74 @@ public HomeQuestionAnswer createQuestion(Long userId) { entityManager.persist(homeQuestionAnswer); return homeQuestionAnswer; } + + /** + * 홈 화면에 필요한 테스트 데이터를 저장한다 + * + * @param userId + */ + @Transactional + public void createTestHomeMenu(CustomUserDetails customUserDetails) { + int srid = 4326; + GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), srid); + + Coordinate coordinate = new Coordinate(127.085, 37.538); + Point location = geometryFactory.createPoint(coordinate); + + Map map = Map.builder() + .location(location) + .build(); + entityManager.persist(map); + + Store store = Store.builder() + .title("테스트 식당1") + .address("광진구 어딘가") + .map(map) + .build(); + entityManager.persist(store); + + Menu menu1 = Menu.builder() + .title("테스트 메뉴1 비비큐") + .price(1000) + .pin(MenuPin.BBQ) + .memoTitle("테스트 메뉴1 메모 제목") + .memoContent("테스트 메뉴1 메모 내용") + .store(store) + .isCrawled(Boolean.FALSE) + .userId(customUserDetails.getId()) + .build(); + + Menu menu2 = Menu.builder() + .title("테스트 메뉴2 빵") + .price(2000) + .pin(MenuPin.BREAD) + .memoTitle("테스트 메뉴2 메모 제목") + .memoContent("테스트 메뉴2 메모 내용") + .store(store) + .isCrawled(Boolean.FALSE) + .userId(customUserDetails.getId()) + .build(); + + entityManager.persist(menu1); + entityManager.persist(menu2); + + MenuTag menuTag1 = MenuTag.builder() + .menuId(menu1.getId()) + .tag(Tag.PROMISE) + .build(); + + MenuTag menuTag2 = MenuTag.builder() + .menuId(menu2.getId()) + .tag(Tag.PROMISE) + .build(); + + entityManager.persist(menuTag1); + entityManager.persist(menuTag2); + + HomeQuestionAnswer homeQuestionAnswer = HomeQuestionAnswer.builder() + .question(Question.FEEL) + .userId(customUserDetails.getId()) + .build(); + entityManager.persist(homeQuestionAnswer); + } } From 6ef1d8ea4b5e9601608ed12fd67de877689c67d1 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 May 2025 18:05:25 +0900 Subject: [PATCH 30/83] =?UTF-8?q?refactor:=20test=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/home/data/HomeTestData.java | 61 +++++++++---------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java b/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java index e2f6b542..d3c13b06 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java +++ b/src/test/java/com/ourmenu/backend/domain/home/data/HomeTestData.java @@ -37,7 +37,7 @@ public HomeQuestionAnswer createTestQuestion(Long userId) { /** * 홈 화면에 필요한 테스트 데이터를 저장한다 * - * @param userId + * @param customUserDetails */ @Transactional public void createTestHomeMenu(CustomUserDetails customUserDetails) { @@ -59,8 +59,29 @@ public void createTestHomeMenu(CustomUserDetails customUserDetails) { .build(); entityManager.persist(store); - Menu menu1 = Menu.builder() - .title("테스트 메뉴1 비비큐") + createTestMenu("테스트 메뉴1 비비큐", MenuPin.BBQ, Tag.PROMISE, store, customUserDetails); + createTestMenu("테스트 메뉴2 빵", MenuPin.BREAD, Tag.PROMISE, store, customUserDetails); + + HomeQuestionAnswer homeQuestionAnswer = HomeQuestionAnswer.builder() + .question(Question.FEEL) + .userId(customUserDetails.getId()) + .build(); + entityManager.persist(homeQuestionAnswer); + } + + /** + * 메뉴와 관련된 엔티티를 모두 저장 + * + * @param title + * @param menuPin + * @param tag + * @param store + * @param customUserDetails + */ + private void createTestMenu(String title, MenuPin menuPin, Tag tag, Store store, + CustomUserDetails customUserDetails) { + Menu menu = Menu.builder() + .title(title) .price(1000) .pin(MenuPin.BBQ) .memoTitle("테스트 메뉴1 메모 제목") @@ -70,37 +91,13 @@ public void createTestHomeMenu(CustomUserDetails customUserDetails) { .userId(customUserDetails.getId()) .build(); - Menu menu2 = Menu.builder() - .title("테스트 메뉴2 빵") - .price(2000) - .pin(MenuPin.BREAD) - .memoTitle("테스트 메뉴2 메모 제목") - .memoContent("테스트 메뉴2 메모 내용") - .store(store) - .isCrawled(Boolean.FALSE) - .userId(customUserDetails.getId()) - .build(); - - entityManager.persist(menu1); - entityManager.persist(menu2); - - MenuTag menuTag1 = MenuTag.builder() - .menuId(menu1.getId()) - .tag(Tag.PROMISE) - .build(); + entityManager.persist(menu); - MenuTag menuTag2 = MenuTag.builder() - .menuId(menu2.getId()) - .tag(Tag.PROMISE) + MenuTag menuTag = MenuTag.builder() + .menuId(menu.getId()) + .tag(tag) .build(); - entityManager.persist(menuTag1); - entityManager.persist(menuTag2); - - HomeQuestionAnswer homeQuestionAnswer = HomeQuestionAnswer.builder() - .question(Question.FEEL) - .userId(customUserDetails.getId()) - .build(); - entityManager.persist(homeQuestionAnswer); + entityManager.persist(menuTag); } } From e6cfdff17101bc5569b1d12806ddd2fc220d5d9c Mon Sep 17 00:00:00 2001 From: david-parkk Date: Mon, 5 May 2025 22:36:14 +0900 Subject: [PATCH 31/83] =?UTF-8?q?test:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/search/data/SearchTestData.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java diff --git a/src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java b/src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java deleted file mode 100644 index 77833f6e..00000000 --- a/src/test/java/com/ourmenu/backend/domain/search/data/SearchTestData.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ourmenu.backend.domain.search.data; - -import jakarta.persistence.EntityManager; - -public class SearchTestData { - - private EntityManager entityManager; - - public SearchTestData(EntityManager entityManager) { - this.entityManager = entityManager; - } - -} From 009018e0b79f3f49a96a231bfc670ad2d565f9a4 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Mon, 5 May 2025 22:55:59 +0900 Subject: [PATCH 32/83] =?UTF-8?q?test:=20global=20test=20data=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/home/api/HomeApiTest.java | 7 +-- .../domain/home/config/HomeTestConfig.java | 6 --- .../backend/domain/menu/api/MenuApiTest.java | 7 +-- .../domain/menu/api/MenuFolderApiTest.java | 6 +-- .../domain/menu/config/MenuTestConfig.java | 6 --- .../domain/menu/data/UserTestData.java | 45 ------------------- .../global/config/GlobalDataConfig.java | 19 ++++++++ .../data/GlobalUserTestData.java} | 32 ++++++------- 8 files changed, 46 insertions(+), 82 deletions(-) delete mode 100644 src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java create mode 100644 src/test/java/com/ourmenu/backend/global/config/GlobalDataConfig.java rename src/test/java/com/ourmenu/backend/{domain/home/data/UserTestData.java => global/data/GlobalUserTestData.java} (93%) diff --git a/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java index 0b6448e2..1cfed170 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java @@ -2,7 +2,6 @@ import com.ourmenu.backend.domain.home.config.HomeTestConfig; import com.ourmenu.backend.domain.home.data.HomeTestData; -import com.ourmenu.backend.domain.home.data.UserTestData; import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.home.dto.GetHomeRecommendResponse; import com.ourmenu.backend.domain.home.dto.SaveAndGetQuestionRequest; @@ -10,6 +9,8 @@ import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.config.GlobalDataConfig; +import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -20,7 +21,7 @@ import org.springframework.context.annotation.Import; @SpringBootTest -@Import({TestConfig.class, HomeTestConfig.class}) +@Import({GlobalDataConfig.class, TestConfig.class, HomeTestConfig.class}) @DisplayName("홈 통합 테스트") public class HomeApiTest { @@ -31,7 +32,7 @@ public class HomeApiTest { HomeTestData homeTestData; @Autowired - UserTestData userTestData; + GlobalUserTestData userTestData; @Autowired DatabaseCleaner databaseCleaner; diff --git a/src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java b/src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java index 6444e357..afe233b4 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java +++ b/src/test/java/com/ourmenu/backend/domain/home/config/HomeTestConfig.java @@ -1,7 +1,6 @@ package com.ourmenu.backend.domain.home.config; import com.ourmenu.backend.domain.home.data.HomeTestData; -import com.ourmenu.backend.domain.home.data.UserTestData; import jakarta.persistence.EntityManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.TestConfiguration; @@ -13,11 +12,6 @@ public class HomeTestConfig { @Autowired EntityManager entityManager; - @Bean - public UserTestData userTestData() { - return new UserTestData(entityManager); - } - @Bean public HomeTestData homeTestData() { return new HomeTestData(entityManager); diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java index c308fbe6..9edfc6db 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java @@ -2,13 +2,14 @@ import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; -import com.ourmenu.backend.domain.menu.data.UserTestData; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.domain.SortOrder; import com.ourmenu.backend.domain.menu.dto.GetMenuFolderMenuResponse; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.config.GlobalDataConfig; +import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -19,7 +20,7 @@ import org.springframework.context.annotation.Import; @SpringBootTest -@Import({TestConfig.class, MenuTestConfig.class}) +@Import({GlobalDataConfig.class, TestConfig.class, MenuTestConfig.class}) @DisplayName("메뉴 통합 테스트") public class MenuApiTest { @@ -27,7 +28,7 @@ public class MenuApiTest { MenuController menuController; @Autowired - UserTestData userTestData; + GlobalUserTestData userTestData; @Autowired MenuTestData menuTestData; diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index 36866145..d1fff782 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -3,7 +3,6 @@ import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; -import com.ourmenu.backend.domain.menu.data.UserTestData; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.dto.GetMenuFolderResponse; import com.ourmenu.backend.domain.menu.dto.SaveMenuFolderRequest; @@ -14,6 +13,7 @@ import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; import java.util.Collections; import org.assertj.core.api.Assertions; @@ -25,7 +25,7 @@ import org.springframework.context.annotation.Import; @SpringBootTest -@Import({TestConfig.class, MenuTestConfig.class}) +@Import({GlobalUserTestData.class, TestConfig.class, MenuTestConfig.class}) @DisplayName("메뉴 폴더 통합 테스트") public class MenuFolderApiTest { @@ -33,7 +33,7 @@ public class MenuFolderApiTest { MenuFolderController menuFolderController; @Autowired - UserTestData userTestData; + GlobalUserTestData userTestData; @Autowired MenuTestData menuTestData; diff --git a/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java b/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java index 40601996..64647fc3 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/config/MenuTestConfig.java @@ -2,7 +2,6 @@ import com.ourmenu.backend.domain.menu.data.MenuTestData; import com.ourmenu.backend.domain.menu.data.StoreTestData; -import com.ourmenu.backend.domain.menu.data.UserTestData; import jakarta.persistence.EntityManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.TestConfiguration; @@ -14,11 +13,6 @@ public class MenuTestConfig { @Autowired EntityManager entityManager; - @Bean - public UserTestData userTestData() { - return new UserTestData(entityManager); - } - @Bean public MenuTestData menuTestData() { return new MenuTestData(entityManager, storeTestData()); diff --git a/src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java b/src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java deleted file mode 100644 index 6f9f1de0..00000000 --- a/src/test/java/com/ourmenu/backend/domain/menu/data/UserTestData.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.ourmenu.backend.domain.menu.data; - -import com.ourmenu.backend.domain.user.domain.CustomUserDetails; -import com.ourmenu.backend.domain.user.domain.SignInType; -import com.ourmenu.backend.domain.user.domain.User; -import jakarta.persistence.EntityManager; -import org.springframework.transaction.annotation.Transactional; - -public class UserTestData { - - private EntityManager entityManager; - - public UserTestData(EntityManager entityManager) { - this.entityManager = entityManager; - } - - - @Transactional - public CustomUserDetails createTestEmailUser() { - String email = "testEmailUser@naver.com"; - String password = "password1!"; - User user = User.builder() - .email(email) - .password(password) - .signInType(SignInType.EMAIL) - .build(); - entityManager.persist(user); - entityManager.flush(); - return new CustomUserDetails(user.getId(), email, password); - } - - @Transactional - public CustomUserDetails createTestKakaoUser() { - String email = "testKakaoUser@naver.com"; - String password = "password1!"; - User user = User.builder() - .email(email) - .password(password) - .signInType(SignInType.KAKAO) - .build(); - entityManager.persist(user); - entityManager.flush(); - return new CustomUserDetails(user.getId(), email, password); - } -} diff --git a/src/test/java/com/ourmenu/backend/global/config/GlobalDataConfig.java b/src/test/java/com/ourmenu/backend/global/config/GlobalDataConfig.java new file mode 100644 index 00000000..a44fb8f6 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/global/config/GlobalDataConfig.java @@ -0,0 +1,19 @@ +package com.ourmenu.backend.global.config; + +import com.ourmenu.backend.global.data.GlobalUserTestData; +import jakarta.persistence.EntityManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class GlobalDataConfig { + + @Autowired + EntityManager entityManager; + + @Bean + public GlobalUserTestData globalUserTestData() { + return new GlobalUserTestData(entityManager); + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/home/data/UserTestData.java b/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java similarity index 93% rename from src/test/java/com/ourmenu/backend/domain/home/data/UserTestData.java rename to src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java index 383cdc78..6704228f 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/data/UserTestData.java +++ b/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java @@ -1,4 +1,4 @@ -package com.ourmenu.backend.domain.home.data; +package com.ourmenu.backend.global.data; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.domain.user.domain.MealTime; @@ -8,11 +8,11 @@ import java.time.LocalTime; import org.springframework.transaction.annotation.Transactional; -public class UserTestData { +public class GlobalUserTestData { private EntityManager entityManager; - public UserTestData(EntityManager entityManager) { + public GlobalUserTestData(EntityManager entityManager) { this.entityManager = entityManager; } @@ -31,19 +31,6 @@ public CustomUserDetails createTestEmailUser() { return new CustomUserDetails(user.getId(), email, password); } - @Transactional - public CustomUserDetails createTestEmailUserWithMealTime() { - CustomUserDetails testEmailUser = createTestEmailUser(); - - MealTime mealTime = MealTime.builder() - .userId(testEmailUser.getId()) - .mealTime(LocalTime.NOON) - .build(); - entityManager.persist(mealTime); - - return testEmailUser; - } - @Transactional public CustomUserDetails createTestKakaoUser() { String email = "testKakaoUser@naver.com"; @@ -57,4 +44,17 @@ public CustomUserDetails createTestKakaoUser() { entityManager.flush(); return new CustomUserDetails(user.getId(), email, password); } + + @Transactional + public CustomUserDetails createTestEmailUserWithMealTime() { + CustomUserDetails testEmailUser = createTestEmailUser(); + + MealTime mealTime = MealTime.builder() + .userId(testEmailUser.getId()) + .mealTime(LocalTime.NOON) + .build(); + entityManager.persist(mealTime); + + return testEmailUser; + } } From ea9f0377ff1fefafd37536322438f098def82dca Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 11 May 2025 18:39:42 +0900 Subject: [PATCH 33/83] =?UTF-8?q?fix:=20Controller=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20Public=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/api/EmailController.java | 6 +++--- .../domain/user/api/UserController.java | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java b/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java index 17e0605e..fe326fd5 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java @@ -26,21 +26,21 @@ public class EmailController { @Operation(summary = "이메일 인증 요청", description = "메일에 인증 메세지를 요청한다.") @PostMapping("") - private ApiResponse sendConfirmCode(@Valid @RequestBody PostEmailRequest request) { + public ApiResponse sendConfirmCode(@Valid @RequestBody PostEmailRequest request) { EmailResponse response = emailService.sendCodeToEmail(request); return ApiUtil.success(response); } @Operation(summary = "이메일 인증", description = "메일에 전송된 이메일을 인증한다.") @PostMapping("/confirm-code") - private ApiResponse verifyEmail(@Valid @RequestBody VerifyEmailRequest request) { + public ApiResponse verifyEmail(@Valid @RequestBody VerifyEmailRequest request) { emailService.verifyConfirmCode(request); return ApiUtil.successOnly(); } @Operation(summary = "임시 비밀번호 발급", description = "임시 비밀번호를 발급한다.") @PostMapping("/temporary-password") - private ApiResponse sendTemporaryPassword(@RequestBody PostEmailRequest request) { + public ApiResponse sendTemporaryPassword(@RequestBody PostEmailRequest request) { TemporaryPasswordResponse response = emailService.sendTemporaryPassword(request); return ApiUtil.success(response); } diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java index 985319c2..466e9a7d 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java @@ -40,28 +40,28 @@ public class UserController { @Operation(summary = "회원가입", description = "회원가입한다") @PostMapping("/sign-up") - private ApiResponse signUp(@Valid @RequestBody SignUpRequest request) { + public ApiResponse signUp(@Valid @RequestBody SignUpRequest request) { TokenDto response = userService.signUp(request); return ApiUtil.success(response); } @Operation(summary = "로그인", description = "로그인한다.") @PostMapping("/sign-in") - private ApiResponse signIn(@Valid @RequestBody SignInRequest request, HttpServletResponse response) { + public ApiResponse signIn(@Valid @RequestBody SignInRequest request, HttpServletResponse response) { TokenDto tokenDto = userService.signIn(request, response); return ApiUtil.success(tokenDto); } @Operation(summary = "카카오 계정 검증", description = "카카오 계정 존재 여부를 확인한다.") @PostMapping("/auth/kakao") - private ApiResponse checkKakaoUserExists(@RequestBody PostEmailRequest request) { + public ApiResponse checkKakaoUserExists(@RequestBody PostEmailRequest request) { KakaoExistenceResponse response = userService.validateKakaoUserExists(request); return ApiUtil.success(response); } @Operation(summary = "패스워드 변경", description = "패스워드를 변경한다.") @PatchMapping("/password") - private ApiResponse changePassword(@Valid @RequestBody UpdatePasswordRequest request, + public ApiResponse changePassword(@Valid @RequestBody UpdatePasswordRequest request, @AuthenticationPrincipal CustomUserDetails userDetails) { userService.changePassword(request, userDetails); return ApiUtil.successOnly(); @@ -69,7 +69,7 @@ private ApiResponse changePassword(@Valid @RequestBody UpdatePasswordReque @Operation(summary = "식사 시간 변경", description = "식사 시간을 변경한다.") @PatchMapping("/meal-time") - private ApiResponse changeMealTime(@Valid @RequestBody UpdateMealTimeRequest request, + public ApiResponse changeMealTime(@Valid @RequestBody UpdateMealTimeRequest request, @AuthenticationPrincipal CustomUserDetails userDetails) { mealTimeService.changeMealTime(request, userDetails.getId()); return ApiUtil.successOnly(); @@ -77,14 +77,14 @@ private ApiResponse changeMealTime(@Valid @RequestBody UpdateMealTimeReque @Operation(summary = "유저 정보 조회", description = "유저 정보를 조회한다") @GetMapping("") - private ApiResponse getUserInfo(@AuthenticationPrincipal CustomUserDetails userDetails) { + public ApiResponse getUserInfo(@AuthenticationPrincipal CustomUserDetails userDetails) { UserDto response = userService.getUserInfo(userDetails); return ApiUtil.success(response); } @Operation(summary = "로그아웃", description = "로그아웃한다.") @PostMapping("/sign-out") - private ApiResponse signOut(HttpServletRequest request, + public ApiResponse signOut(HttpServletRequest request, @AuthenticationPrincipal CustomUserDetails userDetails) { userService.signOut(request); return ApiUtil.successOnly(); @@ -92,14 +92,14 @@ private ApiResponse signOut(HttpServletRequest request, @Operation(summary = "토큰 갱신", description = "Access 토큰을 갱신한다.") @PostMapping("/reissue-token") - private ApiResponse reissueToken(@Valid @RequestBody ReissueRequest reissueRequest) { + public ApiResponse reissueToken(@Valid @RequestBody ReissueRequest reissueRequest) { TokenDto response = userService.reissueToken(reissueRequest); return ApiUtil.success(response); } @Operation(summary = "유저 삭제", description = "유저를 DB에서 삭제한다.") @DeleteMapping("") - private ApiResponse deleteUser(@AuthenticationPrincipal CustomUserDetails userDetails) { + public ApiResponse deleteUser(@AuthenticationPrincipal CustomUserDetails userDetails) { userService.removeUser(userDetails.getId()); return ApiUtil.successOnly(); } From d530ca09d6cbef4ef1f4ce3526666dfe1fff0bc3 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 11 May 2025 18:39:58 +0900 Subject: [PATCH 34/83] =?UTF-8?q?test:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20API=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 --- .../user/dto/request/SignInRequest.java | 4 +- .../user/dto/request/SignUpRequest.java | 4 +- .../backend/domain/user/api/UserApiTest.java | 61 +++++++++++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java index 5c2e9788..62e050c3 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java @@ -1,10 +1,10 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; @Getter -@NoArgsConstructor +@AllArgsConstructor public class SignInRequest { private String email; private String password; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index 0d7f7e62..9f2c03f6 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -1,12 +1,12 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; import java.util.ArrayList; @Getter -@NoArgsConstructor +@AllArgsConstructor public class SignUpRequest { private String email; private String password; diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java new file mode 100644 index 00000000..574df1fc --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -0,0 +1,61 @@ +package com.ourmenu.backend.domain.user.api; + +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; +import com.ourmenu.backend.domain.user.dto.response.TokenDto; +import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.config.GlobalDataConfig; +import com.ourmenu.backend.global.data.GlobalUserTestData; +import com.ourmenu.backend.global.response.ApiResponse; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +import java.util.ArrayList; + +@SpringBootTest +@Import({GlobalDataConfig.class, TestConfig.class}) +@DisplayName("유저 통합 테스트") +public class UserApiTest { + + @Autowired + UserController userController; + + @Autowired + GlobalUserTestData userTestData; + + @Autowired + DatabaseCleaner databaseCleaner; + + CustomUserDetails customUserDetails; + + @BeforeEach + void setUp() { + databaseCleaner.clear(); + } + + @Test + public void 회원_가입을_통해_유저를_생성할_수_있다() { + //given + ArrayList mealTime = new ArrayList<>(); + mealTime.add(12); + mealTime.add(16); + SignUpRequest signUpRequest = new SignUpRequest("test123@gmail.com", + "password123", + mealTime, + "EMAIL"); + + //when + ApiResponse response = userController.signUp(signUpRequest); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } + + +} From b1ff7b5d265946e4d841c74272d3cf789e115719 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 11 May 2025 19:22:01 +0900 Subject: [PATCH 35/83] =?UTF-8?q?test:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20API?= =?UTF-8?q?=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 --- .../backend/domain/user/api/UserApiTest.java | 20 +++++++++++++++++++ .../global/data/GlobalUserTestData.java | 9 ++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 574df1fc..5ed86ad0 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.user.api; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.domain.user.dto.request.SignInRequest; import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.global.DatabaseCleaner; @@ -8,10 +9,12 @@ import com.ourmenu.backend.global.config.GlobalDataConfig; import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; +import jakarta.servlet.http.HttpServletResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; @@ -57,5 +60,22 @@ void setUp() { Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + @Test + public void 로그인을_할_수_있다() { + //given + CustomUserDetails testEmailUser = userTestData.createTestEmailUser(); + SignInRequest request = new SignInRequest( + "testEmailUser@naver.com", + "password1!", + "EMAIL" + ); + HttpServletResponse response = Mockito.mock(HttpServletResponse.class); + + //when + ApiResponse signInResponse = userController.signIn(request, response); + + //then + Assertions.assertThat(signInResponse.isSuccess()).isEqualTo(true); + } } diff --git a/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java b/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java index 6704228f..f39ed92c 100644 --- a/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java +++ b/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java @@ -6,12 +6,19 @@ import com.ourmenu.backend.domain.user.domain.User; import jakarta.persistence.EntityManager; import java.time.LocalTime; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.transaction.annotation.Transactional; public class GlobalUserTestData { + @Autowired + PasswordEncoder passwordEncoder; + private EntityManager entityManager; + public GlobalUserTestData(EntityManager entityManager) { this.entityManager = entityManager; } @@ -23,7 +30,7 @@ public CustomUserDetails createTestEmailUser() { String password = "password1!"; User user = User.builder() .email(email) - .password(password) + .password(passwordEncoder.encode(password)) .signInType(SignInType.EMAIL) .build(); entityManager.persist(user); From 4b201b2e515d1258c75455ee89083b287e609550 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 11 May 2025 19:26:36 +0900 Subject: [PATCH 36/83] =?UTF-8?q?test:=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=20=EA=B2=80=EC=A6=9D=20API=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/dto/request/PostEmailRequest.java | 2 +- .../backend/domain/user/api/UserApiTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java index 99eb87be..010bb122 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java @@ -3,7 +3,7 @@ import lombok.*; @Getter -@NoArgsConstructor +@AllArgsConstructor public class PostEmailRequest { private String email; } diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 5ed86ad0..8e9a4f9e 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -1,8 +1,10 @@ package com.ourmenu.backend.domain.user.api; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest; import com.ourmenu.backend.domain.user.dto.request.SignInRequest; import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; +import com.ourmenu.backend.domain.user.dto.response.KakaoExistenceResponse; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; @@ -78,4 +80,16 @@ void setUp() { Assertions.assertThat(signInResponse.isSuccess()).isEqualTo(true); } + @Test + public void 카카오_계정을_검증할_수_있다() { + //given + CustomUserDetails testKakaoUser = userTestData.createTestKakaoUser(); + PostEmailRequest request = new PostEmailRequest("testKakaoUser@naver.com"); + + //when + ApiResponse response = userController.checkKakaoUserExists(request); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } } From bc18372942e0f1bbb49a9b41466e73dc909a42b1 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 11 May 2025 19:35:22 +0900 Subject: [PATCH 37/83] =?UTF-8?q?test:=20=EC=8B=9D=EC=82=AC=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EB=B3=80=EA=B2=BD=20API=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/dto/request/UpdateMealTimeRequest.java | 3 ++- .../backend/domain/user/api/UserApiTest.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java index 48611e52..20fad1dd 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java @@ -1,13 +1,14 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import java.util.ArrayList; @Getter -@NoArgsConstructor +@AllArgsConstructor public class UpdateMealTimeRequest { ArrayList mealTime; } diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 8e9a4f9e..aa7ad1a4 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -4,6 +4,7 @@ import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest; import com.ourmenu.backend.domain.user.dto.request.SignInRequest; import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; +import com.ourmenu.backend.domain.user.dto.request.UpdateMealTimeRequest; import com.ourmenu.backend.domain.user.dto.response.KakaoExistenceResponse; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.global.DatabaseCleaner; @@ -92,4 +93,20 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + + @Test + public void 식사시간_정보를_변경할_수_있다() { + //given + CustomUserDetails testEmailUserWithMealTime = userTestData.createTestEmailUserWithMealTime(); + ArrayList changeMealTime = new ArrayList<>(); + changeMealTime.add(10); + changeMealTime.add(16); + UpdateMealTimeRequest request = new UpdateMealTimeRequest(changeMealTime); + + //when + ApiResponse response = userController.changeMealTime(request, testEmailUserWithMealTime); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } } From 1bb68bcc2171bb03173fea35ba89c4d991381496 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 02:20:21 +0900 Subject: [PATCH 38/83] =?UTF-8?q?test:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B3=80=EA=B2=BD=20API=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/dto/request/UpdatePasswordRequest.java | 3 ++- .../backend/domain/user/api/UserApiTest.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java index 9673daf7..794049b4 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java @@ -1,10 +1,11 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@NoArgsConstructor +@AllArgsConstructor public class UpdatePasswordRequest { String password; String newPassword; diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index aa7ad1a4..43f380f8 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -5,6 +5,7 @@ import com.ourmenu.backend.domain.user.dto.request.SignInRequest; import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; import com.ourmenu.backend.domain.user.dto.request.UpdateMealTimeRequest; +import com.ourmenu.backend.domain.user.dto.request.UpdatePasswordRequest; import com.ourmenu.backend.domain.user.dto.response.KakaoExistenceResponse; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.global.DatabaseCleaner; @@ -109,4 +110,20 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + + @Test + public void 비밀번호를_변경할_수_있다() { + //given + CustomUserDetails testEmailUser = userTestData.createTestEmailUser(); + UpdatePasswordRequest request = new UpdatePasswordRequest( + "password1!", + "password2@" + ); + + //when + ApiResponse response = userController.changePassword(request, testEmailUser); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } } From 655bf3e5e47834e2369c66f8f87c9b3204e85586 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 02:35:53 +0900 Subject: [PATCH 39/83] =?UTF-8?q?test:=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20API=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 --- .../backend/domain/user/api/UserApiTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 43f380f8..8a7ba7d1 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -13,6 +13,7 @@ import com.ourmenu.backend.global.config.GlobalDataConfig; import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -126,4 +127,17 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + + @Test + public void 로그아웃_할_수_있다() { + //given + CustomUserDetails testEmailUser = userTestData.createTestEmailUser(); + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + + //when + ApiResponse response = userController.signOut(request, testEmailUser); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } } From ada29afe50a5c169124f8a3fcfe07c1e450f77d1 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 03:34:43 +0900 Subject: [PATCH 40/83] =?UTF-8?q?test:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/UserApiTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 8a7ba7d1..81b926ce 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.user.api; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.domain.user.domain.MealTime; import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest; import com.ourmenu.backend.domain.user.dto.request.SignInRequest; import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; @@ -8,6 +9,7 @@ import com.ourmenu.backend.domain.user.dto.request.UpdatePasswordRequest; import com.ourmenu.backend.domain.user.dto.response.KakaoExistenceResponse; import com.ourmenu.backend.domain.user.dto.response.TokenDto; +import com.ourmenu.backend.domain.user.dto.response.UserDto; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.config.GlobalDataConfig; @@ -24,7 +26,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; +import java.time.LocalTime; import java.util.ArrayList; +import java.util.List; @SpringBootTest @Import({GlobalDataConfig.class, TestConfig.class}) @@ -140,4 +144,23 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + + @Test + public void 본인의_유저_정보를_조회할_수_있다() { + //given + CustomUserDetails testEmailUser = userTestData.createTestEmailUserWithMealTime(); + MealTime mealTime = MealTime.builder() + .userId(testEmailUser.getId()) + .mealTime(LocalTime.NOON) + .build(); + + //when + ApiResponse response = userController.getUserInfo(testEmailUser); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().getEmail()).isEqualTo("testEmailUser@naver.com"); + Assertions.assertThat(response.getResponse().getSignInType()).isEqualTo("EMAIL"); + Assertions.assertThat(response.getResponse().getMealTime()).contains(mealTime.getMealTime()); + } } From 4105187ac54d54ca2b71387b1b6d782eb6806793 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 03:58:31 +0900 Subject: [PATCH 41/83] =?UTF-8?q?test:=20=EC=9C=A0=EC=A0=80=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=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 --- .../backend/domain/user/api/UserApiTest.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 81b926ce..41226d2a 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -10,6 +10,7 @@ import com.ourmenu.backend.domain.user.dto.response.KakaoExistenceResponse; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.domain.user.dto.response.UserDto; +import com.ourmenu.backend.domain.user.exception.NotFoundUserException; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.config.GlobalDataConfig; @@ -28,7 +29,6 @@ import java.time.LocalTime; import java.util.ArrayList; -import java.util.List; @SpringBootTest @Import({GlobalDataConfig.class, TestConfig.class}) @@ -163,4 +163,18 @@ void setUp() { Assertions.assertThat(response.getResponse().getSignInType()).isEqualTo("EMAIL"); Assertions.assertThat(response.getResponse().getMealTime()).contains(mealTime.getMealTime()); } + + @Test + public void 본인의_유저_정보를_삭제할_수_있다() { + //given + CustomUserDetails testEmailUser = userTestData.createTestEmailUser(); + + //when + ApiResponse response = userController.deleteUser(testEmailUser); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThatThrownBy(() -> userController.getUserInfo(testEmailUser)) + .isInstanceOf(NotFoundUserException.class); + } } From faab1417077e787ffb09628ea2acdfeb8ba420c0 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 03:58:59 +0900 Subject: [PATCH 42/83] =?UTF-8?q?fix:=20GlobalUserTestDate=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=9D=B8=EC=BD=94=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/global/data/GlobalUserTestData.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java b/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java index f39ed92c..6e102e79 100644 --- a/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java +++ b/src/test/java/com/ourmenu/backend/global/data/GlobalUserTestData.java @@ -27,10 +27,10 @@ public GlobalUserTestData(EntityManager entityManager) { @Transactional public CustomUserDetails createTestEmailUser() { String email = "testEmailUser@naver.com"; - String password = "password1!"; + String password = passwordEncoder.encode("password1!"); User user = User.builder() .email(email) - .password(passwordEncoder.encode(password)) + .password(password) .signInType(SignInType.EMAIL) .build(); entityManager.persist(user); From b8ee1e1df9ff77bc18bd03baac6edf576a65afd9 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 16:19:56 +0900 Subject: [PATCH 43/83] =?UTF-8?q?test:=20Reissue=20API=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/dto/response/ReissueRequest.java | 2 ++ .../backend/domain/user/api/UserApiTest.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java index c06abdbd..3c6b16b4 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java @@ -1,9 +1,11 @@ package com.ourmenu.backend.domain.user.dto.response; import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; import lombok.Getter; @Getter +@AllArgsConstructor public class ReissueRequest { @NotBlank diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 41226d2a..bf07394f 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -8,6 +8,7 @@ import com.ourmenu.backend.domain.user.dto.request.UpdateMealTimeRequest; import com.ourmenu.backend.domain.user.dto.request.UpdatePasswordRequest; import com.ourmenu.backend.domain.user.dto.response.KakaoExistenceResponse; +import com.ourmenu.backend.domain.user.dto.response.ReissueRequest; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.domain.user.dto.response.UserDto; import com.ourmenu.backend.domain.user.exception.NotFoundUserException; @@ -16,6 +17,7 @@ import com.ourmenu.backend.global.config.GlobalDataConfig; import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; +import com.ourmenu.backend.global.util.JwtTokenProvider; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.assertj.core.api.Assertions; @@ -44,6 +46,9 @@ public class UserApiTest { @Autowired DatabaseCleaner databaseCleaner; + @Autowired + JwtTokenProvider jwtTokenProvider; + CustomUserDetails customUserDetails; @BeforeEach @@ -177,4 +182,26 @@ void setUp() { Assertions.assertThatThrownBy(() -> userController.getUserInfo(testEmailUser)) .isInstanceOf(NotFoundUserException.class); } + + + @Test + public void 토큰을_재발급_받을_수_있다() { + //given + ArrayList mealTime = new ArrayList<>(); + mealTime.add(12); + mealTime.add(16); + SignUpRequest signUpRequest = new SignUpRequest("test123@gmail.com", + "password123", + mealTime, + "EMAIL"); + ApiResponse signUpResponse = userController.signUp(signUpRequest); + ReissueRequest request = new ReissueRequest(signUpResponse.getResponse().getRefreshToken()); + + //when + ApiResponse response = userController.reissueToken(request); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().getRefreshToken()).isNotEqualTo(request.getRefreshToken()); + } } From dbc965fc9b986e00553b2b1722956a3b68d5813c Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 16:29:12 +0900 Subject: [PATCH 44/83] =?UTF-8?q?test:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EC=9A=94=EC=B2=AD=20API=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/EmailApiTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java new file mode 100644 index 00000000..7d9a8f06 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java @@ -0,0 +1,46 @@ +package com.ourmenu.backend.domain.user.api; + +import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest; +import com.ourmenu.backend.domain.user.dto.response.EmailResponse; +import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse; +import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.config.GlobalDataConfig; +import com.ourmenu.backend.global.response.ApiResponse; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +@SpringBootTest +@Import({GlobalDataConfig.class, TestConfig.class}) +@DisplayName("이메일 통합 테스트") +public class EmailApiTest { + + @Autowired + EmailController emailController; + + @Autowired + DatabaseCleaner databaseCleaner; + + @BeforeEach + void setUp() { + databaseCleaner.clear(); + } + + @Test + public void 이메일_인증을_요청할_수_있다() { + //given + PostEmailRequest request = new PostEmailRequest("test123@naver.com"); + + //when + ApiResponse response = emailController.sendConfirmCode(request); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } + +} From 97b0a92d90a529d4152ceccbb8f4058b2bd88417 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 16:34:04 +0900 Subject: [PATCH 45/83] =?UTF-8?q?test:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EC=BD=94=EB=93=9C=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?API=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 --- .../user/dto/request/VerifyEmailRequest.java | 3 ++- .../backend/domain/user/api/EmailApiTest.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java index 4dd9f1b8..a45cd5e6 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java @@ -1,10 +1,11 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@NoArgsConstructor +@AllArgsConstructor public class VerifyEmailRequest { private String email; private String confirmCode; diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java index 7d9a8f06..426c5a21 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.user.api; import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest; +import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest; import com.ourmenu.backend.domain.user.dto.response.EmailResponse; import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse; import com.ourmenu.backend.global.DatabaseCleaner; @@ -42,5 +43,20 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + + @Test + public void 이메일_인증_코드를_검증한다() { + //given + PostEmailRequest emailRequest = new PostEmailRequest("test123@naver.com"); + ApiResponse emailResponse = emailController.sendConfirmCode(emailRequest); + VerifyEmailRequest request = new VerifyEmailRequest("test123@naver.com", + emailResponse.getResponse().getCode()); + + //when + ApiResponse response = emailController.verifyEmail(request); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } } From 66c7c25cfa1806eea54e7250b05d63dd7a51e429 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 17:14:55 +0900 Subject: [PATCH 46/83] =?UTF-8?q?fix:=20=EC=9E=84=EC=8B=9C=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=9D=B8=EC=BD=94=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/user/application/EmailService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index 8d1b64b7..efa95451 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -15,6 +15,7 @@ import jakarta.mail.MessagingException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.util.concurrent.ThreadLocalRandom; @@ -28,6 +29,7 @@ public class EmailService { private final int CONFIRM_CODE_LENGTH = 6; private final ConfirmCodeRepository confirmCodeRepository; private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; public EmailResponse sendCodeToEmail(PostEmailRequest request){ String email = request.getEmail(); @@ -85,7 +87,7 @@ public TemporaryPasswordResponse sendTemporaryPassword(PostEmailRequest request) User user = userRepository.findByEmail(email) .orElseThrow(NotFoundUserException::new); - user.changePassword(temporaryPassword); + user.changePassword(passwordEncoder.encode(temporaryPassword)); userRepository.save(user); return TemporaryPasswordResponse.from(temporaryPassword); } From 34aceb43de583cb65617d41f9fef3ef0e807c1f3 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 17:15:10 +0900 Subject: [PATCH 47/83] =?UTF-8?q?test:=20=EC=9E=84=EC=8B=9C=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EB=B0=9C=EA=B8=89=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/EmailApiTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java index 426c5a21..df9424e3 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java @@ -1,20 +1,28 @@ package com.ourmenu.backend.domain.user.api; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest; +import com.ourmenu.backend.domain.user.dto.request.SignInRequest; import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest; import com.ourmenu.backend.domain.user.dto.response.EmailResponse; import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse; +import com.ourmenu.backend.domain.user.exception.NotMatchPasswordException; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.config.GlobalDataConfig; +import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; +import jakarta.servlet.http.HttpServletResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.crypto.password.PasswordEncoder; @SpringBootTest @Import({GlobalDataConfig.class, TestConfig.class}) @@ -27,6 +35,15 @@ public class EmailApiTest { @Autowired DatabaseCleaner databaseCleaner; + @Autowired + UserController userController; + + @Autowired + GlobalUserTestData userTestData; + + @Autowired + PasswordEncoder passwordEncoder; + @BeforeEach void setUp() { databaseCleaner.clear(); @@ -59,4 +76,21 @@ void setUp() { Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + @Test + public void 임시_비밀번호를_발급받을_수_있다() { + //given + CustomUserDetails testEmailUser = userTestData.createTestEmailUser(); + PostEmailRequest request = new PostEmailRequest("testEmailUser@naver.com"); + HttpServletResponse httpServletResponse = Mockito.mock(HttpServletResponse.class); + + //when + ApiResponse response = emailController.sendTemporaryPassword(request); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThatCode(() -> userController.signIn + (new SignInRequest(testEmailUser.getEmail(), response.getResponse().getTemporaryPassword(), "EMAIL") + ,httpServletResponse)) + .doesNotThrowAnyException(); + } } From a34dfc81371d35320fd3aba5ae8cb732fd723592 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 17:26:11 +0900 Subject: [PATCH 48/83] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20API=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/UserApiTest.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index bf07394f..194a8008 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -12,6 +12,7 @@ import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.domain.user.dto.response.UserDto; import com.ourmenu.backend.domain.user.exception.NotFoundUserException; +import com.ourmenu.backend.domain.user.exception.NotMatchTokenException; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.config.GlobalDataConfig; @@ -28,6 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; +import org.springframework.mock.web.MockHttpServletRequest; import java.time.LocalTime; import java.util.ArrayList; @@ -141,13 +143,25 @@ void setUp() { public void 로그아웃_할_수_있다() { //given CustomUserDetails testEmailUser = userTestData.createTestEmailUser(); - HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + SignInRequest request = new SignInRequest( + "testEmailUser@naver.com", + "password1!", + "EMAIL" + ); + HttpServletResponse httpServletResponse = Mockito.mock(HttpServletResponse.class); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest(); + ApiResponse signInResponse = userController.signIn(request, httpServletResponse); + httpServletRequest.addHeader("Authorization", + "Bearer " + signInResponse.getResponse().getRefreshToken()); //when - ApiResponse response = userController.signOut(request, testEmailUser); + ApiResponse response = userController.signOut(httpServletRequest, testEmailUser); //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThatThrownBy(() -> userController.reissueToken + (new ReissueRequest(signInResponse.getResponse().getRefreshToken()))) + .isInstanceOf(NotMatchTokenException.class); } @Test From 390b7811661c32e0a4ff64362f9e277b1dcaf928 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 17:34:09 +0900 Subject: [PATCH 49/83] =?UTF-8?q?remove:=20=EC=BD=94=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/domain/user/api/UserApiTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 194a8008..f2fb5773 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -51,8 +51,6 @@ public class UserApiTest { @Autowired JwtTokenProvider jwtTokenProvider; - CustomUserDetails customUserDetails; - @BeforeEach void setUp() { databaseCleaner.clear(); From 404d5a813ca528901ba6c56c81d202d252bf7195 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 12 May 2025 18:11:17 +0900 Subject: [PATCH 50/83] =?UTF-8?q?feat:=20=ED=86=A0=ED=81=B0=20=EA=B3=A0?= =?UTF-8?q?=EC=9C=A0=20ID=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/global/util/JwtTokenProvider.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 25f668a9..0b1dc77e 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -22,6 +22,8 @@ import java.util.Base64; import java.util.Date; import java.util.Optional; +import java.util.UUID; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -124,6 +126,7 @@ public String createToken(String email, String type) { .setClaims(claims) .setExpiration(new Date(date.getTime() + time)) .setIssuedAt(date) + .setId(UUID.randomUUID().toString()) .signWith(key, signatureAlgorithm) .compact(); } From e972d460aa168ad0370bcf7b11e06c46adab924b Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 15 May 2025 18:06:39 +0900 Subject: [PATCH 51/83] =?UTF-8?q?fix:=20=ED=86=A0=ED=81=B0=20=EA=B3=A0?= =?UTF-8?q?=EC=9C=A0=20ID=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/global/util/JwtTokenProvider.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 0b1dc77e..d918aa25 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -22,7 +22,6 @@ import java.util.Base64; import java.util.Date; import java.util.Optional; -import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -126,7 +125,6 @@ public String createToken(String email, String type) { .setClaims(claims) .setExpiration(new Date(date.getTime() + time)) .setIssuedAt(date) - .setId(UUID.randomUUID().toString()) .signWith(key, signatureAlgorithm) .compact(); } From 6832b0c2b75d8827f9f70790882d4692e9ef52df Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 15 May 2025 18:07:02 +0900 Subject: [PATCH 52/83] =?UTF-8?q?fix:=20SignUpRequest=20mealTime=20?= =?UTF-8?q?=EC=9E=90=EB=A3=8C=ED=98=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/dto/request/SignUpRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index 9f2c03f6..07a08521 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -3,13 +3,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.ArrayList; +import java.util.List; @Getter @AllArgsConstructor public class SignUpRequest { private String email; private String password; - private ArrayList mealTime; + private List mealTime; private String signInType; } From 173c8071136955383bbbf145aa78e1683308d006 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 15 May 2025 18:07:34 +0900 Subject: [PATCH 53/83] =?UTF-8?q?fix:=20mealTime=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/domain/user/api/UserApiTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index f2fb5773..4bc022bc 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -33,6 +33,7 @@ import java.time.LocalTime; import java.util.ArrayList; +import java.util.List; @SpringBootTest @Import({GlobalDataConfig.class, TestConfig.class}) @@ -199,9 +200,7 @@ void setUp() { @Test public void 토큰을_재발급_받을_수_있다() { //given - ArrayList mealTime = new ArrayList<>(); - mealTime.add(12); - mealTime.add(16); + List mealTime = List.of(12, 16); SignUpRequest signUpRequest = new SignUpRequest("test123@gmail.com", "password123", mealTime, From 379f39bb129f702b7b37af5acb8357af59f7902e Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 15 May 2025 18:14:30 +0900 Subject: [PATCH 54/83] =?UTF-8?q?fix:=20HttpServletResponse=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/user/api/UserController.java | 4 ++-- .../backend/domain/user/application/UserService.java | 3 +-- .../ourmenu/backend/domain/user/api/EmailApiTest.java | 8 +------- .../com/ourmenu/backend/domain/user/api/UserApiTest.java | 9 ++------- 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java index 466e9a7d..41676589 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java @@ -47,8 +47,8 @@ public ApiResponse signUp(@Valid @RequestBody SignUpRequest request) { @Operation(summary = "로그인", description = "로그인한다.") @PostMapping("/sign-in") - public ApiResponse signIn(@Valid @RequestBody SignInRequest request, HttpServletResponse response) { - TokenDto tokenDto = userService.signIn(request, response); + public ApiResponse signIn(@Valid @RequestBody SignInRequest request) { + TokenDto tokenDto = userService.signIn(request); return ApiUtil.success(tokenDto); } diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 73bd05a7..3ec5ebe0 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -72,10 +72,9 @@ public TokenDto signUp(SignUpRequest request) { * 로그인 로직 및 로그인 성공시 RefreshToken 갱신 후 JWT 정보 반환한다 * * @param request User의 Email, Password, SignInType Request - * @param response HTTP Response * @return Token 정보 */ - public TokenDto signIn(SignInRequest request, HttpServletResponse response) { + public TokenDto signIn(SignInRequest request) { Optional optionalUser = userRepository.findByEmail(request.getEmail()); if (optionalUser.isEmpty() || !optionalUser.get().getSignInType().name().equals(request.getSignInType())) { throw new NotFoundUserException(); diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java index df9424e3..37ef154f 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/EmailApiTest.java @@ -6,22 +6,18 @@ import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest; import com.ourmenu.backend.domain.user.dto.response.EmailResponse; import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse; -import com.ourmenu.backend.domain.user.exception.NotMatchPasswordException; import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.config.GlobalDataConfig; import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; -import jakarta.servlet.http.HttpServletResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.security.crypto.password.PasswordEncoder; @SpringBootTest @@ -81,7 +77,6 @@ void setUp() { //given CustomUserDetails testEmailUser = userTestData.createTestEmailUser(); PostEmailRequest request = new PostEmailRequest("testEmailUser@naver.com"); - HttpServletResponse httpServletResponse = Mockito.mock(HttpServletResponse.class); //when ApiResponse response = emailController.sendTemporaryPassword(request); @@ -89,8 +84,7 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); Assertions.assertThatCode(() -> userController.signIn - (new SignInRequest(testEmailUser.getEmail(), response.getResponse().getTemporaryPassword(), "EMAIL") - ,httpServletResponse)) + (new SignInRequest(testEmailUser.getEmail(), response.getResponse().getTemporaryPassword(), "EMAIL"))) .doesNotThrowAnyException(); } } diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 4bc022bc..3e2221f2 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -19,13 +19,10 @@ import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; import com.ourmenu.backend.global.util.JwtTokenProvider; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; @@ -84,10 +81,9 @@ void setUp() { "password1!", "EMAIL" ); - HttpServletResponse response = Mockito.mock(HttpServletResponse.class); //when - ApiResponse signInResponse = userController.signIn(request, response); + ApiResponse signInResponse = userController.signIn(request); //then Assertions.assertThat(signInResponse.isSuccess()).isEqualTo(true); @@ -147,9 +143,8 @@ void setUp() { "password1!", "EMAIL" ); - HttpServletResponse httpServletResponse = Mockito.mock(HttpServletResponse.class); MockHttpServletRequest httpServletRequest = new MockHttpServletRequest(); - ApiResponse signInResponse = userController.signIn(request, httpServletResponse); + ApiResponse signInResponse = userController.signIn(request); httpServletRequest.addHeader("Authorization", "Bearer " + signInResponse.getResponse().getRefreshToken()); From 009f8d0206006d4b246eb2d1a8b284cb314dc868 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 15 May 2025 18:14:44 +0900 Subject: [PATCH 55/83] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/domain/user/api/UserApiTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 3e2221f2..e7c903cc 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -208,6 +208,5 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); - Assertions.assertThat(response.getResponse().getRefreshToken()).isNotEqualTo(request.getRefreshToken()); } } From c5937169104a907ddd779413350884183061fdc1 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 22 May 2025 15:45:03 +0900 Subject: [PATCH 56/83] =?UTF-8?q?chore:=20=EB=A1=9C=EA=B7=B8=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - application.properties - docker volume 설정 --- infra/docker/docker-compose.yml | 2 ++ src/main/resources/application.properties | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/infra/docker/docker-compose.yml b/infra/docker/docker-compose.yml index 74a9307f..319012a9 100644 --- a/infra/docker/docker-compose.yml +++ b/infra/docker/docker-compose.yml @@ -21,3 +21,5 @@ services: S3_SECRET_KEY: ${S3_SECRET_KEY} SPRING_SWAGGER_SERVER_URL: ${URL} DEFAULT_BUCKET_URL: ${DEFAULT_BUCKET_URL} + volumes: + - /var/log/springboot/:/var/log/springboot/ \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0fc86f3a..d09bb2b2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -47,4 +47,6 @@ springdoc.swagger-ui.syntax-highlight.theme=arta springdoc.swagger-ui.display-request-duration=true # actuator management.endpoint.prometheus.enabled=true -management.endpoints.web.exposure.include=prometheus \ No newline at end of file +management.endpoints.web.exposure.include=prometheus +# logging +logging.file.name=/var/log/springboot/app.log From e92ed1efdf358d786120a7d923a5101c31438446 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 23 May 2025 16:23:58 +0900 Subject: [PATCH 57/83] =?UTF-8?q?fix:=20GET=20/home=20response=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/home/dto/GetRecommendMenuResponse.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/home/dto/GetRecommendMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/home/dto/GetRecommendMenuResponse.java index b9cb0c8b..e0f7c6c9 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/dto/GetRecommendMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/home/dto/GetRecommendMenuResponse.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.dto.MenuSimpleDto; +import com.ourmenu.backend.domain.store.domain.Store; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -18,14 +19,15 @@ public class GetRecommendMenuResponse { private Long menuId; private String menuTitle; - private int menuPrice; + private String storeName; private String menuImgUrl; public static GetRecommendMenuResponse of(Menu menu, String imgUrl) { + Store store = menu.getStore(); return GetRecommendMenuResponse.builder() .menuId(menu.getId()) .menuTitle(menu.getTitle()) - .menuPrice(menu.getPrice()) + .storeName(store.getTitle()) .menuImgUrl(imgUrl) .build(); } @@ -34,7 +36,7 @@ public static GetRecommendMenuResponse of(MenuSimpleDto menuSimpleDto, String im return GetRecommendMenuResponse.builder() .menuId(menuSimpleDto.getMenuId()) .menuTitle(menuSimpleDto.getMenuTitle()) - .menuPrice(menuSimpleDto.getMenuPrice()) + .storeName(menuSimpleDto.getStoreTitle()) .menuImgUrl(imgUrl) .build(); } From bd38948a4ed22c961c0864688e6a0b02982acf71 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Sat, 24 May 2025 17:00:35 +0900 Subject: [PATCH 58/83] =?UTF-8?q?test:=20=EC=BA=90=EC=8B=9C=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/cache/api/CacheApiTest.java | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java diff --git a/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java new file mode 100644 index 00000000..fd235c52 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java @@ -0,0 +1,171 @@ +package com.ourmenu.backend.domain.cache.api; + +import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.cache.dto.GetCacheInfoResponse; +import com.ourmenu.backend.domain.cache.dto.SimpleHomeImgResponse; +import com.ourmenu.backend.domain.cache.dto.SimpleMenuFolderIconResponse; +import com.ourmenu.backend.domain.cache.dto.SimpleMenuPinResponse; +import com.ourmenu.backend.domain.cache.dto.SimpleTagImgResponse; +import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.global.DatabaseCleaner; +import com.ourmenu.backend.global.TestConfig; +import com.ourmenu.backend.global.config.GlobalDataConfig; +import com.ourmenu.backend.global.data.GlobalUserTestData; +import com.ourmenu.backend.global.response.ApiResponse; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +@SpringBootTest +@Import({GlobalDataConfig.class, TestConfig.class}) +@DisplayName("캐시 통합 테스트") +public class CacheApiTest { + + @Autowired + CacheController cacheController; + + @Autowired + GlobalUserTestData userTestData; + + @Autowired + UrlConverter urlConvertor; + + @Autowired + DatabaseCleaner databaseCleaner; + + CustomUserDetails testCustomUserDetails; + + RestTemplate restTemplate = new RestTemplate(); + + @BeforeEach + void setUp() { + databaseCleaner.clear(); + testCustomUserDetails = userTestData.createTestEmailUserWithMealTime(); + } + + @Test + void 확인할_수_없는_이미지는_조회할_수_없다() { + //given + + //when + String menuPinMapUrl = urlConvertor.getMenuPinMapUrl(MenuPin.BBQ); + + //then + Assertions.assertThatThrownBy( + () -> restTemplate.getForEntity( + menuPinMapUrl + "trash", String.class)) + .isInstanceOf(HttpClientErrorException.class); + } + + @Test + void 메뉴판_캐시_이미지는_조회할_수_있다() { + //given + ApiResponse response = cacheController.getCacheInfo(); + GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); + + //when + List menuFolderIcons = getCacheInfoResponse.getMenuFolderIcons(); + + //then + menuFolderIcons.stream().forEach(simpleMenuFolderIconResponse -> { + String menuFolderIconUrl = simpleMenuFolderIconResponse.getMenuFolderIconUrl(); + ResponseEntity responseEntity = restTemplate.getForEntity(menuFolderIconUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + } + + @Test + void 메뉴핀_캐시_이미지는_조회할_수_있다() { + //given + ApiResponse response = cacheController.getCacheInfo(); + GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); + + List menuPins = getCacheInfoResponse.getMenuPins(); + + //then + menuPins.stream().forEach(simpleMenuFolderIconResponse -> { + String menuPinAddImgUrl = simpleMenuFolderIconResponse.getMenuPinAddImgUrl(); + if (menuPinAddImgUrl == null) { + return; + } + ResponseEntity responseEntity = restTemplate.getForEntity(menuPinAddImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + + menuPins.stream().forEach(simpleMenuFolderIconResponse -> { + String menuPinAddDisableImgUrl = simpleMenuFolderIconResponse.getMenuPinAddDisableImgUrl(); + if (menuPinAddDisableImgUrl == null) { + return; + } + ResponseEntity responseEntity = restTemplate.getForEntity(menuPinAddDisableImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + + menuPins.stream().forEach(simpleMenuFolderIconResponse -> { + String menuPinMapImgUrl = simpleMenuFolderIconResponse.getMenuPinMapImgUrl(); + if (menuPinMapImgUrl == null) { + return; + } + + ResponseEntity responseEntity = restTemplate.getForEntity(menuPinMapImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + + } + + @Test + void 홈이미지_캐시_이미지는_조회할_수_있다() { + //given + ApiResponse response = cacheController.getCacheInfo(); + GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); + + //when + List homeImgs = getCacheInfoResponse.getHomeImgs(); + + //then + homeImgs.stream().forEach(simpleMenuFolderIconResponse -> { + String homeImgUrl = simpleMenuFolderIconResponse.getHomeImgUrl(); + ResponseEntity responseEntity = restTemplate.getForEntity(homeImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + } + + @Test + void 태그_캐시_이미지는_조회할_수_있다() { + //given + ApiResponse response = cacheController.getCacheInfo(); + GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); + + //when + List tags = getCacheInfoResponse.getTags(); + + //then + tags.stream().forEach(simpleMenuFolderIconResponse -> { + String orangeTagImgUrl = simpleMenuFolderIconResponse.getOrangeTagImgUrl(); + ResponseEntity responseEntity = restTemplate.getForEntity(orangeTagImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + + tags.stream().forEach(simpleMenuFolderIconResponse -> { + String whiteTagImgUrl = simpleMenuFolderIconResponse.getWhiteTagImgUrl(); + ResponseEntity responseEntity = restTemplate.getForEntity(whiteTagImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + } +} From c198aaa816bb691bead103e9e743ef651e5ce9f6 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 25 May 2025 01:08:53 +0900 Subject: [PATCH 59/83] =?UTF-8?q?fix:=20Request=20NoArgsConstructor=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/dto/request/PostEmailRequest.java | 1 + .../backend/domain/user/dto/request/SignInRequest.java | 3 +++ .../backend/domain/user/dto/request/SignUpRequest.java | 3 +++ .../domain/user/dto/request/UpdateMealTimeRequest.java | 6 ++++-- .../domain/user/dto/request/UpdatePasswordRequest.java | 2 ++ .../backend/domain/user/dto/request/VerifyEmailRequest.java | 2 ++ 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java index 010bb122..cb5bb397 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PostEmailRequest.java @@ -3,6 +3,7 @@ import lombok.*; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor public class PostEmailRequest { private String email; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java index 62e050c3..0d53e451 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java @@ -1,9 +1,12 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor public class SignInRequest { private String email; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index 07a08521..c1d1cb04 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -1,11 +1,14 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import java.util.List; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor public class SignUpRequest { private String email; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java index 20fad1dd..694a5e3b 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java @@ -1,14 +1,16 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.ArrayList; +import java.util.List; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor public class UpdateMealTimeRequest { - ArrayList mealTime; + List mealTime; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java index 794049b4..8b69b944 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdatePasswordRequest.java @@ -1,10 +1,12 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor public class UpdatePasswordRequest { String password; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java index a45cd5e6..b20fc092 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java @@ -1,10 +1,12 @@ package com.ourmenu.backend.domain.user.dto.request; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor public class VerifyEmailRequest { private String email; From e2573a4c9a7b0bdd1f0c7b858721fdc1bfadbce2 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 25 May 2025 01:10:52 +0900 Subject: [PATCH 60/83] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EC=8B=9D=EC=82=AC?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EC=97=AC=EB=B6=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 14 +++++++++- .../domain/user/dto/response/MealTimeDto.java | 26 +++++++++++++++++++ .../domain/user/dto/response/UserDto.java | 11 ++++---- .../backend/domain/user/util/TimeUtil.java | 11 ++++++++ 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 3ec5ebe0..e97053aa 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -12,6 +12,7 @@ import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; import com.ourmenu.backend.domain.user.dto.request.UpdatePasswordRequest; import com.ourmenu.backend.domain.user.dto.response.KakaoExistenceResponse; +import com.ourmenu.backend.domain.user.dto.response.MealTimeDto; import com.ourmenu.backend.domain.user.dto.response.ReissueRequest; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.domain.user.dto.response.UserDto; @@ -23,10 +24,14 @@ import com.ourmenu.backend.domain.user.exception.NotMatchTokenException; import com.ourmenu.backend.domain.user.exception.TokenExpiredExcpetion; import com.ourmenu.backend.domain.user.exception.UnsupportedSignInTypeException; +import com.ourmenu.backend.domain.user.util.TimeUtil; import com.ourmenu.backend.global.util.JwtTokenProvider; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.transaction.Transactional; + +import java.time.LocalTime; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -132,8 +137,15 @@ public UserDto getUserInfo(CustomUserDetails userDetails) { .orElseThrow(NotFoundUserException::new); List mealTimes = mealTimeService.findAllByUserId(userDetails.getId()); + List mealTimeDtoList = new ArrayList<>(); + + for (MealTime mealTime : mealTimes) { + boolean isAfter = LocalTime.now().isAfter(mealTime.getMealTime()); + MealTimeDto mealTimeDto = MealTimeDto.of(mealTime, isAfter); + mealTimeDtoList.add(mealTimeDto); + } - return UserDto.of(user, mealTimes); + return UserDto.of(user, mealTimeDtoList); } /** diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java new file mode 100644 index 00000000..1be3c03d --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java @@ -0,0 +1,26 @@ +package com.ourmenu.backend.domain.user.dto.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.ourmenu.backend.domain.user.domain.MealTime; +import com.ourmenu.backend.domain.user.util.TimeUtil; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@JsonIgnoreProperties({"after"}) +public class MealTimeDto { + + private Integer mealTime; + + @JsonProperty("isAfter") + private boolean isAfter; + + public static MealTimeDto of(MealTime mealTime, boolean isAfter) { + return MealTimeDto.builder() + .mealTime(TimeUtil.toInteger(mealTime.getMealTime())) + .isAfter(isAfter) + .build(); + } +} diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java index 8942c534..70df4e59 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java @@ -2,9 +2,10 @@ import com.ourmenu.backend.domain.user.domain.MealTime; import com.ourmenu.backend.domain.user.domain.User; -import java.time.LocalTime; import java.util.List; import java.util.stream.Collectors; + +import com.ourmenu.backend.domain.user.util.TimeUtil; import lombok.Builder; import lombok.Getter; @@ -14,15 +15,13 @@ public class UserDto { private String email; private String signInType; - private List mealTime; + private List mealTimeList; - public static UserDto of(User user, List mealTimes) { + public static UserDto of(User user, List mealTimes) { return UserDto.builder() .email(user.getEmail()) .signInType(user.getSignInType().name()) - .mealTime(mealTimes.stream() - .map(MealTime::getMealTime) - .collect(Collectors.toList())) + .mealTimeList(mealTimes) .build(); } } diff --git a/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java b/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java index a5c940b2..1e779495 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java +++ b/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java @@ -75,4 +75,15 @@ public static long getTimeDifferenceDayAfter(LocalTime time) { return todayDuration.toMinutes() + tomorrowDuration.toMinutes(); } + + /** + * LocalTime(HH:mm:ss) 을 Integer(HHmm) 형식으로 변경한다. + * + * @param time + * @return + */ + public static int toInteger(LocalTime time) { + String timeStr = String.format("%02d%02d", time.getHour(), time.getMinute()); + return Integer.parseInt(timeStr); + } } From b2d7a613c419135a8bdc61ce88aa422a8f507b60 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 25 May 2025 01:15:07 +0900 Subject: [PATCH 61/83] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20URL=20=ED=95=84=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/dto/response/UserDto.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java index 70df4e59..9beb45aa 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java @@ -1,11 +1,8 @@ package com.ourmenu.backend.domain.user.dto.response; -import com.ourmenu.backend.domain.user.domain.MealTime; import com.ourmenu.backend.domain.user.domain.User; import java.util.List; -import java.util.stream.Collectors; -import com.ourmenu.backend.domain.user.util.TimeUtil; import lombok.Builder; import lombok.Getter; @@ -16,12 +13,18 @@ public class UserDto { private String email; private String signInType; private List mealTimeList; + private String announcementUrl; + private String customerServiceUrl; + private String appReviewUrl; public static UserDto of(User user, List mealTimes) { return UserDto.builder() .email(user.getEmail()) .signInType(user.getSignInType().name()) .mealTimeList(mealTimes) + .announcementUrl("") + .customerServiceUrl("") + .appReviewUrl("") .build(); } } From 0219254d45a969d2fed8b33b09ee71a434772ea0 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 25 May 2025 01:17:04 +0900 Subject: [PATCH 62/83] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=98=81=EB=AC=B8=EC=9E=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/user/application/EmailService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index efa95451..c07a95bb 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -57,7 +57,7 @@ public EmailResponse sendCodeToEmail(PostEmailRequest request){ } public String generateRandomCode(int length) { - String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + String characters = "0123456789"; StringBuilder confirmCode = new StringBuilder(); ThreadLocalRandom random = ThreadLocalRandom.current(); From fdd8af94a997623d480d3cdb5f50d9a1fac24e51 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sun, 25 May 2025 01:51:07 +0900 Subject: [PATCH 63/83] =?UTF-8?q?fix:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/domain/user/api/UserApiTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index e7c903cc..db42edf6 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -174,7 +174,7 @@ void setUp() { Assertions.assertThat(response.isSuccess()).isEqualTo(true); Assertions.assertThat(response.getResponse().getEmail()).isEqualTo("testEmailUser@naver.com"); Assertions.assertThat(response.getResponse().getSignInType()).isEqualTo("EMAIL"); - Assertions.assertThat(response.getResponse().getMealTime()).contains(mealTime.getMealTime()); + Assertions.assertThat(response.getResponse().getMealTimeList().get(0).getMealTime()).isEqualTo(1200); } @Test From 405076b6d6c72569ff3617e174352fee7ba8b091 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Mon, 26 May 2025 14:05:29 +0900 Subject: [PATCH 64/83] =?UTF-8?q?fix:=20=EB=A9=94=EB=89=B4=ED=95=80=20?= =?UTF-8?q?=EC=A7=80=EB=8F=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - png --- .../com/ourmenu/backend/domain/cache/util/UrlConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java index 352f0643..3eeb447b 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java @@ -14,7 +14,7 @@ public class UrlConverter { private String url; public String getMenuPinMapUrl(MenuPin pin) { - return url + "/menu-pins/" + pin.getImgUrl() + "_map.svg"; + return url + "/menu-pins/" + pin.getImgUrl() + "_map.png"; } public String getMenuPinAddUrl(MenuPin pin) { From 5d0aeef15ced2a019adb68051872188b7b61b881 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Mon, 26 May 2025 16:11:07 +0900 Subject: [PATCH 65/83] fix: POST,GET/api/menu-folders - ENUM -> URL --- .../domain/menu/application/MenuFolderService.java | 6 ++++-- .../backend/domain/menu/application/MenuService.java | 2 ++ .../backend/domain/menu/dto/MenuFolderResponse.java | 10 ++++++---- .../domain/menu/dto/SaveMenuFolderResponse.java | 9 +++++---- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java index 285015c3..02fed81b 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java @@ -1,5 +1,6 @@ package com.ourmenu.backend.domain.menu.application; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.dao.MenuFolderRepository; import com.ourmenu.backend.domain.menu.dao.MenuRepository; import com.ourmenu.backend.domain.menu.domain.MenuFolder; @@ -28,6 +29,7 @@ public class MenuFolderService { private final MenuMenuFolderService menuMenuFolderService; private final DefaultImgConverter defaultImgConvertor; private final MenuRepository menuRepository; + private final UrlConverter urlConverter; /** * 메뉴 폴더 저장 @@ -43,7 +45,7 @@ public SaveMenuFolderResponse saveMenuFolder(MenuFolderDto menuFolderDto) { MenuFolder menuFolder = saveMenuFolder(menuFolderDto, menuFolderImgUrl); return SaveMenuFolderResponse.of(menuFolder, menuFolderDto.getMenuIds(), - defaultImgConvertor.getDefaultMenuFolderImgUrl()); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); } /** @@ -142,7 +144,7 @@ public GetMenuFolderResponse findAllMenuFolder(Long userId) { List menuMenuFolders = menuMenuFolderService.findAllByMenuFolderId( menuFolder.getId()); return MenuFolderResponse.of(menuFolder, menuMenuFolders, - defaultImgConvertor.getDefaultMenuFolderImgUrl()); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); }).toList(); int menuCount = menuRepository.countByUserId(userId); return GetMenuFolderResponse.of(menuCount, menuFolderResponses); diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java index ff012e9b..e311a4ab 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java @@ -1,5 +1,6 @@ package com.ourmenu.backend.domain.menu.application; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.home.dto.GetRecommendMenuResponse; import com.ourmenu.backend.domain.menu.dao.MenuRepository; import com.ourmenu.backend.domain.menu.domain.Menu; @@ -40,6 +41,7 @@ public class MenuService { private final MenuImgService menuImgService; private final MenuFolderService menuFolderService; private final DefaultImgConverter defaultImgConverter; + private final UrlConverter urlConverter; /** * 메뉴 저장(메뉴 사진, 메뉴판, 태그 의존 엔티티 생성 diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java index 6a684b52..a39150d8 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.domain.MenuMenuFolder; import java.util.List; @@ -17,17 +17,19 @@ public class MenuFolderResponse { private Long menuFolderId; private String menuFolderTitle; private String menuFolderImgUrl; - private MenuFolderIcon menuFolderIcon; + private String menuFolderIconImgUrl; private List menuIds; private int index; public static MenuFolderResponse of(MenuFolder menuFolder, List menuFolders, - String defaultMenuFolderImgUrl) { + String defaultMenuFolderImgUrl, UrlConverter urlConverter) { String menuFolderImgUrl = menuFolder.getImgUrl(); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } + String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + List menuIds = menuFolders.stream() .map(menuMenuFolder -> menuMenuFolder.getMenu().getId()) .toList(); @@ -35,7 +37,7 @@ public static MenuFolderResponse of(MenuFolder menuFolder, List .menuFolderId(menuFolder.getId()) .menuFolderTitle(menuFolder.getTitle()) .menuFolderImgUrl(menuFolderImgUrl) - .menuFolderIcon(menuFolder.getIcon()) + .menuFolderIconImgUrl(menuFolderIconImgUrl) .menuIds(menuIds) .index(menuFolder.getIndex()) .build(); diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java index 7e50e420..e9969e7f 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import java.util.List; import lombok.AccessLevel; @@ -16,13 +16,14 @@ public class SaveMenuFolderResponse { private Long menuFolderId; private String menuFolderTitle; private String menuFolderUrl; - private MenuFolderIcon menuFolderIcon; + private String menuFolderIconImgUrl; private List menuIds; private int index; public static SaveMenuFolderResponse of(MenuFolder menuFolder, List menuIds, - String defaultMenuFolderImgUrl) { + String defaultMenuFolderImgUrl, UrlConverter urlConverter) { String menuFolderImgUrl = menuFolder.getImgUrl(); + String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } @@ -31,7 +32,7 @@ public static SaveMenuFolderResponse of(MenuFolder menuFolder, List menuId .menuFolderId(menuFolder.getId()) .menuFolderTitle(menuFolder.getTitle()) .menuFolderUrl(menuFolderImgUrl) - .menuFolderIcon(menuFolder.getIcon()) + .menuFolderIconImgUrl(menuFolderIconImgUrl) .menuIds(menuIds) .index(menuFolder.getIndex()) .build(); From 5d126899c32221bf78d54c6b0e4a5570a58188ea Mon Sep 17 00:00:00 2001 From: david-parkk Date: Mon, 26 May 2025 16:20:29 +0900 Subject: [PATCH 66/83] fix: PATCH/api/menu-folders/** - ENUM -> URL --- .../domain/menu/application/MenuFolderService.java | 4 ++-- .../domain/menu/dto/UpdateMenuFolderResponse.java | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java index 02fed81b..ddc698ed 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java @@ -95,7 +95,7 @@ public UpdateMenuFolderResponse updateMenuFolder(Long userId, Long menuFolderId, menuFolder.update(menuFolderDto); List menuMenuFolders = menuMenuFolderService.findAllByMenuFolderId(menuFolderId); return UpdateMenuFolderResponse.of(menuFolder, menuMenuFolders, - defaultImgConvertor.getDefaultMenuFolderImgUrl()); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); } /** @@ -126,7 +126,7 @@ public UpdateMenuFolderResponse updateMenuFolderIndex(Long userId, Long menuFold findMenuFolder.updateIndex(index); List menuMenuFolders = menuMenuFolderService.findAllByMenuFolderId(menuFolderId); return UpdateMenuFolderResponse.of(findMenuFolder, menuMenuFolders, - defaultImgConvertor.getDefaultMenuFolderImgUrl()); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java index 1ea3793c..387c760f 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.domain.MenuMenuFolder; import java.util.List; @@ -17,17 +17,19 @@ public class UpdateMenuFolderResponse { private Long menuFolderId; private String menuFolderTitle; private String menuFolderUrl; - private MenuFolderIcon menuFolderIcon; + private String menuFolderIconImgUrl; private List menuIds; private int index; public static UpdateMenuFolderResponse of(MenuFolder menuFolder, List menuMenuFolders, - String defaultMenuFolderImgUrl) { + String defaultMenuFolderImgUrl, UrlConverter urlConverter) { String menuFolderImgUrl = menuFolder.getImgUrl(); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } + String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + List menuId = menuMenuFolders.stream() .map(menuMenuFolder -> menuMenuFolder.getMenu().getId()) .toList(); @@ -35,7 +37,7 @@ public static UpdateMenuFolderResponse of(MenuFolder menuFolder, List Date: Mon, 26 May 2025 16:37:02 +0900 Subject: [PATCH 67/83] fix: POST/api/menus, GET/api/menu-folders/{menuFolderId}/menus - ENUM -> URL --- .../domain/menu/application/MenuService.java | 5 ++-- .../menu/dto/GetMenuFolderMenuResponse.java | 10 ++++---- .../domain/menu/dto/SaveMenuResponse.java | 24 ++++++++++++------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java index e311a4ab..ea1ed0ab 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java @@ -78,7 +78,8 @@ public SaveMenuResponse saveMenu(MenuDto menuDto) { //s3 업로드및 이미지 연관관계 생성 List menuImgs = menuImgService.saveMenuImgs(saveMenu.getId(), menuDto.getMenuImgs()); - return SaveMenuResponse.of(saveMenu, store, store.getMap(), menuImgs, saveMenuMenuFolders, saveTag); + return SaveMenuResponse.of(saveMenu, store, store.getMap(), menuImgs, saveMenuMenuFolders, saveTag, + urlConverter); } /** @@ -127,7 +128,7 @@ public GetMenuFolderMenuResponse findMenusByMenuFolder(Long userId, Long menuFol MenuFolder menuFolder = menuFolderService.findOne(userId, menuFolderId); return GetMenuFolderMenuResponse.of(menuFolder, defaultImgConverter.getDefaultMenuFolderImgUrl(), - menuResponses); + menuResponses, urlConverter); } /** diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java index 45b2306c..709ea020 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import java.util.List; import lombok.AccessLevel; @@ -16,21 +16,23 @@ public class GetMenuFolderMenuResponse { private Long menuFolderId; private String menuFolderTitle; private String menuFolderImgUrl; - private MenuFolderIcon menuFolderIcon; + private String menuFolderIconImgUrl; private List menus; public static GetMenuFolderMenuResponse of(MenuFolder menuFolder, String defaultMenuFolderImgUrl, - List menus) { + List menus, UrlConverter urlConverter) { String menuFolderImgUrl = menuFolder.getImgUrl(); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } + String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + return GetMenuFolderMenuResponse.builder() .menuFolderId(menuFolder.getId()) .menuFolderTitle(menuFolder.getTitle()) .menuFolderImgUrl(menuFolderImgUrl) - .menuFolderIcon(menuFolder.getIcon()) + .menuFolderIconImgUrl(menuFolderIconImgUrl) .menus(menus) .build(); } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java index 4b60b184..85b88613 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuImg; import com.ourmenu.backend.domain.menu.domain.MenuMenuFolder; @@ -23,10 +23,10 @@ public class SaveMenuResponse { private int menuPrice; private String menuMemoTitle; private String menuMemoContent; - private MenuPin menuPin; + private String menuPinImgUrl; private List menuFolderIds; private boolean isCrawled; - private List tags; + private List tagImgUrls; private String storeTitle; private String storeAddress; private Double storeMapX; @@ -34,19 +34,27 @@ public class SaveMenuResponse { private List menuImgUrls; public static SaveMenuResponse of(Menu menu, Store store, Map map, List menuImgs, - List menuMenuFolders, List tags) { - List menuImgUrls = menuImgs.stream().map(MenuImg::getImgUrl).toList(); - List menuFolderIds = menuMenuFolders.stream().map(MenuMenuFolder::getFolderId).toList(); + List menuMenuFolders, List tags, UrlConverter urlConverter) { + String menuPinImgUrl = urlConverter.getMenuPinAddUrl(menu.getPin()); + List menuFolderIds = menuMenuFolders.stream() + .map(MenuMenuFolder::getFolderId) + .toList(); + List tagImgUrls = tags.stream() + .map(urlConverter::getOrangeTagImgUrl) + .toList(); + List menuImgUrls = menuImgs.stream() + .map(MenuImg::getImgUrl) + .toList(); return SaveMenuResponse.builder() .menuId(menu.getId()) .menuTitle(menu.getTitle()) .menuPrice(menu.getPrice()) .menuMemoTitle(menu.getMemoTitle()) .menuMemoContent(menu.getMemoContent()) - .menuPin(menu.getPin()) + .menuPinImgUrl(menuPinImgUrl) .menuFolderIds(menuFolderIds) .isCrawled(menu.getIsCrawled()) - .tags(tags) + .tagImgUrls(tagImgUrls) .storeTitle(store.getTitle()) .storeAddress(store.getAddress()) .storeMapX(map.getLocation().getX()) From 3302f3cfe50360a4d6fae629be25053b07988c26 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Mon, 26 May 2025 16:44:46 +0900 Subject: [PATCH 68/83] fix: GET/api/menus/{menuId} - ENUM -> URL --- .../domain/menu/application/MenuService.java | 2 +- .../domain/menu/dto/GetMenuResponse.java | 34 ++++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java index ea1ed0ab..419d34f4 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java @@ -218,7 +218,7 @@ public GetMenuResponse findMenu(Long userId, Long menuId) { List imgUrls = menuImgService.findImgUrls(menuId); List tags = menuTagService.findTagNames(menuId); List menuFolders = menuFolderService.findAllByMenuId(menuId); - return GetMenuResponse.of(menu, imgUrls, tags, menuFolders); + return GetMenuResponse.of(menu, imgUrls, tags, menuFolders, urlConverter); } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java index 9e739150..c0be546e 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java @@ -1,7 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; -import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.tag.domain.Tag; @@ -19,10 +18,10 @@ public class GetMenuResponse { private Long menuId; private String menuTitle; private int menuPrice; - private MenuPin menuPin; + private String menuPinImgUrl; private String storeTitle; private String storeAddress; - private List tags; + private List tagImgUrls; private List menuImgUrls; private List menuFolders; @@ -33,26 +32,35 @@ public class GetMenuResponse { private static class SimpleMenuFolder { private Long menuFolderId; private String menuFolderTitle; - private MenuFolderIcon menuFolderIcon; + private String menuFolderIconImgUrl; } public static GetMenuResponse of(Menu menu, List imgUrls, List tags, - List menuFolders) { + List menuFolders, UrlConverter urlConverter) { + String menuPinImgUrl = urlConverter.getMenuPinMapUrl(menu.getPin()); + List simpleMenuFolders = menuFolders.stream() - .map(menuFolder -> SimpleMenuFolder.builder() - .menuFolderId(menuFolder.getId()) - .menuFolderTitle(menuFolder.getTitle()) - .menuFolderIcon(menuFolder.getIcon()) - .build()) + .map(menuFolder -> { + String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + return SimpleMenuFolder.builder() + .menuFolderId(menuFolder.getId()) + .menuFolderTitle(menuFolder.getTitle()) + .menuFolderIconImgUrl(menuFolderIconImgUrl) + .build(); + }) + .toList(); + List tagImgUrls = tags.stream() + .map(urlConverter::getOrangeTagImgUrl) .toList(); + return GetMenuResponse.builder(). menuId(menu.getId()) .menuTitle(menu.getTitle()) .menuPrice(menu.getPrice()) - .menuPin(menu.getPin()) + .menuPinImgUrl(menuPinImgUrl) .storeAddress(menu.getStore().getAddress()) .storeTitle(menu.getStore().getTitle()) - .tags(tags) + .tagImgUrls(tagImgUrls) .menuImgUrls(imgUrls) .menuFolders(simpleMenuFolders) .build(); From b909a48eddf7ccf6ed69ba504d19ccbe78c7002d Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 27 May 2025 15:06:07 +0900 Subject: [PATCH 69/83] =?UTF-8?q?fix:=20=EC=A7=80=EB=8F=84=20API=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ENUM -> URL - 동일한 좌표에 대한 핀 이미지 처리 --- .../cache/application/CacheService.java | 2 +- .../domain/cache/util/MenuPinConverter.java | 23 ++++++++++++++++++ .../domain/cache/util/UrlConverter.java | 2 +- .../domain/menu/application/MapService.java | 24 ++++++++++--------- .../domain/menu/application/MenuService.java | 2 +- .../menu/dto/MenuFolderInfoOnMapDto.java | 12 ++++++---- .../domain/menu/dto/MenuInfoOnMapDto.java | 21 +++++++++------- .../backend/domain/menu/dto/MenuOnMapDto.java | 21 +++++++++++----- 8 files changed, 73 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java diff --git a/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java b/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java index d7f155e5..31f3b5e1 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java @@ -44,7 +44,7 @@ private List getMenuPinInfo() { .map(menuPin -> { String menuPinMapUrl = urlConvertor.getMenuPinMapUrl(menuPin); String menuPinAddUrl = urlConvertor.getMenuPinAddUrl(menuPin); - String menuPinMapAddDiable = urlConvertor.getMenuPinMapAddDiable(menuPin); + String menuPinMapAddDiable = urlConvertor.getMenuPinMapAddDisable(menuPin); return SimpleMenuPinResponse.of(menuPin, menuPinMapUrl, menuPinAddUrl, menuPinMapAddDiable); }) diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java new file mode 100644 index 00000000..2e57cdcc --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java @@ -0,0 +1,23 @@ +package com.ourmenu.backend.domain.cache.util; + +import com.ourmenu.backend.domain.cache.domain.MenuPin; +import java.util.List; + +public class MenuPinConverter { + + public static MenuPin of(List menuPins) { + if (menuPins.size() == 1) { + return menuPins.get(0); + } + if (menuPins.size() == 2) { + return MenuPin.TWO; + } + if (menuPins.size() == 3) { + return MenuPin.THREE; + } + if (menuPins.size() == 4) { + return MenuPin.FOUR; + } + return MenuPin.FIVE; + } +} diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java index 3eeb447b..342ad422 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java @@ -24,7 +24,7 @@ public String getMenuPinAddUrl(MenuPin pin) { return url + "/menu-pins/" + pin.getImgUrl() + "_add.svg"; } - public String getMenuPinMapAddDiable(MenuPin pin) { + public String getMenuPinMapAddDisable(MenuPin pin) { if (isETCMenuPin(pin)) { return null; } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java index 0794ec64..fd5555da 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java @@ -1,11 +1,12 @@ package com.ourmenu.backend.domain.menu.application; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.dao.MenuFolderRepository; import com.ourmenu.backend.domain.menu.dao.MenuImgRepository; -import com.ourmenu.backend.domain.menu.domain.MenuFolder; -import com.ourmenu.backend.domain.menu.domain.MenuImg; import com.ourmenu.backend.domain.menu.dao.MenuRepository; import com.ourmenu.backend.domain.menu.domain.Menu; +import com.ourmenu.backend.domain.menu.domain.MenuFolder; +import com.ourmenu.backend.domain.menu.domain.MenuImg; import com.ourmenu.backend.domain.menu.dto.MapSearchDto; import com.ourmenu.backend.domain.menu.dto.MapSearchHistoryDto; import com.ourmenu.backend.domain.menu.dto.MenuFolderInfoOnMapDto; @@ -22,6 +23,9 @@ import com.ourmenu.backend.domain.user.dao.UserRepository; import com.ourmenu.backend.domain.user.domain.User; import com.ourmenu.backend.domain.user.exception.NotFoundUserException; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.locationtech.jts.geom.Coordinate; @@ -35,10 +39,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - @Service @RequiredArgsConstructor @Slf4j @@ -51,6 +51,7 @@ public class MapService { private final MenuImgRepository menuImgRepository; private final MenuFolderRepository menuFolderRepository; private final OwnedMenuSearchRepository ownedMenuSearchRepository; + private final UrlConverter urlConverter; /** * 유저가 보유한 메뉴들을 가져와 위치가 같은 메뉴들은 그룹핑하여 조회 @@ -62,18 +63,19 @@ public List findMenusOnMap(Long userId) { User user = userRepository.findById(userId) .orElseThrow(NotFoundUserException::new); List menus = menuRepository.findMenusByUserId(userId); - + java.util.Map> menuMaps = menus.stream() .filter(menu -> menu.getStore().getMap() != null) .collect(Collectors.groupingBy(menu -> menu.getStore().getMap())); return menuMaps.entrySet().stream() - .map(entry -> MenuOnMapDto.from(entry.getKey(), entry.getValue())) + .map(entry -> MenuOnMapDto.from( + entry.getKey(), entry.getValue(), urlConverter)) .collect(Collectors.toList()); } /** - * 지도 화면에서의 같은 위치에 존재하는 메뉴들 조회 + * 지도 화면에서의 같은 위치에 존재하는 메뉴들 조회 * * @param mapId * @param userId @@ -172,10 +174,10 @@ private MenuInfoOnMapDto getMenuInfo(Menu menu) { if (!menuFolders.isEmpty()) { MenuFolder latestMenuFolder = menuFolders.stream() .max(Comparator.comparing(MenuFolder::getCreatedAt)).get(); - menuFolderInfo = MenuFolderInfoOnMapDto.of(latestMenuFolder, menuFolders.size()); + menuFolderInfo = MenuFolderInfoOnMapDto.of(latestMenuFolder, menuFolders.size(), urlConverter); } - return MenuInfoOnMapDto.of(menu, menuTags, menuImgs, menuFolderInfo); + return MenuInfoOnMapDto.of(menu, menuTags, menuImgs, menuFolderInfo, urlConverter); } /** diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java index 419d34f4..c0701ef9 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java @@ -55,7 +55,7 @@ public SaveMenuResponse saveMenu(MenuDto menuDto) { Store store = storeService.saveStoreAndMap(menuDto.getStoreTitle(), menuDto.getStoreAddress(), menuDto.getMapX(), menuDto.getMapY()); - + Menu menu = Menu.builder() .title(menuDto.getMenuTitle()) .price(menuDto.getMenuPrice()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java index 82dfd1ab..f7ef27af 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import lombok.Builder; import lombok.Getter; @@ -10,13 +10,15 @@ public class MenuFolderInfoOnMapDto { private String menuFolderTitle; - private MenuFolderIcon menuFolderIcon; + private String menuFolderIconImgUrl; private int menuFolderCount; - public static MenuFolderInfoOnMapDto of(MenuFolder menuFolder, int count) { + public static MenuFolderInfoOnMapDto of(MenuFolder menuFolder, int count, UrlConverter urlConverter) { + String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + return MenuFolderInfoOnMapDto.builder() .menuFolderTitle(menuFolder.getTitle()) - .menuFolderIcon(menuFolder.getIcon()) + .menuFolderIconImgUrl(menuFolderIconImgUrl) .menuFolderCount(count) .build(); } @@ -24,7 +26,7 @@ public static MenuFolderInfoOnMapDto of(MenuFolder menuFolder, int count) { public static MenuFolderInfoOnMapDto empty() { return MenuFolderInfoOnMapDto.builder() .menuFolderTitle("") - .menuFolderIcon(null) + .menuFolderIconImgUrl(null) .menuFolderCount(0) .build(); } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java index 4f6fecf8..9d4bbc26 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java @@ -1,10 +1,9 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuImg; import com.ourmenu.backend.domain.tag.domain.MenuTag; -import com.ourmenu.backend.domain.tag.domain.Tag; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; @@ -17,8 +16,8 @@ public class MenuInfoOnMapDto { private Long menuId; private String menuTitle; private Integer menuPrice; - private MenuPin menuPin; - private List menuTags; + private String menuPinImgUrl; + private List menuTagImgUrls; private List menuImgUrls; private MenuFolderInfoOnMapDto menuFolderInfo; private Long mapId; @@ -26,15 +25,19 @@ public class MenuInfoOnMapDto { private Double mapY; public static MenuInfoOnMapDto of(Menu menu, List menuTags, List menuImgs, - MenuFolderInfoOnMapDto menuFolderInfo) { + MenuFolderInfoOnMapDto menuFolderInfo, UrlConverter urlConverter) { + String menuPinImgUrl = urlConverter.getMenuPinMapUrl(menu.getPin()); + List menuTagImgUrls = menuTags.stream() + .map(MenuTag::getTag) + .map(urlConverter::getOrangeTagImgUrl) + .toList(); + return MenuInfoOnMapDto.builder() .menuId(menu.getId()) .menuTitle(menu.getTitle()) .menuPrice(menu.getPrice()) - .menuPin(menu.getPin()) - .menuTags(menuTags.stream().map( - MenuTag::getTag - ).collect(Collectors.toList())) + .menuPinImgUrl(menuPinImgUrl) + .menuTagImgUrls(menuTagImgUrls) .menuImgUrls(menuImgs.stream().map( menuImg -> menuImg.getImgUrl() ).collect(Collectors.toList())) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java index 7d13253a..61c21080 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java @@ -1,10 +1,11 @@ package com.ourmenu.backend.domain.menu.dto; import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.cache.util.MenuPinConverter; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.store.domain.Map; import java.util.List; -import java.util.stream.Collectors; import lombok.Builder; import lombok.Getter; @@ -13,16 +14,24 @@ public class MenuOnMapDto { private Long mapId; - private List menuPins; + private String menuPinImgUrl; + private String menuPinDisableImgUrl; private Double mapX; private Double mapY; - public static MenuOnMapDto from(Map map, List menus) { + public static MenuOnMapDto from(Map map, List menus, UrlConverter urlConverter) { + + List menuPins = menus.stream() + .map(Menu::getPin) + .toList(); + MenuPin menuPin = MenuPinConverter.of(menuPins); + String menuPinImgUrl = urlConverter.getMenuPinMapUrl(menuPin); + String menuPinDisableImgUrl = urlConverter.getMenuPinMapAddDisable(menuPin); + return MenuOnMapDto.builder() .mapId(map.getId()) - .menuPins(menus.stream() - .map(Menu::getPin) - .collect(Collectors.toList())) + .menuPinImgUrl(menuPinImgUrl) + .menuPinDisableImgUrl(menuPinDisableImgUrl) .mapX(map.getLocation().getX()) .mapY(map.getLocation().getY()) .build(); From 0450ff089b1c9b21862d63a84381e5ddff97e299 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 27 May 2025 16:16:00 +0900 Subject: [PATCH 70/83] =?UTF-8?q?fix:=20home=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ENUM -> URL - 추천 문구 랜덤 선택 --- .../domain/cache/util/UrlConverter.java | 9 ++++++ .../domain/home/application/HomeService.java | 8 +++-- .../backend/domain/home/domain/Answer.java | 7 ++++ .../backend/domain/home/domain/Question.java | 3 +- .../home/dto/GetHomeRecommendResponse.java | 20 +++++++++--- .../home/dto/SaveAndGetQuestionRequest.java | 32 +++++++++++++++++-- 6 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java index 342ad422..5b99ac55 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java @@ -3,6 +3,7 @@ import com.ourmenu.backend.domain.cache.domain.HomeImg; import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.tag.domain.Tag; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -47,6 +48,14 @@ public String getWhiteTagImgUrl(Tag tag) { return url + "/tags/" + tag.getImgUrl() + "_white.svg"; } + public String getAnswerImgUrl(Answer answer) { + return url + "/answers/" + answer.toString() + ".svg"; + } + + public String getHomeRecommendTagImgUrl(Tag tag) { + return url + "/home_tags/" + tag.getTagEnum() + ".svg"; + } + private boolean isETCMenuPin(MenuPin pin) { return pin.equals(MenuPin.TWO) || pin.equals(MenuPin.THREE) || pin.equals(MenuPin.FOUR) || pin.equals( MenuPin.FIVE); diff --git a/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java b/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java index 705c1421..46cb01ff 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java +++ b/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java @@ -1,5 +1,6 @@ package com.ourmenu.backend.domain.home.application; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.home.dao.HomeQuestionAnswerRepository; import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.home.domain.HomeQuestionAnswer; @@ -29,6 +30,7 @@ public class HomeService { private final RecommendMenuCacheService recommendMenuCacheService; private final MenuService menuService; private final MealTimeService mealTimeService; + private final UrlConverter urlConverter; /** * 홈 질문 응답 값을 저장 및 추천 메뉴를 캐싱한다. 질문에 관련 없는 응답이면 에러를 반환한다. @@ -68,12 +70,12 @@ public SaveAndGetQuestionRequest updateQuestion(Long userId) { .userId(userId) .build(); HomeQuestionAnswer saveHomeQuestionAnswer = homeQuestionAnswerRepository.save(homeQuestionAnswer); - return SaveAndGetQuestionRequest.from(saveHomeQuestionAnswer); + return SaveAndGetQuestionRequest.from(saveHomeQuestionAnswer, urlConverter); } HomeQuestionAnswer homeQuestionAnswer = optionalHomeQuestionAnswer.get(); homeQuestionAnswer.update(randomQuestion); - return SaveAndGetQuestionRequest.from(homeQuestionAnswer); + return SaveAndGetQuestionRequest.from(homeQuestionAnswer, urlConverter); } /** @@ -91,7 +93,7 @@ public GetHomeRecommendResponse getRecommendMenus(Long userId) { List randomRecommendMenus = getRandomRecommendMenu(); return GetHomeRecommendResponse.of(answer, questionRecommendMenus, tagRandomRecommendDto.getTag(), - tagRandomRecommendDto.getGetRecommendMenuResponses(), randomRecommendMenus); + tagRandomRecommendDto.getGetRecommendMenuResponses(), randomRecommendMenus, urlConverter); } /** diff --git a/src/main/java/com/ourmenu/backend/domain/home/domain/Answer.java b/src/main/java/com/ourmenu/backend/domain/home/domain/Answer.java index b4310516..13ad996b 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/domain/Answer.java +++ b/src/main/java/com/ourmenu/backend/domain/home/domain/Answer.java @@ -22,6 +22,7 @@ import com.ourmenu.backend.domain.tag.domain.Tag; import java.util.Arrays; import java.util.List; +import java.util.Random; import lombok.Getter; @Getter @@ -38,6 +39,7 @@ public enum Answer { SUMMER("여름", Tag.COOL, SUMMER1, SUMMER2, SUMMER3), WINTER("겨울", Tag.HOT, WINTER1, WINTER2); + private static final Random RANDOM = new Random(); private String answer; private Tag tag; private List homeImgs; @@ -47,4 +49,9 @@ public enum Answer { this.tag = tag; this.homeImgs = Arrays.asList(homeImgs); } + + public HomeImg getRandomHomeImg() { + return homeImgs.get(RANDOM.nextInt(homeImgs.size())); + } + } diff --git a/src/main/java/com/ourmenu/backend/domain/home/domain/Question.java b/src/main/java/com/ourmenu/backend/domain/home/domain/Question.java index 0b50623c..231b0520 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/domain/Question.java +++ b/src/main/java/com/ourmenu/backend/domain/home/domain/Question.java @@ -5,6 +5,7 @@ import static com.ourmenu.backend.domain.home.domain.Answer.MOUNTAIN; import static com.ourmenu.backend.domain.home.domain.Answer.RAINY; import static com.ourmenu.backend.domain.home.domain.Answer.SEA; +import static com.ourmenu.backend.domain.home.domain.Answer.SPICY; import static com.ourmenu.backend.domain.home.domain.Answer.SUMMER; import static com.ourmenu.backend.domain.home.domain.Answer.SUNNY; import static com.ourmenu.backend.domain.home.domain.Answer.SWEET; @@ -19,7 +20,7 @@ public enum Question { FEEL("오늘 기분은 어떠신가요?", LIKE, DISLIKE), WEATHER("오늘 날씨는 어떤가요?", SUNNY, RAINY), - STRESS("스트레스 받을 때는 어떤 음식을 드시나요?", SWEET, RAINY), + STRESS("스트레스 받을 때는 어떤 음식을 드시나요?", SWEET, SPICY), TRIP("어디로 떠나고 싶은가요?", SEA, MOUNTAIN), SEASON("어느 계절을 더 좋아하세요?", SUMMER, WINTER); diff --git a/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java b/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java index c31edcb7..12eb5612 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java @@ -1,5 +1,7 @@ package com.ourmenu.backend.domain.home.dto; +import com.ourmenu.backend.domain.cache.domain.HomeImg; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.tag.domain.Tag; import java.util.List; @@ -13,22 +15,30 @@ @Builder(access = AccessLevel.PRIVATE) public class GetHomeRecommendResponse { - private Answer answer; + private String answerImgUrl; private List answerRecommendMenus; - private Tag tag; + private String tagRecommendImgUrl; private List tagRecommendMenus; + private String otherRecommendImgUrl; private List otherRecommendMenus; public static GetHomeRecommendResponse of(Answer answer, List answerRecommendMenus, Tag tag, List tagRecommendMenus, - List otherRecommendMenus) { + List otherRecommendMenus, + UrlConverter urlConverter) { + HomeImg homeImg = answer.getRandomHomeImg(); + String HomeImgUrl = urlConverter.getHomeImgUrl(homeImg); + String tagRecommendImgUrl = urlConverter.getHomeRecommendTagImgUrl(tag); + String otherRecommendImgUrl = tagRecommendImgUrl; + return GetHomeRecommendResponse.builder() - .answer(answer) + .answerImgUrl(HomeImgUrl) .answerRecommendMenus(answerRecommendMenus) - .tag(tag) + .tagRecommendImgUrl(tagRecommendImgUrl) .tagRecommendMenus(tagRecommendMenus) + .otherRecommendImgUrl(otherRecommendImgUrl) .otherRecommendMenus(otherRecommendMenus) .build(); } diff --git a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java index 0299534e..3a9654de 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java @@ -1,7 +1,10 @@ package com.ourmenu.backend.domain.home.dto; +import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.home.domain.HomeQuestionAnswer; import com.ourmenu.backend.domain.home.domain.Question; +import java.util.List; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -13,10 +16,35 @@ public class SaveAndGetQuestionRequest { private Question question; + private List answers; + + public static SaveAndGetQuestionRequest from(HomeQuestionAnswer homeQuestionAnswer, UrlConverter urlConverter) { + Question question = homeQuestionAnswer.getQuestion(); + + Answer answer1 = question.getAnswer1(); + AnswerDto answerDto1 = AnswerDto.builder() + .answer(answer1) + .answerImgUrl(urlConverter.getAnswerImgUrl(answer1)) + .build(); + + Answer answer2 = question.getAnswer2(); + AnswerDto answerDto2 = AnswerDto.builder() + .answer(answer2) + .answerImgUrl(urlConverter.getAnswerImgUrl(answer2)) + .build(); - public static SaveAndGetQuestionRequest from(HomeQuestionAnswer homeQuestionAnswer) { return SaveAndGetQuestionRequest.builder() - .question(homeQuestionAnswer.getQuestion()) + .question(question) + .answers(List.of(answerDto1, answerDto2)) .build(); } + + @AllArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + @Builder(access = AccessLevel.PRIVATE) + private static class AnswerDto { + private Answer answer; + private String answerImgUrl; + + } } From 926ca3015d20b0aef973901f0804004bb5aca53a Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 27 May 2025 16:18:48 +0900 Subject: [PATCH 71/83] =?UTF-8?q?feat:=20=EC=9C=A0=ED=8B=B8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - private constructor --- .../ourmenu/backend/domain/cache/util/MenuPinConverter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java index 2e57cdcc..60395ef5 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/util/MenuPinConverter.java @@ -5,6 +5,10 @@ public class MenuPinConverter { + private MenuPinConverter() { + + } + public static MenuPin of(List menuPins) { if (menuPins.size() == 1) { return menuPins.get(0); From 48469a9f781d5b02e9f375dc38f20df263fce796 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 27 May 2025 16:46:12 +0900 Subject: [PATCH 72/83] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20&=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/cache/application/CacheService.java | 2 +- .../backend/domain/cache/util/UrlConverter.java | 2 +- .../domain/menu/dto/GetMenuFolderMenuResponse.java | 2 +- .../backend/domain/menu/dto/GetMenuResponse.java | 2 +- .../domain/menu/dto/MenuFolderInfoOnMapDto.java | 2 +- .../backend/domain/menu/dto/MenuFolderResponse.java | 2 +- .../domain/menu/dto/SaveMenuFolderResponse.java | 2 +- .../domain/menu/dto/UpdateMenuFolderResponse.java | 6 +++--- .../ourmenu/backend/domain/home/api/HomeApiTest.java | 12 +++++++++++- .../ourmenu/backend/domain/menu/api/MenuApiTest.java | 12 ++++++++++-- .../backend/domain/menu/api/MenuFolderApiTest.java | 8 ++++++-- 11 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java b/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java index 31f3b5e1..efae0f3d 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java @@ -33,7 +33,7 @@ public GetCacheInfoResponse getCacheInfo() { private List getMenuFolderIconInfo() { return Arrays.stream(MenuFolderIcon.values()) .map(menuFolderIcon -> { - String menuFolderIconUrl = urlConvertor.getMenuFolderUrl(menuFolderIcon); + String menuFolderIconUrl = urlConvertor.getMenuFolderImgUrl(menuFolderIcon); return SimpleMenuFolderIconResponse.of(menuFolderIcon, menuFolderIconUrl); }) .toList(); diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java index 5b99ac55..915f1e15 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java @@ -32,7 +32,7 @@ public String getMenuPinMapAddDisable(MenuPin pin) { return url + "/menu-pins/" + pin.getImgUrl() + "_add_disable.svg"; } - public String getMenuFolderUrl(MenuFolderIcon icon) { + public String getMenuFolderImgUrl(MenuFolderIcon icon) { return url + "/menu-folder-icons/" + icon.getImgUrl() + ".svg"; } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java index 709ea020..b13fa41a 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java @@ -26,7 +26,7 @@ public static GetMenuFolderMenuResponse of(MenuFolder menuFolder, String default menuFolderImgUrl = defaultMenuFolderImgUrl; } - String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); return GetMenuFolderMenuResponse.builder() .menuFolderId(menuFolder.getId()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java index c0be546e..055669eb 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java @@ -41,7 +41,7 @@ public static GetMenuResponse of(Menu menu, List imgUrls, List tags List simpleMenuFolders = menuFolders.stream() .map(menuFolder -> { - String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); return SimpleMenuFolder.builder() .menuFolderId(menuFolder.getId()) .menuFolderTitle(menuFolder.getTitle()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java index f7ef27af..1ddd40c9 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java @@ -14,7 +14,7 @@ public class MenuFolderInfoOnMapDto { private int menuFolderCount; public static MenuFolderInfoOnMapDto of(MenuFolder menuFolder, int count, UrlConverter urlConverter) { - String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); return MenuFolderInfoOnMapDto.builder() .menuFolderTitle(menuFolder.getTitle()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java index a39150d8..67b177cc 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java @@ -28,7 +28,7 @@ public static MenuFolderResponse of(MenuFolder menuFolder, List menuFolderImgUrl = defaultMenuFolderImgUrl; } - String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); List menuIds = menuFolders.stream() .map(menuMenuFolder -> menuMenuFolder.getMenu().getId()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java index e9969e7f..a9a59b37 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java @@ -23,7 +23,7 @@ public class SaveMenuFolderResponse { public static SaveMenuFolderResponse of(MenuFolder menuFolder, List menuIds, String defaultMenuFolderImgUrl, UrlConverter urlConverter) { String menuFolderImgUrl = menuFolder.getImgUrl(); - String menuFolderIconImgUrl = urlConverter.getMenuFolderUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java index 387c760f..afbffaf0 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java @@ -16,7 +16,7 @@ public class UpdateMenuFolderResponse { private Long menuFolderId; private String menuFolderTitle; - private String menuFolderUrl; + private String menuFolderImgUrl; private String menuFolderIconImgUrl; private List menuIds; private int index; @@ -28,7 +28,7 @@ public static UpdateMenuFolderResponse of(MenuFolder menuFolder, List menuId = menuMenuFolders.stream() .map(menuMenuFolder -> menuMenuFolder.getMenu().getId()) @@ -36,7 +36,7 @@ public static UpdateMenuFolderResponse of(MenuFolder menuFolder, List Assertions.assertThat(answerImgUrl) + .isEqualTo(urlConverter.getHomeImgUrl(HomeImg.LIKE1)), + answerImgUrl -> Assertions.assertThat(answerImgUrl).isEqualTo(urlConverter.getHomeImgUrl(HomeImg.LIKE2)) + ); } } diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java index 9b9ce8c7..e893d6aa 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.menu.api; import com.ourmenu.backend.domain.cache.domain.MenuPin; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; import com.ourmenu.backend.domain.menu.domain.Menu; @@ -34,6 +35,9 @@ public class MenuApiTest { @Autowired MenuController menuController; + @Autowired + UrlConverter urlConverter; + @Autowired GlobalUserTestData userTestData; @@ -62,9 +66,11 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isTrue(); - Assertions.assertThat(response.getResponse().getMenuFolderIcon()).isEqualTo(testMenuFolder.getIcon()); Assertions.assertThat(response.getResponse().getMenuFolderTitle()).isEqualTo(testMenuFolder.getTitle()); Assertions.assertThat(response.getResponse().getMenus().size()).isEqualTo(3); + + Assertions.assertThat(response.getResponse().getMenuFolderIconImgUrl()) + .isEqualTo(urlConverter.getMenuFolderImgUrl(testMenuFolder.getIcon())); } @Test @@ -80,8 +86,10 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isTrue(); - Assertions.assertThat(response.getResponse().getMenuPin()).isEqualTo(MenuPin.BBQ); Assertions.assertThat(response.getResponse().getMenuMemoTitle()).isEqualTo(menuMemoTitle); + + Assertions.assertThat(response.getResponse().getMenuPinImgUrl()) + .isEqualTo(urlConverter.getMenuPinAddUrl(MenuPin.BBQ)); } @Test diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index d1fff782..db16f95c 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.menu.api; import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; +import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; import com.ourmenu.backend.domain.menu.domain.MenuFolder; @@ -32,6 +33,9 @@ public class MenuFolderApiTest { @Autowired MenuFolderController menuFolderController; + @Autowired + UrlConverter urlConverter; + @Autowired GlobalUserTestData userTestData; @@ -151,9 +155,9 @@ void setUp() { Assertions.assertThat(updateMenuFolderResponseApiResponse.isSuccess()).isEqualTo(true); Assertions.assertThat(updateMenuFolderResponseApiResponse.getResponse().getMenuFolderTitle()) .isEqualTo(modifiedMenuFolderName); - Assertions.assertThat(updateMenuFolderResponseApiResponse.getResponse().getMenuFolderIcon()) - .isEqualTo(testMenuFolder.getIcon()); + Assertions.assertThat(updateMenuFolderResponseApiResponse.getResponse().getMenuFolderIconImgUrl()) + .isEqualTo(urlConverter.getMenuFolderImgUrl(testMenuFolder.getIcon())); } @Test From 4b85dc7cac70bca0166a0fd3aeedd808254295a4 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Wed, 28 May 2025 16:49:22 +0900 Subject: [PATCH 73/83] =?UTF-8?q?fix:=20GET/api/home/questions=20response?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 질문 ENUM -> String --- .../backend/domain/home/dto/SaveAndGetQuestionRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java index 3a9654de..f7731381 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java @@ -15,7 +15,7 @@ @Builder(access = AccessLevel.PRIVATE) public class SaveAndGetQuestionRequest { - private Question question; + private String question; private List answers; public static SaveAndGetQuestionRequest from(HomeQuestionAnswer homeQuestionAnswer, UrlConverter urlConverter) { @@ -34,7 +34,7 @@ public static SaveAndGetQuestionRequest from(HomeQuestionAnswer homeQuestionAnsw .build(); return SaveAndGetQuestionRequest.builder() - .question(question) + .question(question.getQuestion()) .answers(List.of(answerDto1, answerDto2)) .build(); } From e309782550899ccf9629563465904df1fa55e567 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 28 May 2025 17:12:32 +0900 Subject: [PATCH 74/83] =?UTF-8?q?fix:=20MealTime=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9D=91=EB=8B=B5=20LocalTime=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/application/MealTimeService.java | 7 +++--- .../user/dto/request/SignUpRequest.java | 10 +++++++- .../dto/request/UpdateMealTimeRequest.java | 9 ++++++- .../domain/user/dto/response/MealTimeDto.java | 13 +++++++--- .../backend/domain/user/util/TimeUtil.java | 25 ------------------- 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/MealTimeService.java b/src/main/java/com/ourmenu/backend/domain/user/application/MealTimeService.java index c1839b8e..a17a536c 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/MealTimeService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/MealTimeService.java @@ -48,7 +48,7 @@ public long getNextUpdateMinute(Long userId) { * @return */ @Transactional - public List saveMealTimes(List mealTimes, Long userId) { + public List saveMealTimes(List mealTimes, Long userId) { return mealTimes.stream() .map(mealTime -> saveMealTime(mealTime, userId)) .toList(); @@ -90,12 +90,11 @@ private LocalTime getFirstMealTime(Long userId) { /** * 식시시간을 시간 타입을 변환하여 저장한다. * - * @param timeInteger + * @param time * @param userId * @return */ - private MealTime saveMealTime(int timeInteger, Long userId) { - LocalTime time = TimeUtil.of(timeInteger); + private MealTime saveMealTime(LocalTime time, Long userId) { MealTime mealTime = MealTime.builder() .userId(userId) .mealTime(time) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index c1d1cb04..770ee187 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -1,10 +1,14 @@ package com.ourmenu.backend.domain.user.dto.request; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalTime; import java.util.List; @Getter @@ -13,6 +17,10 @@ public class SignUpRequest { private String email; private String password; - private List mealTime; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss") + @ArraySchema(arraySchema = @Schema(example = "[\"12:00:00\"]"), + schema = @Schema(type = "string", format = "time", example = "12:00:00")) + private List mealTime; private String signInType; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java index 694a5e3b..786db7a3 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/UpdateMealTimeRequest.java @@ -1,16 +1,23 @@ package com.ourmenu.backend.domain.user.dto.request; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalTime; import java.util.List; @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor public class UpdateMealTimeRequest { - List mealTime; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss") + @ArraySchema(arraySchema = @Schema(example = "[\"12:00:00\"]"), + schema = @Schema(type = "string", format = "time", example = "12:00:00")) + List mealTime; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java index 1be3c03d..b86d33ae 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/MealTimeDto.java @@ -1,25 +1,32 @@ package com.ourmenu.backend.domain.user.dto.response; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.ourmenu.backend.domain.user.domain.MealTime; -import com.ourmenu.backend.domain.user.util.TimeUtil; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; +import java.time.LocalTime; + @Getter @Builder @JsonIgnoreProperties({"after"}) public class MealTimeDto { - private Integer mealTime; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss") + @ArraySchema(arraySchema = @Schema(example = "[\"12:00:00\"]"), + schema = @Schema(type = "string", format = "time", example = "12:00:00")) + private LocalTime mealTime; @JsonProperty("isAfter") private boolean isAfter; public static MealTimeDto of(MealTime mealTime, boolean isAfter) { return MealTimeDto.builder() - .mealTime(TimeUtil.toInteger(mealTime.getMealTime())) + .mealTime(mealTime.getMealTime()) .isAfter(isAfter) .build(); } diff --git a/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java b/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java index 1e779495..2253d610 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java +++ b/src/main/java/com/ourmenu/backend/domain/user/util/TimeUtil.java @@ -10,21 +10,6 @@ public class TimeUtil { private TimeUtil() { } - /** - * 시간을 LocalTime으로 변환한다. - * - * @param time - * @return - */ - public static LocalTime of(int time) { - String timeStr = String.format("%04d", time); - - int hour = Integer.parseInt(timeStr.substring(0, 2)); - int minute = Integer.parseInt(timeStr.substring(2, 4)); - - return LocalTime.of(hour, minute); - } - /** * 파라미터 값이 현재 시간을 경과 했는지 검증한다 * @@ -76,14 +61,4 @@ public static long getTimeDifferenceDayAfter(LocalTime time) { return todayDuration.toMinutes() + tomorrowDuration.toMinutes(); } - /** - * LocalTime(HH:mm:ss) 을 Integer(HHmm) 형식으로 변경한다. - * - * @param time - * @return - */ - public static int toInteger(LocalTime time) { - String timeStr = String.format("%02d%02d", time.getHour(), time.getMinute()); - return Integer.parseInt(timeStr); - } } From 2c152888c59f377571f219f60d95333d2e35a0c2 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 28 May 2025 17:15:19 +0900 Subject: [PATCH 75/83] =?UTF-8?q?rename:=20MealTimeDtoList=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/application/UserService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index e97053aa..1edcfdc5 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -137,15 +137,15 @@ public UserDto getUserInfo(CustomUserDetails userDetails) { .orElseThrow(NotFoundUserException::new); List mealTimes = mealTimeService.findAllByUserId(userDetails.getId()); - List mealTimeDtoList = new ArrayList<>(); + List mealTimeDtos = new ArrayList<>(); for (MealTime mealTime : mealTimes) { boolean isAfter = LocalTime.now().isAfter(mealTime.getMealTime()); MealTimeDto mealTimeDto = MealTimeDto.of(mealTime, isAfter); - mealTimeDtoList.add(mealTimeDto); + mealTimeDtos.add(mealTimeDto); } - return UserDto.of(user, mealTimeDtoList); + return UserDto.of(user, mealTimeDtos); } /** From fdcc10b91f947026842ebeb134208e2ad9ec460f Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 28 May 2025 17:20:47 +0900 Subject: [PATCH 76/83] =?UTF-8?q?fix:=20Transactional=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/application/UserService.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 1edcfdc5..4c9b1b45 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -24,11 +24,8 @@ import com.ourmenu.backend.domain.user.exception.NotMatchTokenException; import com.ourmenu.backend.domain.user.exception.TokenExpiredExcpetion; import com.ourmenu.backend.domain.user.exception.UnsupportedSignInTypeException; -import com.ourmenu.backend.domain.user.util.TimeUtil; import com.ourmenu.backend.global.util.JwtTokenProvider; import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.transaction.Transactional; import java.time.LocalTime; import java.util.ArrayList; @@ -38,6 +35,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Slf4j @Service @@ -79,6 +77,7 @@ public TokenDto signUp(SignUpRequest request) { * @param request User의 Email, Password, SignInType Request * @return Token 정보 */ + @Transactional public TokenDto signIn(SignInRequest request) { Optional optionalUser = userRepository.findByEmail(request.getEmail()); if (optionalUser.isEmpty() || !optionalUser.get().getSignInType().name().equals(request.getSignInType())) { @@ -110,6 +109,7 @@ public TokenDto signIn(SignInRequest request) { * @param request * @param userDetails */ + @Transactional public void changePassword(UpdatePasswordRequest request, CustomUserDetails userDetails) { String rawPassword = request.getPassword(); String encodedPassword = userDetails.getPassword(); @@ -132,6 +132,7 @@ public void changePassword(UpdatePasswordRequest request, CustomUserDetails user * @param userDetails * @return */ + @Transactional(readOnly = true) public UserDto getUserInfo(CustomUserDetails userDetails) { User user = userRepository.findById(userDetails.getId()) .orElseThrow(NotFoundUserException::new); @@ -154,6 +155,7 @@ public UserDto getUserInfo(CustomUserDetails userDetails) { * @param reissueRequest * @return */ + @Transactional public TokenDto reissueToken(ReissueRequest reissueRequest) { String refreshToken = reissueRequest.getRefreshToken(); String email = jwtTokenProvider.getEmailFromToken(refreshToken); @@ -189,6 +191,7 @@ public TokenDto reissueToken(ReissueRequest reissueRequest) { * * @param request */ + @Transactional public void signOut(HttpServletRequest request) { String token = request.getHeader("Authorization"); if (token.startsWith("Bearer ")) { @@ -207,6 +210,7 @@ public void signOut(HttpServletRequest request) { * @param request * @return */ + @Transactional(readOnly = true) public KakaoExistenceResponse validateKakaoUserExists(PostEmailRequest request) { String email = request.getEmail(); @@ -224,6 +228,7 @@ public KakaoExistenceResponse validateKakaoUserExists(PostEmailRequest request) * * @param userId */ + @Transactional public void removeUser(Long userId) { User user = userRepository.findById(userId) .orElseThrow(NotFoundUserException::new); From ace10dff88adf7cf1aac978f79e4fd6e61e5dc69 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 28 May 2025 17:28:54 +0900 Subject: [PATCH 77/83] =?UTF-8?q?fix:=20=EC=9C=A0=EC=A0=80=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20MealTime=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/UserApiTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index db42edf6..fe3eaed4 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -57,9 +57,9 @@ void setUp() { @Test public void 회원_가입을_통해_유저를_생성할_수_있다() { //given - ArrayList mealTime = new ArrayList<>(); - mealTime.add(12); - mealTime.add(16); + List mealTime = new ArrayList<>(); + mealTime.add(LocalTime.of(12, 0)); + mealTime.add(LocalTime.of(16, 0)); SignUpRequest signUpRequest = new SignUpRequest("test123@gmail.com", "password123", mealTime, @@ -106,9 +106,9 @@ void setUp() { public void 식사시간_정보를_변경할_수_있다() { //given CustomUserDetails testEmailUserWithMealTime = userTestData.createTestEmailUserWithMealTime(); - ArrayList changeMealTime = new ArrayList<>(); - changeMealTime.add(10); - changeMealTime.add(16); + List changeMealTime = new ArrayList<>(); + changeMealTime.add(LocalTime.of(12,0)); + changeMealTime.add(LocalTime.of(16,0)); UpdateMealTimeRequest request = new UpdateMealTimeRequest(changeMealTime); //when @@ -174,7 +174,7 @@ void setUp() { Assertions.assertThat(response.isSuccess()).isEqualTo(true); Assertions.assertThat(response.getResponse().getEmail()).isEqualTo("testEmailUser@naver.com"); Assertions.assertThat(response.getResponse().getSignInType()).isEqualTo("EMAIL"); - Assertions.assertThat(response.getResponse().getMealTimeList().get(0).getMealTime()).isEqualTo(1200); + Assertions.assertThat(response.getResponse().getMealTimeList().get(0).getMealTime()).isEqualTo(LocalTime.NOON); } @Test @@ -195,7 +195,7 @@ void setUp() { @Test public void 토큰을_재발급_받을_수_있다() { //given - List mealTime = List.of(12, 16); + List mealTime = List.of(LocalTime.of(12, 0), LocalTime.of(16, 0)); SignUpRequest signUpRequest = new SignUpRequest("test123@gmail.com", "password123", mealTime, From faddfd4b69acbbb95715adcad40e159302753b90 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 28 May 2025 17:44:29 +0900 Subject: [PATCH 78/83] =?UTF-8?q?fix:=20Response=20success=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=A4=91=EB=B3=B5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/global/response/ApiResponse.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java b/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java index febec78c..8cd4c835 100644 --- a/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java +++ b/src/main/java/com/ourmenu/backend/global/response/ApiResponse.java @@ -1,5 +1,6 @@ package com.ourmenu.backend.global.response; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; @@ -9,6 +10,7 @@ @AllArgsConstructor @JsonInclude(Include.NON_NULL) +@JsonIgnoreProperties({"success"}) @Getter public class ApiResponse { From 4e2820f6dc29f33a397fd4534cd72c0f8e7ffbda Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 29 May 2025 02:05:15 +0900 Subject: [PATCH 79/83] =?UTF-8?q?fix:=20=EB=A9=94=EB=89=B4=ED=95=80=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=99=95=EC=9E=A5=EC=9E=90=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - png 통일 - ETC 이미지 추가 --- .../ourmenu/backend/domain/cache/util/UrlConverter.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java index 915f1e15..d4420ff5 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java @@ -22,14 +22,11 @@ public String getMenuPinAddUrl(MenuPin pin) { if (isETCMenuPin(pin)) { return null; } - return url + "/menu-pins/" + pin.getImgUrl() + "_add.svg"; + return url + "/menu-pins/" + pin.getImgUrl() + "_add.png"; } public String getMenuPinMapAddDisable(MenuPin pin) { - if (isETCMenuPin(pin)) { - return null; - } - return url + "/menu-pins/" + pin.getImgUrl() + "_add_disable.svg"; + return url + "/menu-pins/" + pin.getImgUrl() + "_add_disable.png"; } public String getMenuFolderImgUrl(MenuFolderIcon icon) { From 4505f934aa4ed135022e71984df5f4424030a2cb Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 29 May 2025 02:06:22 +0900 Subject: [PATCH 80/83] =?UTF-8?q?test:=20=ED=95=84=EC=9A=94=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=95=84=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/cache/api/CacheApiTest.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java index fd235c52..bdbf5682 100644 --- a/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java @@ -7,15 +7,12 @@ import com.ourmenu.backend.domain.cache.dto.SimpleMenuPinResponse; import com.ourmenu.backend.domain.cache.dto.SimpleTagImgResponse; import com.ourmenu.backend.domain.cache.util.UrlConverter; -import com.ourmenu.backend.domain.user.domain.CustomUserDetails; -import com.ourmenu.backend.global.DatabaseCleaner; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.config.GlobalDataConfig; import com.ourmenu.backend.global.data.GlobalUserTestData; import com.ourmenu.backend.global.response.ApiResponse; import java.util.List; import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -39,19 +36,8 @@ public class CacheApiTest { @Autowired UrlConverter urlConvertor; - @Autowired - DatabaseCleaner databaseCleaner; - - CustomUserDetails testCustomUserDetails; - RestTemplate restTemplate = new RestTemplate(); - @BeforeEach - void setUp() { - databaseCleaner.clear(); - testCustomUserDetails = userTestData.createTestEmailUserWithMealTime(); - } - @Test void 확인할_수_없는_이미지는_조회할_수_없다() { //given From 913f98e96fe8a7dff90ccad65a6cd71bcefed549 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 29 May 2025 02:19:35 +0900 Subject: [PATCH 81/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/cache/api/CacheApiTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java index bdbf5682..4e3ee722 100644 --- a/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java @@ -53,7 +53,7 @@ public class CacheApiTest { } @Test - void 메뉴판_캐시_이미지는_조회할_수_있다() { + void 메뉴판_캐시_이미지를_모두_조회할_수_있다() { //given ApiResponse response = cacheController.getCacheInfo(); GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); @@ -71,7 +71,7 @@ public class CacheApiTest { } @Test - void 메뉴핀_캐시_이미지는_조회할_수_있다() { + void 메뉴핀_캐시_이미지를_모두_조회할_수_있다() { //given ApiResponse response = cacheController.getCacheInfo(); GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); @@ -113,7 +113,7 @@ public class CacheApiTest { } @Test - void 홈이미지_캐시_이미지는_조회할_수_있다() { + void 홈이미지_캐시_이미지를_모두_조회할_수_있다() { //given ApiResponse response = cacheController.getCacheInfo(); GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); @@ -131,7 +131,7 @@ public class CacheApiTest { } @Test - void 태그_캐시_이미지는_조회할_수_있다() { + void 태그_캐시_이미지를_모두_조회할_수_있다() { //given ApiResponse response = cacheController.getCacheInfo(); GetCacheInfoResponse getCacheInfoResponse = response.getResponse(); From 32c9297d7a3249df9659d1e5a549005f4e1a38e7 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 29 May 2025 02:19:47 +0900 Subject: [PATCH 82/83] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/application/HomeImgUrlTest.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java diff --git a/src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java b/src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java new file mode 100644 index 00000000..15366402 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java @@ -0,0 +1,57 @@ +package com.ourmenu.backend.domain.home.application; + +import com.ourmenu.backend.domain.cache.domain.HomeImg; +import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.tag.domain.Tag; +import java.util.Arrays; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +@SpringBootTest +@DisplayName("홈 이미지 URL 통합 테스트") +public class HomeImgUrlTest { + + @Autowired + UrlConverter urlConverter; + + RestTemplate restTemplate = new RestTemplate(); + + @Test + void 홈_이미지를_모두_조회_할_수_있다() { + //given + List homeImgs = Arrays.stream(HomeImg.values()).toList(); + + //when + + //then + homeImgs.stream().forEach(homeImg -> { + String homeImgUrl = urlConverter.getHomeImgUrl(homeImg); + ResponseEntity responseEntity = restTemplate.getForEntity(homeImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + } + + @Test + void 홈_추천문구_이미지를_모두_조회_할_수_있다() { + //given + List tags = Arrays.stream(Tag.values()).toList(); + + //when + + //then + tags.stream().forEach(tag -> { + String homeRecommendTagImgUrl = urlConverter.getHomeRecommendTagImgUrl(tag); + ResponseEntity responseEntity = restTemplate.getForEntity(homeRecommendTagImgUrl, String.class); + Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); + }); + + } +} From 0ba6f705b0b6aa412fe7c92a7b9d0c4e0e4a483d Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 29 May 2025 03:30:34 +0900 Subject: [PATCH 83/83] =?UTF-8?q?refactor:=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20Transactional=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/user/application/UserService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 4c9b1b45..e22a7069 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -132,7 +132,6 @@ public void changePassword(UpdatePasswordRequest request, CustomUserDetails user * @param userDetails * @return */ - @Transactional(readOnly = true) public UserDto getUserInfo(CustomUserDetails userDetails) { User user = userRepository.findById(userDetails.getId()) .orElseThrow(NotFoundUserException::new); @@ -210,7 +209,6 @@ public void signOut(HttpServletRequest request) { * @param request * @return */ - @Transactional(readOnly = true) public KakaoExistenceResponse validateKakaoUserExists(PostEmailRequest request) { String email = request.getEmail();