diff --git a/src/main/java/umc7th/bulk/group/entity/Group.java b/src/main/java/umc7th/bulk/group/entity/Group.java index d93573e..d83e19b 100644 --- a/src/main/java/umc7th/bulk/group/entity/Group.java +++ b/src/main/java/umc7th/bulk/group/entity/Group.java @@ -3,8 +3,10 @@ import jakarta.persistence.*; import lombok.*; import umc7th.bulk.global.BaseTimeEntity; +import umc7th.bulk.user.domain.User; import java.time.LocalDateTime; +import java.util.List; @Entity @Getter @@ -28,6 +30,21 @@ public class Group extends BaseTimeEntity { private LocalDateTime endDate; + @OneToMany(mappedBy = "group", fetch = FetchType.LAZY) + private List members; + + public boolean isFull() { + return members != null & members.size() >= 10; + } + + public void addMember(User user) { + if (isFull()) { + throw new RuntimeException("그룹이 이미 가득 찼습니다."); + } + members.add(user); + user.setGroup(this); + } + public Group(String groupName, int currentStage, LocalDateTime endDate) { this.groupName = groupName; this.currentStage = currentStage; diff --git a/src/main/java/umc7th/bulk/group/repository/GroupRepository.java b/src/main/java/umc7th/bulk/group/repository/GroupRepository.java index 80517fa..6e5bd7d 100644 --- a/src/main/java/umc7th/bulk/group/repository/GroupRepository.java +++ b/src/main/java/umc7th/bulk/group/repository/GroupRepository.java @@ -1,7 +1,14 @@ package umc7th.bulk.group.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import umc7th.bulk.group.entity.Group; +import java.util.Optional; + public interface GroupRepository extends JpaRepository { + + // 그룹 인원 수가 10 이하인 그룹 찾는 메서드, 없으면 새로 생성 + @Query("SELECT g FROM Group g WHERE SIZE(g.members) < 10 ORDER BY g.groupId ASC") + Optional findGroupWithSpace(); } diff --git a/src/main/java/umc7th/bulk/user/config/KakaoOAuth2Config.java b/src/main/java/umc7th/bulk/user/config/KakaoOAuth2Config.java index eaafd35..8a86488 100644 --- a/src/main/java/umc7th/bulk/user/config/KakaoOAuth2Config.java +++ b/src/main/java/umc7th/bulk/user/config/KakaoOAuth2Config.java @@ -13,9 +13,9 @@ //@ConfigurationProperties(prefix = "spring.security.oauth2.client.registration.kakao") public class KakaoOAuth2Config { - private String clientId = "9555ae675b3e27488bd10e7f09ea12bd"; + private String clientId; - private String clientSecret = "V1LPr6eQPAHRTKIcmeXczG63dkdlaUrF"; + private String clientSecret; - private String redirectUri = "https://bulkapp.site/home"; + private String redirectUri; } diff --git a/src/main/java/umc7th/bulk/user/domain/User.java b/src/main/java/umc7th/bulk/user/domain/User.java index 04d4250..cf5cbdb 100644 --- a/src/main/java/umc7th/bulk/user/domain/User.java +++ b/src/main/java/umc7th/bulk/user/domain/User.java @@ -157,4 +157,14 @@ public void updateGoalNutrition(MealPlanRequestDTO.TargetNutritionDTO targetNutr this.BMR = targetNutritionDTO.getBmr(); this.TDEE = targetNutritionDTO.getTdee(); } + + public void setGroup(Group group) { + if (this.group != null) { + this.group.getMembers().remove(this); + } + this.group = group; + if (!group.getMembers().contains(this)) { + group.getMembers().add(this); + } + } } diff --git a/src/main/java/umc7th/bulk/user/service/UserService.java b/src/main/java/umc7th/bulk/user/service/UserService.java index bcdbdec..1aa0cf5 100644 --- a/src/main/java/umc7th/bulk/user/service/UserService.java +++ b/src/main/java/umc7th/bulk/user/service/UserService.java @@ -15,6 +15,8 @@ import umc7th.bulk.character.repository.BulkCharacterRepository; import umc7th.bulk.global.error.GeneralErrorCode; import umc7th.bulk.global.error.exception.CustomException; +import umc7th.bulk.group.entity.Group; +import umc7th.bulk.group.repository.GroupRepository; import umc7th.bulk.user.annotation.CurrentUser; import umc7th.bulk.user.domain.User; import umc7th.bulk.user.exception.UserErrorCode; @@ -22,6 +24,8 @@ import umc7th.bulk.user.principal.PrincipalDetails; import umc7th.bulk.user.repository.UserRepository; +import java.time.LocalDateTime; + import static umc7th.bulk.user.dto.UserDTO.*; @Service @@ -32,6 +36,7 @@ public class UserService { private final WebClient webClient; private final OAuth2AuthorizedClientService authorizedClientService; private final BulkCharacterRepository bulkCharacterRepository; + private final GroupRepository groupRepository; private static final String UNLINK_URL = "https://kapi.kakao.com/v1/user/unlink"; @@ -54,6 +59,16 @@ public User saveUser(String kakaoId, String email, String gender, String birthye .build(); bulkCharacterRepository.save(bulkCharacter); + // 기존 그룹 중 10명 미만인 그룹 찾기 (없으면 새 그룹 생성) + Group group = groupRepository.findGroupWithSpace().orElseGet(() -> { + Group newGroup = Group.builder() + .groupName("Group_" + System.currentTimeMillis()) // 유니크한 그룹 이름 생성 + .currentStage(1) + .endDate(LocalDateTime.now().plusDays(7)) // 그룹 종료일 7일 후 설정 + .build(); + return groupRepository.save(newGroup); + }); + User user = User.builder() .kakaoId(kakaoId) .email(email) @@ -67,8 +82,11 @@ public User saveUser(String kakaoId, String email, String gender, String birthye .curCarbos(0L) .curProteins(0L) .curFats(0L) + .group(group) .build(); + group.addMember(user); + return userRepository.save(user); } diff --git a/src/main/java/umc7th/bulk/user/service/command/UserCommandServiceImpl.java b/src/main/java/umc7th/bulk/user/service/command/UserCommandServiceImpl.java index fb7c441..b86360d 100644 --- a/src/main/java/umc7th/bulk/user/service/command/UserCommandServiceImpl.java +++ b/src/main/java/umc7th/bulk/user/service/command/UserCommandServiceImpl.java @@ -7,6 +7,8 @@ import umc7th.bulk.character.entity.BulkCharacter; import umc7th.bulk.character.repository.BulkCharacterRepository; import umc7th.bulk.global.jwt.util.JwtProvider; +import umc7th.bulk.group.entity.Group; +import umc7th.bulk.group.repository.GroupRepository; import umc7th.bulk.user.domain.User; import umc7th.bulk.user.dto.UserRequestDTO; import umc7th.bulk.user.dto.UserResponseDTO; @@ -15,6 +17,8 @@ import umc7th.bulk.user.exception.UserException; import umc7th.bulk.user.repository.UserRepository; +import java.time.LocalDateTime; + @Slf4j @Service @@ -25,6 +29,7 @@ public class UserCommandServiceImpl implements UserCommandService { private final PasswordEncoder encoder; private final JwtProvider jwtProvider; private final BulkCharacterRepository bulkCharacterRepository; + private final GroupRepository groupRepository; @Override public UserResponseDTO.UserTokenDTO signup(UserRequestDTO.SignupDTO dto) { @@ -57,6 +62,18 @@ public UserResponseDTO.UserTokenDTO signup(UserRequestDTO.SignupDTO dto) { .build(); bulkCharacterRepository.save(bulkCharacter); + // 기존 그룹 중 10명 미만인 그룹 찾기 (없으면 새 그룹 생성) + Group group = groupRepository.findGroupWithSpace().orElseGet(() -> { + Group newGroup = Group.builder() + .groupName("Group_" + System.currentTimeMillis()) // 유니크한 그룹 이름 생성 + .currentStage(1) + .endDate(LocalDateTime.now().plusDays(7)) // 그룹 종료일 7일 후 설정 + .build(); + return groupRepository.save(newGroup); + }); + + + // User 저장 (BulkCharacter 포함) User user = User.builder() .email(emailKey) @@ -64,6 +81,8 @@ public UserResponseDTO.UserTokenDTO signup(UserRequestDTO.SignupDTO dto) { .accessToken(accessToken) .refreshToken(refreshToken) .bulkCharacter(bulkCharacter) // 🔥 BulkCharacter 설정 + .recordComplete(false) + .group(group) .build(); try {