From 21bf119a4b5c3a066648b82b39f147e4d96b9af5 Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Thu, 10 Oct 2024 17:55:06 +0900 Subject: [PATCH 01/13] =?UTF-8?q?[fix]=20=EA=B8=B0=ED=9A=8D=20=EC=9D=98?= =?UTF-8?q?=EB=8F=84=20=EB=B0=98=EC=98=81=ED=95=98=EC=97=AC=20=EC=86=8C?= =?UTF-8?q?=EB=B9=84=ED=8C=A8=ED=84=B4,=20=EC=82=AC=EC=A7=84=20=EC=9E=A0?= =?UTF-8?q?=EC=8B=9C=20=EB=B3=B4=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../budgetbuddies/domain/user/converter/UserConverter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java index a1df84e..e8a70d9 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java @@ -12,6 +12,8 @@ public static UserDto.ResponseUserDto toDto(User user) { .phoneNumber(user.getPhoneNumber()) .lastLoginAt(user.getLastLoginAt()) .gender(user.getGender()) +// .consumptionPattern(user.getConsumptionPattern()) +// .photoUrl(user.getPhotoUrl()) .email(user.getEmail()) .age(user.getAge()) .build(); @@ -23,7 +25,9 @@ public static User toUser(UserDto.RegisterUserDto dto) { .email(dto.getEmail()) .age(dto.getAge()) .name(dto.getName()) +// .consumptionPattern(dto.getConsumptionPattern()) .gender(dto.getGender()) +// .photoUrl(dto.getPhotoUrl()) .build(); } } From f5f27a7a5c5b08ece8bc55df102901bcba3b6c44 Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Thu, 10 Oct 2024 17:55:41 +0900 Subject: [PATCH 02/13] =?UTF-8?q?[fix]=20swagger=20description=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 --- .../bbteam/budgetbuddies/domain/user/controller/UserApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java index 901f97f..09d0551 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java @@ -15,7 +15,7 @@ import java.util.List; public interface UserApi { - @Operation(summary = "[Admin] 기본 카테고리 생성 API ", description = "기본 카테고리가 없는 사용자에게 기본 카테고리를 생성합니다.") + @Operation(summary = "[Admin] 기본 카테고리 생성 API ", description = "(회원 가입시 필수적으로 자동 생성되어야 합니다!)기본 카테고리가 없는 사용자에게 기본 카테고리를 생성합니다.") @ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), }) From 9e9c7c58be9ab1a20f408848582713a4db2f851f Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Thu, 10 Oct 2024 19:12:44 +0900 Subject: [PATCH 03/13] =?UTF-8?q?[fix]=20User=EC=99=80=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=EB=90=9C=20=EB=82=B4=EC=9A=A9=EB=93=A4=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/user/controller/UserApi.java | 6 ++++-- .../domain/user/converter/UserConverter.java | 6 +++++- .../budgetbuddies/domain/user/dto/UserDto.java | 12 ++++++++---- .../budgetbuddies/domain/user/entity/User.java | 5 ++++- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java index 09d0551..47550d2 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java @@ -33,10 +33,12 @@ public interface UserApi { @Parameter(name = "phoneNumber", description = "휴대폰 번호. requestBody"), @Parameter(name = "name", description = "사용자 이름. requestBody"), @Parameter(name = "age", description = "사용자 나이. requestBody"), + @Parameter(name = "mobileCarrier", description = "통신사. requestBody"), + @Parameter(name = "region", description = "지역. requestBody"), @Parameter(name = "gender", description = "사용자 성별 / MALE, FEMALE, NONE requestBody"), @Parameter(name = "email", description = "메일 주소. requestBody"), - @Parameter(name = "photoUrl", description = "사진 Url. 아마 사용 x requestBody"), - @Parameter(name = "consumptionPattern", description = "소비 패턴. 아마 사용 x requestBody") +// @Parameter(name = "photoUrl", description = "사진 Url. 아마 사용 x requestBody"), +// @Parameter(name = "consumptionPattern", description = "소비 패턴. 아마 사용 x requestBody") }) ApiResponse registerUser(@RequestBody UserDto.RegisterUserDto dto); @Operation(summary = "[Admin] User 찾기 ", description = "ID를 기반으로 해당 사용자를 찾습니다.") diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java index e8a70d9..78971dc 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/converter/UserConverter.java @@ -12,6 +12,8 @@ public static UserDto.ResponseUserDto toDto(User user) { .phoneNumber(user.getPhoneNumber()) .lastLoginAt(user.getLastLoginAt()) .gender(user.getGender()) + .region(user.getRegion()) + .mobileCarrier(user.getMobileCarrier()) // .consumptionPattern(user.getConsumptionPattern()) // .photoUrl(user.getPhotoUrl()) .email(user.getEmail()) @@ -25,8 +27,10 @@ public static User toUser(UserDto.RegisterUserDto dto) { .email(dto.getEmail()) .age(dto.getAge()) .name(dto.getName()) -// .consumptionPattern(dto.getConsumptionPattern()) + .region(dto.getRegion()) + .mobileCarrier(dto.getMobileCarrier()) .gender(dto.getGender()) +// .consumptionPattern(dto.getConsumptionPattern()) // .photoUrl(dto.getPhotoUrl()) .build(); } diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java index 449178b..6277440 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java @@ -19,10 +19,12 @@ public static class RegisterUserDto { private String name; @Min(value = 1, message = "나이는 0또는 음수가 될 수 없습니다.") private Integer age; + private String mobileCarrier; + private String region; private Gender gender; private String email; - private String photoUrl; - private String consumptionPattern; +// private String photoUrl; +// private String consumptionPattern; } @Getter @@ -33,9 +35,11 @@ public static class ResponseUserDto { private String name; private String email; private Integer age; + private String mobileCarrier; + private String region; private Gender gender; - private String photoUrl; - private String consumptionPattern; +// private String photoUrl; +// private String consumptionPattern; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime lastLoginAt; } diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/entity/User.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/entity/User.java index d0ddf03..f1baa2d 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/entity/User.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/entity/User.java @@ -42,9 +42,12 @@ public class User extends BaseEntity { @Column(nullable = false, length = 50, unique = true) private String email; - @Column(nullable = false) + @Column(nullable = true) private String mobileCarrier; // 통신사 + @Column(nullable = true) + private String region; // 거주지 + private LocalDateTime lastLoginAt; public void changeUserDate(String email, String name) { From 53c3268efb0623cbc08b3bc8450ff3c8cdd5b58a Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:17:39 +0900 Subject: [PATCH 04/13] =?UTF-8?q?[refactor]=20User=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EC=8B=9C=20=ED=95=84=EC=9A=94=EC=97=86=EB=8A=94=20photoUrl,=20?= =?UTF-8?q?consumptionPattern=20=EC=A3=BC=EC=84=9D=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/discountinfo/service/DiscountInfoServiceTest.java | 2 -- .../domain/supportinfo/service/SupportInfoServiceTest.java | 4 ++-- .../domain/user/repository/UserRepositoryTest.java | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/bbteam/budgetbuddies/domain/discountinfo/service/DiscountInfoServiceTest.java b/src/test/java/com/bbteam/budgetbuddies/domain/discountinfo/service/DiscountInfoServiceTest.java index c151494..119a69d 100644 --- a/src/test/java/com/bbteam/budgetbuddies/domain/discountinfo/service/DiscountInfoServiceTest.java +++ b/src/test/java/com/bbteam/budgetbuddies/domain/discountinfo/service/DiscountInfoServiceTest.java @@ -173,8 +173,6 @@ void toggleLikeTest() { .age(30) .gender(Gender.MALE) .email("john.doe@example.com") - .photoUrl("http://example.com/photo.jpg") - .consumptionPattern("Regular") .lastLoginAt(LocalDateTime.now()) .build(); diff --git a/src/test/java/com/bbteam/budgetbuddies/domain/supportinfo/service/SupportInfoServiceTest.java b/src/test/java/com/bbteam/budgetbuddies/domain/supportinfo/service/SupportInfoServiceTest.java index fe2ff8a..4d8fd68 100644 --- a/src/test/java/com/bbteam/budgetbuddies/domain/supportinfo/service/SupportInfoServiceTest.java +++ b/src/test/java/com/bbteam/budgetbuddies/domain/supportinfo/service/SupportInfoServiceTest.java @@ -166,8 +166,8 @@ void toggleLikeTest() { .age(30) .gender(Gender.MALE) .email("john.doe@example.com") - .photoUrl("http://example.com/photo.jpg") - .consumptionPattern("Regular") +// .photoUrl("http://example.com/photo.jpg") +// .consumptionPattern("Regular") .lastLoginAt(LocalDateTime.now()) .build(); diff --git a/src/test/java/com/bbteam/budgetbuddies/domain/user/repository/UserRepositoryTest.java b/src/test/java/com/bbteam/budgetbuddies/domain/user/repository/UserRepositoryTest.java index f89b41b..7fa143f 100644 --- a/src/test/java/com/bbteam/budgetbuddies/domain/user/repository/UserRepositoryTest.java +++ b/src/test/java/com/bbteam/budgetbuddies/domain/user/repository/UserRepositoryTest.java @@ -30,8 +30,8 @@ void saveUser() { .age(25) .gender(Gender.MALE) .email("hong@naver.com") - .photoUrl("abc") - .consumptionPattern("TypeA") +// .photoUrl("abc") +// .consumptionPattern("TypeA") .lastLoginAt(LocalDateTime.now()) .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) From e31be7c025edf7c5ca956158463265f8186ab48a Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:19:51 +0900 Subject: [PATCH 05/13] =?UTF-8?q?[feat]=20hashtagId=20Dto=ED=99=94?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/controller/UserApi.java | 15 ++++++++------- .../budgetbuddies/domain/user/dto/UserDto.java | 2 ++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java index 47550d2..0922fb8 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserApi.java @@ -30,13 +30,14 @@ public interface UserApi { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), }) @Parameters({ - @Parameter(name = "phoneNumber", description = "휴대폰 번호. requestBody"), - @Parameter(name = "name", description = "사용자 이름. requestBody"), - @Parameter(name = "age", description = "사용자 나이. requestBody"), - @Parameter(name = "mobileCarrier", description = "통신사. requestBody"), - @Parameter(name = "region", description = "지역. requestBody"), - @Parameter(name = "gender", description = "사용자 성별 / MALE, FEMALE, NONE requestBody"), - @Parameter(name = "email", description = "메일 주소. requestBody"), + @Parameter(name = "phoneNumber", description = "휴대폰 번호"), + @Parameter(name = "name", description = "사용자 이름"), + @Parameter(name = "age", description = "사용자 나이"), + @Parameter(name = "mobileCarrier", description = "통신사"), + @Parameter(name = "region", description = "지역"), + @Parameter(name = "gender", description = "사용자 성별 / MALE, FEMALE, NONE"), + @Parameter(name = "email", description = "메일 주소"), + @Parameter(name = "hashtagIds", description = "사용자가 선택한 해시태그 ID 리스트(제공되는 리스트 기반으로 Id 매칭 필요(통신사, 지역 포함))") // @Parameter(name = "photoUrl", description = "사진 Url. 아마 사용 x requestBody"), // @Parameter(name = "consumptionPattern", description = "소비 패턴. 아마 사용 x requestBody") }) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java index 6277440..8bcc83e 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/dto/UserDto.java @@ -8,6 +8,7 @@ import org.hibernate.validator.constraints.Length; import java.time.LocalDateTime; +import java.util.List; public class UserDto { @@ -23,6 +24,7 @@ public static class RegisterUserDto { private String region; private Gender gender; private String email; + private List hashtagIds; // 사용자가 선택한 해시태그 ID 목록 // private String photoUrl; // private String consumptionPattern; } From c6ca2d37a2b66b280d26649cc0aa23d32c42de96 Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:20:42 +0900 Subject: [PATCH 06/13] =?UTF-8?q?[refactor]=20hashtag=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=84=EC=86=A1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20controller=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/controller/UserController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserController.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserController.java index 6d49ba8..93fad05 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserController.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/controller/UserController.java @@ -28,6 +28,12 @@ public ResponseEntity> createConsumptionGoals( @PostMapping("/register") public ApiResponse registerUser(@RequestBody UserDto.RegisterUserDto dto) { + // 유저 정보 저장 + UserDto.ResponseUserDto savedUser = userService.saveUser(dto); + + // 유저가 선택한 해시태그를 저장 + userService.saveFavoriteHashtags(savedUser.getId(), dto.getHashtagIds()); + return ApiResponse.onSuccess(userService.saveUser(dto)); } From 7c541142dc021f5dc0cca1a38cb923776cb9c073 Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:21:52 +0900 Subject: [PATCH 07/13] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20API=EC=97=90=20=ED=95=B4=EC=8B=9C=ED=83=9C=EA=B7=B8?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/service/UserService.java | 2 ++ .../domain/user/service/UserServiceImpl.java | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserService.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserService.java index 0cb29db..f9e3ffa 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserService.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserService.java @@ -7,6 +7,8 @@ public interface UserService { List createConsumptionGoalWithDefaultGoals(Long userId); + void saveFavoriteHashtags(Long userId, List hashtagIds); + UserDto.ResponseUserDto saveUser(UserDto.RegisterUserDto dto); UserDto.ResponseUserDto findUser(Long userId); diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserServiceImpl.java b/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserServiceImpl.java index 2ce9dbb..8dbe683 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserServiceImpl.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/user/service/UserServiceImpl.java @@ -6,6 +6,10 @@ import com.bbteam.budgetbuddies.domain.consumptiongoal.dto.UserConsumptionGoalResponse; import com.bbteam.budgetbuddies.domain.consumptiongoal.entity.ConsumptionGoal; import com.bbteam.budgetbuddies.domain.consumptiongoal.repository.ConsumptionGoalRepository; +import com.bbteam.budgetbuddies.domain.favoritehashtag.entity.FavoriteHashtag; +import com.bbteam.budgetbuddies.domain.favoritehashtag.repository.FavoriteHashtagRepository; +import com.bbteam.budgetbuddies.domain.hashtag.entity.Hashtag; +import com.bbteam.budgetbuddies.domain.hashtag.repository.HashtagRepository; import com.bbteam.budgetbuddies.domain.user.converter.UserConverter; import com.bbteam.budgetbuddies.domain.user.dto.UserDto; import com.bbteam.budgetbuddies.domain.user.entity.User; @@ -28,6 +32,8 @@ public class UserServiceImpl implements UserService { private final CategoryRepository categoryRepository; private final ConsumptionGoalRepository consumptionGoalRepository; private final ConsumptionGoalConverter consumptionGoalConverter; + private final HashtagRepository hashtagRepository; + private final FavoriteHashtagRepository favoriteHashtagRepository; @Override @Transactional @@ -53,6 +59,26 @@ public List createConsumptionGoalWithDefaultGoals(L .collect(Collectors.toList()); } + @Override + @Transactional + public void saveFavoriteHashtags(Long userId, List hashtagIds) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new NoSuchElementException("User not found")); + + List favoriteHashtags = hashtagIds.stream() + .map(hashtagId -> { + Hashtag hashtag = hashtagRepository.findById(hashtagId) + .orElseThrow(() -> new NoSuchElementException("Hashtag not found")); + return FavoriteHashtag.builder() + .user(user) + .hashtag(hashtag) + .build(); + }) + .collect(Collectors.toList()); + + favoriteHashtagRepository.saveAll(favoriteHashtags); + } + @Override @Transactional public UserDto.ResponseUserDto saveUser(UserDto.RegisterUserDto dto) { From 8b8ab14b36d71450f0fabe5aa97b69596aac8a52 Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:25:28 +0900 Subject: [PATCH 08/13] =?UTF-8?q?[feat]=20=ED=95=A0=EC=9D=B8=EC=A0=95?= =?UTF-8?q?=EB=B3=B4,=20=EC=A7=80=EC=9B=90=EC=A0=95=EB=B3=B4=20id=20->=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EC=A0=95=EB=B3=B4=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=83=9C=EA=B7=B8=EB=A5=BC=20=EB=B3=B4=EC=9C=A0?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?id=20response=ED=95=98=EB=8A=94=20api=20=EC=97=94=EB=93=9C?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FavoriteHashtagApi.java | 27 +++++++++++++++++++ .../controller/FavoriteHashtagController.java | 27 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagApi.java create mode 100644 src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagController.java diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagApi.java b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagApi.java new file mode 100644 index 0000000..40011d8 --- /dev/null +++ b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagApi.java @@ -0,0 +1,27 @@ +package com.bbteam.budgetbuddies.domain.favoritehashtag.controller; + +import com.bbteam.budgetbuddies.apiPayload.ApiResponse; +import com.bbteam.budgetbuddies.domain.favoritehashtag.dto.FavoriteHashtagResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +public interface FavoriteHashtagApi { + + @Operation(summary = "[User] 해당되는 해시태그를 설정한 유저 조회 API", description = "특정 할인정보 또는 지원정보에 등록된 해시태그를 설정한 유저를 조회합니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), + }) + @Parameters({ + @Parameter(name = "discountInfoId", description = "조회할 할인정보 ID", required = false), + @Parameter(name = "supportInfoId", description = "조회할 지원정보 ID", required = false), + }) + ApiResponse> getUsersByHashtags( + @RequestParam(required = false) Long discountInfoId, + @RequestParam(required = false) Long supportInfoId + ); +} diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagController.java b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagController.java new file mode 100644 index 0000000..7e56784 --- /dev/null +++ b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagController.java @@ -0,0 +1,27 @@ +package com.bbteam.budgetbuddies.domain.favoritehashtag.controller; + +import com.bbteam.budgetbuddies.apiPayload.ApiResponse; +import com.bbteam.budgetbuddies.domain.favoritehashtag.dto.FavoriteHashtagResponseDto; +import com.bbteam.budgetbuddies.domain.favoritehashtag.service.FavoriteHashtagService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/favoriteHashtags") +public class FavoriteHashtagController implements FavoriteHashtagApi { + + private final FavoriteHashtagService favoriteHashtagService; + + @Override + @GetMapping("/applicable-users") + public ApiResponse> getUsersByHashtags( + @RequestParam(required = false) Long discountInfoId, + @RequestParam(required = false) Long supportInfoId + ) { + List users = favoriteHashtagService.findUsersByHashtag(discountInfoId, supportInfoId); + return ApiResponse.onSuccess(users); + } +} From 45728d63eddfc9f4e82b354c4ba293d18287fb4b Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:25:54 +0900 Subject: [PATCH 09/13] =?UTF-8?q?[feat]=20response=EC=97=90=20=EB=93=A4?= =?UTF-8?q?=EC=96=B4=EA=B0=88=20userId=EB=A5=BC=20=ED=8F=AC=ED=95=A8?= =?UTF-8?q?=ED=95=9C=20Dto=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/FavoriteHashtagResponseDto.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/dto/FavoriteHashtagResponseDto.java diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/dto/FavoriteHashtagResponseDto.java b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/dto/FavoriteHashtagResponseDto.java new file mode 100644 index 0000000..4eec929 --- /dev/null +++ b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/dto/FavoriteHashtagResponseDto.java @@ -0,0 +1,16 @@ +package com.bbteam.budgetbuddies.domain.favoritehashtag.dto; + +import com.bbteam.budgetbuddies.domain.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor + +public class FavoriteHashtagResponseDto { + private Long userId; + + public FavoriteHashtagResponseDto(User user) { + this.userId = user.getId(); + } +} From d9a6fe0d6965e3df03bdfbdc4a98f9178c85208c Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:26:44 +0900 Subject: [PATCH 10/13] =?UTF-8?q?[feat]=20userId=EB=A1=9C=20user=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8F=84=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/discountinfo/entity/DiscountInfo.java | 6 ++++++ .../domain/supportinfo/entity/SupportInfo.java | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/discountinfo/entity/DiscountInfo.java b/src/main/java/com/bbteam/budgetbuddies/domain/discountinfo/entity/DiscountInfo.java index 9115323..ccbed0f 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/discountinfo/entity/DiscountInfo.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/discountinfo/entity/DiscountInfo.java @@ -64,4 +64,10 @@ public void update(DiscountRequest.UpdateDiscountDto discountRequestDto) { this.isInCalendar = discountRequestDto.getIsInCalendar(); } + public static DiscountInfo withId(Long id) { + DiscountInfo discountInfo = new DiscountInfo(); + discountInfo.setId(id); + return discountInfo; + } + } diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/supportinfo/entity/SupportInfo.java b/src/main/java/com/bbteam/budgetbuddies/domain/supportinfo/entity/SupportInfo.java index 57152c0..bcc21a4 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/supportinfo/entity/SupportInfo.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/supportinfo/entity/SupportInfo.java @@ -60,5 +60,9 @@ public void update(SupportRequest.UpdateSupportDto supportRequestDto) { this.thumbnailUrl = supportRequestDto.getThumbnailUrl(); this.isInCalendar = supportRequestDto.getIsInCalendar(); } - + public static SupportInfo withId(Long id) { + SupportInfo supportInfo = new SupportInfo(); + supportInfo.setId(id); + return supportInfo; + } } From bcaf5d09128063c029ea470f9a1e6af86a8fd96c Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:27:23 +0900 Subject: [PATCH 11/13] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=A0=88=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FavoriteHashtagRepository.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/repository/FavoriteHashtagRepository.java b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/repository/FavoriteHashtagRepository.java index 2d8135a..1d7dd47 100644 --- a/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/repository/FavoriteHashtagRepository.java +++ b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/repository/FavoriteHashtagRepository.java @@ -1,9 +1,13 @@ package com.bbteam.budgetbuddies.domain.favoritehashtag.repository; import com.bbteam.budgetbuddies.domain.favoritehashtag.entity.FavoriteHashtag; +import com.bbteam.budgetbuddies.domain.user.entity.User; import org.springframework.data.jpa.repository.JpaRepository; -public interface FavoriteHashtagRepository extends JpaRepository { +import java.util.List; +public interface FavoriteHashtagRepository extends JpaRepository { + List findByUser(User user); -} + List findByHashtagIdIn(List hashtagIds); +} \ No newline at end of file From 5d896fa3dd3c65782f17fc6d05f60ae7723568c3 Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:27:48 +0900 Subject: [PATCH 12/13] =?UTF-8?q?[feat]=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/FavoriteHashtagService.java | 12 +++ .../service/FavoriteHashtagServiceImpl.java | 76 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagService.java create mode 100644 src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceImpl.java diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagService.java b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagService.java new file mode 100644 index 0000000..1945a5e --- /dev/null +++ b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagService.java @@ -0,0 +1,12 @@ +package com.bbteam.budgetbuddies.domain.favoritehashtag.service; + +import com.bbteam.budgetbuddies.domain.favoritehashtag.dto.FavoriteHashtagResponseDto; + +import java.util.List; + +public interface FavoriteHashtagService { + List getUsersForHashtag(Long discountInfoId, Long supportInfoId); + + List findUsersByHashtag(Long discountInfoId, Long supportInfoId); + +} \ No newline at end of file diff --git a/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceImpl.java b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceImpl.java new file mode 100644 index 0000000..8f336b8 --- /dev/null +++ b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceImpl.java @@ -0,0 +1,76 @@ +package com.bbteam.budgetbuddies.domain.favoritehashtag.service; + +import com.bbteam.budgetbuddies.domain.connectedinfo.entity.ConnectedInfo; +import com.bbteam.budgetbuddies.domain.connectedinfo.repository.ConnectedInfoRepository; +import com.bbteam.budgetbuddies.domain.discountinfo.entity.DiscountInfo; +import com.bbteam.budgetbuddies.domain.favoritehashtag.dto.FavoriteHashtagResponseDto; +import com.bbteam.budgetbuddies.domain.favoritehashtag.entity.FavoriteHashtag; +import com.bbteam.budgetbuddies.domain.favoritehashtag.repository.FavoriteHashtagRepository; +import com.bbteam.budgetbuddies.domain.supportinfo.entity.SupportInfo; +import com.bbteam.budgetbuddies.domain.user.entity.User; +import com.bbteam.budgetbuddies.domain.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class FavoriteHashtagServiceImpl implements FavoriteHashtagService { + + private final ConnectedInfoRepository connectedInfoRepository; + private final FavoriteHashtagRepository favoriteHashtagRepository; + private final UserRepository userRepository; + + @Override + public List getUsersForHashtag(Long discountInfoId, Long supportInfoId) { + List connectedInfos; + + if (discountInfoId != null) { + DiscountInfo discountInfo = DiscountInfo.withId(discountInfoId); + connectedInfos = connectedInfoRepository.findAllByDiscountInfo(discountInfo); + } else if (supportInfoId != null) { + SupportInfo supportInfo = SupportInfo.withId(supportInfoId); + connectedInfos = connectedInfoRepository.findAllBySupportInfo(supportInfo); + } else { + throw new IllegalArgumentException("discountInfoId 또는 supportInfoId 중 하나는 필수입니다."); + } + + List hashtagIds = connectedInfos.stream() + .map(connectedInfo -> connectedInfo.getHashtag().getId()) + .collect(Collectors.toList()); + System.out.println("Connected Hashtags IDs: " + hashtagIds); + + + List favoriteHashtags = favoriteHashtagRepository.findByHashtagIdIn(hashtagIds); + System.out.println("Favorite Hashtags: " + favoriteHashtags); + + return favoriteHashtags.stream() + .map(favoriteHashtag -> favoriteHashtag.getUser().getId()) + .distinct() + .collect(Collectors.toList()); + } + + @Override + public List findUsersByHashtag(Long discountInfoId, Long supportInfoId) { + List userIds = getUsersForHashtag(discountInfoId, supportInfoId); + + return userIds.stream() + .map(userId -> { + Optional optionalUser = userRepository.findById(userId); + optionalUser.ifPresent(user -> System.out.println("User found: " + user)); // 여기에 추가 + return optionalUser.map(FavoriteHashtagResponseDto::new) + .orElseGet(() -> { + System.out.println("User not found with id: " + userId); + return null; + }); + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } +} From 7f02e61fd54c3adadc729f272977580de86ef3e8 Mon Sep 17 00:00:00 2001 From: ryogaeng Date: Mon, 14 Oct 2024 18:27:57 +0900 Subject: [PATCH 13/13] =?UTF-8?q?[feat]=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/FavoriteHashtagServiceTest.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/test/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceTest.java diff --git a/src/test/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceTest.java b/src/test/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceTest.java new file mode 100644 index 0000000..4919505 --- /dev/null +++ b/src/test/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceTest.java @@ -0,0 +1,100 @@ +package com.bbteam.budgetbuddies.domain.favoritehashtag.service; + +import com.bbteam.budgetbuddies.domain.connectedinfo.entity.ConnectedInfo; +import com.bbteam.budgetbuddies.domain.connectedinfo.repository.ConnectedInfoRepository; +import com.bbteam.budgetbuddies.domain.discountinfo.entity.DiscountInfo; +import com.bbteam.budgetbuddies.domain.discountinfo.repository.DiscountInfoRepository; +import com.bbteam.budgetbuddies.domain.favoritehashtag.dto.FavoriteHashtagResponseDto; +import com.bbteam.budgetbuddies.domain.favoritehashtag.entity.FavoriteHashtag; +import com.bbteam.budgetbuddies.domain.favoritehashtag.repository.FavoriteHashtagRepository; +import com.bbteam.budgetbuddies.domain.hashtag.entity.Hashtag; +import com.bbteam.budgetbuddies.domain.hashtag.repository.HashtagRepository; +import com.bbteam.budgetbuddies.domain.user.entity.User; +import com.bbteam.budgetbuddies.domain.user.repository.UserRepository; +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.test.context.ActiveProfiles; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@ActiveProfiles("test") +public class FavoriteHashtagServiceTest { + + @Autowired + private FavoriteHashtagRepository favoriteHashtagRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private HashtagRepository hashtagRepository; + + @Autowired + private FavoriteHashtagService favoriteHashtagService; + + @Autowired + private ConnectedInfoRepository connectedInfoRepository; + + @Autowired + private DiscountInfoRepository discountInfoRepository; + + private User user; + private Hashtag hashtag; + private DiscountInfo discountInfo; + + @BeforeEach + void setUp() { + // 데이터 초기화 + connectedInfoRepository.deleteAll(); + favoriteHashtagRepository.deleteAll(); + discountInfoRepository.deleteAll(); + hashtagRepository.deleteAll(); + userRepository.deleteAll(); + + // Given: 사용자와 해시태그, 할인정보를 생성 + user = userRepository.save(User.builder() + .phoneNumber("01012345678") + .name("Test User") + .age(25) + .email("test1@example.com") + .build()); + + hashtag = hashtagRepository.save(new Hashtag("식비")); + discountInfo = discountInfoRepository.save(DiscountInfo.withId(1L)); + + favoriteHashtagRepository.save(FavoriteHashtag.builder().user(user).hashtag(hashtag).build()); + + connectedInfoRepository.save(ConnectedInfo.builder() + .discountInfo(discountInfo) + .hashtag(hashtag) + .build()); + } + + @Test + void testSaveFavoriteHashtags() { + // When: 사용자가 관심 있는 해시태그를 선택하여 저장함 + FavoriteHashtag favorite1 = FavoriteHashtag.builder().user(user).hashtag(hashtag).build(); + favoriteHashtagRepository.save(favorite1); + + // Then: FavoriteHashtag에 잘 저장되었는지 검증 + List favorites = favoriteHashtagRepository.findByUser(user); + assertThat(favorites).hasSize(1); + assertThat(favorites).extracting(fav -> fav.getHashtag().getName()) + .containsExactly("식비"); + } + + @Test + void testFindUsersByHashtagForDiscountInfo() { + // When: 할인정보에 연결된 해시태그를 기반으로 사용자를 조회 + List userResponses = favoriteHashtagService.findUsersByHashtag(discountInfo.getId(), hashtag.getId()); + + // Then: 해당 해시태그를 가진 유저가 응답되는지 확인 + assertThat(userResponses).hasSize(1); + assertThat(userResponses.get(0).getUserId()).isEqualTo(user.getId()); + } +}