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 91153236..ccbed0f5 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/favoritehashtag/controller/FavoriteHashtagApi.java b/src/main/java/com/bbteam/budgetbuddies/domain/favoritehashtag/controller/FavoriteHashtagApi.java new file mode 100644 index 00000000..40011d83 --- /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 00000000..7e567845 --- /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); + } +} 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 00000000..4eec9293 --- /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(); + } +} 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 2d8135a8..1d7dd47f 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 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 00000000..1945a5e7 --- /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 00000000..8f336b80 --- /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()); + } +} 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 57152c04..bcc21a4d 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; + } } 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 901f97fb..0922fb8d 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, 성공"), }) @@ -30,13 +30,16 @@ 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 = "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 = "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") }) ApiResponse registerUser(@RequestBody UserDto.RegisterUserDto dto); @Operation(summary = "[Admin] User 찾기 ", description = "ID를 기반으로 해당 사용자를 찾습니다.") 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 6d49ba8b..93fad058 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)); } 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 a1df84e1..78971dc5 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,10 @@ 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()) .age(user.getAge()) .build(); @@ -23,7 +27,11 @@ public static User toUser(UserDto.RegisterUserDto dto) { .email(dto.getEmail()) .age(dto.getAge()) .name(dto.getName()) + .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 55312f17..fe41208e 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 { @@ -19,10 +20,13 @@ 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 List hashtagIds; // 사용자가 선택한 해시태그 ID 목록 +// private String photoUrl; +// private String consumptionPattern; } @Getter @@ -33,9 +37,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 beb6688b..4fc48bda 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,10 +42,14 @@ public class User extends BaseEntity { @Column(nullable = false, length = 50, unique = true) private String email; - @Column(nullable = false) - private String mobileCarrier; // 통신사 + @Column(nullable = true) + private String mobileCarrier; // 통신사 + + @Column(nullable = true) + private String region; // 거주지 + + private LocalDateTime lastLoginAt; - private LocalDateTime lastLoginAt; public void changeUserDate(String email, String name) { this.name = name; 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 ac0d046b..a4457ba9 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 @@ -8,6 +8,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 6b9bb191..7fad61d6 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) { 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 c1514941..119a69da 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/favoritehashtag/service/FavoriteHashtagServiceTest.java b/src/test/java/com/bbteam/budgetbuddies/domain/favoritehashtag/service/FavoriteHashtagServiceTest.java new file mode 100644 index 00000000..49195057 --- /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()); + } +} 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 fe2ff8a0..4d8fd68e 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 f89b41ba..7fa143f9 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())