diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java index cee661a..90cd8ed 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java @@ -1,5 +1,6 @@ package MathCaptain.weakness; +import MathCaptain.weakness.domain.Group.dto.request.GroupCreateRequest; import MathCaptain.weakness.domain.Group.entity.Group; import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; import MathCaptain.weakness.domain.Group.enums.CategoryStatus; @@ -95,35 +96,18 @@ public void init() { .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")); /// 테스트 그룹 생성 - Group group1 = Group.builder() - .name("testGroup1") - .category(CategoryStatus.STUDY) - .minDailyHours(2) - .minWeeklyDays(3) - .groupPoint(0L) - .hashtags(null) - .groupImageUrl("test") - .build(); + GroupCreateRequest groupCreateRequest1 = GroupCreateRequest.of(users1.getUserId(), "testGroup1", + CategoryStatus.STUDY, 2, 3, 0L, null, "test1", 3, 4); - Group group2 = Group.builder() - .name("testGroup2") - .category(CategoryStatus.FITNESS) - .minDailyHours(2) - .minWeeklyDays(3) - .groupPoint(0L) - .hashtags(null) - .groupImageUrl("test1") - .build(); + GroupCreateRequest groupCreateRequest2 = GroupCreateRequest.of(users1.getUserId(), "testGroup2", + CategoryStatus.FITNESS, 2, 3, 0L, null, "test2", 3, 4); - Group group3 = Group.builder() - .name("testGroup3") - .category(CategoryStatus.READING) - .minDailyHours(2) - .minWeeklyDays(3) - .groupPoint(0L) - .hashtags(null) - .groupImageUrl("test3") - .build(); + GroupCreateRequest groupCreateRequest3 = GroupCreateRequest.of(users1.getUserId(), "testGroup3", + CategoryStatus.READING, 2, 3, 0L, null, "test3", 3, 4); + + Group group1 = Group.of(groupCreateRequest1); + Group group2 = Group.of(groupCreateRequest2); + Group group3 = Group.of(groupCreateRequest3); groupRepository.save(group1); groupRepository.save(group2); @@ -136,7 +120,6 @@ public void init() { group3.updateWeeklyGoalAchieveMap(DayOfWeek.FRIDAY, 10); group3.updateWeeklyGoalAchieveMap(DayOfWeek.SATURDAY, 1); group3.updateWeeklyGoalAchieveMap(DayOfWeek.SUNDAY, 0); - groupRepository.save(group3); log.info("======== 👥 테스트 그룹 생성 완료 ========="); diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupController.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupController.java index 62aeba8..b341754 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupController.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupController.java @@ -1,15 +1,15 @@ package MathCaptain.weakness.domain.Group.controller; -import MathCaptain.weakness.domain.Group.dto.request.GroupSearchRequestDto; -import MathCaptain.weakness.domain.Group.dto.request.GroupUpdateRequestDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupDetailResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupMemberListResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.RelationResponseDto; +import MathCaptain.weakness.domain.Group.dto.request.GroupSearchRequest; +import MathCaptain.weakness.domain.Group.dto.request.GroupUpdateRequest; +import MathCaptain.weakness.domain.Group.dto.response.GroupDetailResponse; +import MathCaptain.weakness.domain.Group.dto.response.GroupMemberListResponse; +import MathCaptain.weakness.domain.Group.dto.response.GroupResponse; +import MathCaptain.weakness.domain.Group.dto.response.RelationResponse; import MathCaptain.weakness.domain.User.entity.Users; import MathCaptain.weakness.domain.User.dto.response.UserResponse; import MathCaptain.weakness.domain.Group.service.GroupService; -import MathCaptain.weakness.domain.Group.dto.request.GroupCreateRequestDto; +import MathCaptain.weakness.domain.Group.dto.request.GroupCreateRequest; import MathCaptain.weakness.domain.Group.service.RelationService; import MathCaptain.weakness.global.Api.ApiResponse; import MathCaptain.weakness.global.annotation.LoginUser; @@ -32,27 +32,28 @@ public class GroupController { // 유저가 속한 그룹을 모두 보여줌 @GetMapping("/group") - public ApiResponse> getUsersGroups(@LoginUser Users loginUser) { + public ApiResponse> getUsersGroups(@LoginUser Users loginUser) { return groupService.getUsersGroups(loginUser); } // 그룹 조회 @GetMapping("/group/{groupId}") - public ApiResponse groupInfo(@PathVariable Long groupId) { + public ApiResponse groupInfo(@PathVariable Long groupId) { return ApiResponse.ok(groupService.getGroupInfo(groupId)); } // 그룹 생성 @PostMapping("/group") - public ApiResponse createGroup(@Valid @LoginUser Users loginUser, - @RequestBody GroupCreateRequestDto groupCreateRequestDto, HttpServletResponse response) { - return groupService.createGroup(loginUser ,groupCreateRequestDto, response); + public ApiResponse createGroup(@Valid @LoginUser Users loginUser, + @RequestBody GroupCreateRequest groupCreateRequest) { + return groupService.createGroup(loginUser , groupCreateRequest); } // 그룹 정보 수정 @PutMapping("/group/{groupId}") - public ApiResponse updateGroup(@Valid @PathVariable Long groupId, @RequestBody GroupUpdateRequestDto groupUpdateRequestDto) { - return groupService.updateGroupInfo(groupId, groupUpdateRequestDto); + public ApiResponse updateGroup(@Valid @LoginUser Users loginUser, + @PathVariable Long groupId, @RequestBody GroupUpdateRequest groupUpdateRequest) { + return groupService.updateGroupInfo(loginUser, groupId, groupUpdateRequest); } // 그룹 삭제 @@ -71,26 +72,26 @@ public ApiResponse> groupMembers(@PathVariable Long groupId) // 그룹 관계 조회 @GetMapping("/group/relation/{relationId}") - public RelationResponseDto relationInfo(@PathVariable Long relationId) { - return relationService.getRelationInfo(relationId); + public RelationResponse relationInfo(@PathVariable Long relationId) { + return relationService.getRelationResponse(relationId); } // 그룹 상세 정보 @GetMapping("/group/detail/{groupId}") - public ApiResponse groupDetail(@PathVariable Long groupId) { + public ApiResponse groupDetail(@PathVariable Long groupId) { return groupService.getGroupDetail(groupId); } // 그룹 멤버 리스트 (그룹 상세 페이지) @GetMapping("/group/detail/{groupId}/members") - public ApiResponse> GroupMemberList(@PathVariable Long groupId) { + public ApiResponse> GroupMemberList(@PathVariable Long groupId) { return ApiResponse.ok(relationService.getGroupMemberList(groupId)); } // 그룹 검색 (그룹명) @PostMapping("/group/search") - public ApiResponse> searchGroup(@RequestBody GroupSearchRequestDto groupSearchRequestDto) { - return groupService.getGroupInfo(groupSearchRequestDto.getGroupName()); + public ApiResponse> searchGroup(@RequestBody GroupSearchRequest groupSearchRequest) { + return groupService.getGroupInfo(groupSearchRequest.getGroupName()); } @GetMapping("/group/total") diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupJoinController.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupJoinController.java index 4610b5f..7576666 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupJoinController.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/controller/GroupJoinController.java @@ -1,6 +1,6 @@ package MathCaptain.weakness.domain.Group.controller; -import MathCaptain.weakness.domain.Group.dto.request.GroupJoinRequestDto; +import MathCaptain.weakness.domain.Group.dto.request.GroupJoinRequest; import MathCaptain.weakness.domain.Group.enums.RequestStatus; import MathCaptain.weakness.domain.Group.service.GroupJoinService; import MathCaptain.weakness.domain.Group.service.RelationService; @@ -32,8 +32,8 @@ public class GroupJoinController { @PostMapping("/group/join/{groupId}") public ApiResponse joinGroup(@Valid @PathVariable Long groupId, @LoginUser Users loginUser, - @RequestBody GroupJoinRequestDto groupJoinRequestDto) { - groupJoinService.joinGroupRequest(groupId, loginUser, groupJoinRequestDto); + @RequestBody GroupJoinRequest groupJoinRequest) { + groupJoinService.joinGroupRequest(groupId, loginUser, groupJoinRequest); notificationService.notifyGroupJoinRequest(groupId, loginUser); return ApiResponse.ok("그룹 가입 요청이 완료되었습니다."); } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupCreateRequest.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupCreateRequest.java new file mode 100644 index 0000000..fef028d --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupCreateRequest.java @@ -0,0 +1,65 @@ +package MathCaptain.weakness.domain.Group.dto.request; + +import MathCaptain.weakness.domain.Group.enums.CategoryStatus; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.*; +import org.hibernate.validator.constraints.Range; + +import java.util.List; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroupCreateRequest { + + private long leaderId; + + @NotNull(message = "그룹 이름은 필수입니다.") + @Size(min = 3, max = 15, message = "그룹 이름은 최소 3글자 이상, 15글자 이하입니다.") + private String groupName; + + @NotNull(message = "그룹 카테고리를 지정해주세요.") + private CategoryStatus category; + + @Range(min = 1, max = 24, message = "최소 일일 시간 설정 오류!") + private int minDailyHours; + + @Range(min = 1, max = 7, message = "최소 주간 일수 설정 오류!") + private int minWeeklyDays; + + private Long groupPoint; + + private List hashtags; + + private String groupImageUrl; + + // leader 개인 목표 + @Range(min = 1, max = 24, message = "개인 일일 목표 설정 오류!") + private int personalDailyGoal; + + @Range(min = 1, max = 7, message = "개인 주간 목표 설정 오류!") + private int personalWeeklyGoal; + + private GroupCreateRequest(long leaderId, String groupName, CategoryStatus category, + int minDailyHours, int minWeeklyDays, Long groupPoint, + List hashtags, String groupImageUrl, + int personalDailyGoal, int personalWeeklyGoal) { + this.leaderId = leaderId; + this.groupName = groupName; + this.category = category; + this.minDailyHours = minDailyHours; + this.minWeeklyDays = minWeeklyDays; + this.groupPoint = groupPoint; + this.hashtags = hashtags; + this.groupImageUrl = groupImageUrl; + this.personalDailyGoal = personalDailyGoal; + this.personalWeeklyGoal = personalWeeklyGoal; + } + + public static GroupCreateRequest of(long leaderId, String groupName, CategoryStatus category, + int minDailyHours, int minWeeklyDays, Long groupPoint, + List hashtags, String groupImageUrl, + int personalDailyGoal, int personalWeeklyGoal) { + return new GroupCreateRequest(leaderId, groupName, category, minDailyHours, minWeeklyDays, groupPoint, hashtags, groupImageUrl, personalDailyGoal, personalWeeklyGoal); + } +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupCreateRequestDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupCreateRequestDto.java deleted file mode 100644 index e4dec86..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupCreateRequestDto.java +++ /dev/null @@ -1,44 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.request; - -import MathCaptain.weakness.domain.Group.enums.CategoryStatus; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Builder; -import lombok.Data; -import org.hibernate.validator.constraints.Range; - -import java.util.List; - -@Data -@Builder -public class GroupCreateRequestDto { - - private long leaderId; - - @NotNull(message = "그룹 이름은 필수입니다.") - @Size(min = 3, max = 15, message = "그룹 이름은 최소 3글자 이상, 15글자 이하입니다.") - private String groupName; - - @NotNull(message = "그룹 카테고리를 지정해주세요.") - private CategoryStatus category; - - @Range(min = 1, max = 24, message = "최소 일일 시간 설정 오류!") - private int minDailyHours; - - @Range(min = 1, max = 7, message = "최소 주간 일수 설정 오류!") - private int minWeeklyDays; - - private Long groupPoint; - - private List hashtags; - - private String groupImageUrl; - - // leader 개인 목표 - @Range(min = 1, max = 24, message = "개인 일일 목표 설정 오류!") - private int personalDailyGoal; - - @Range(min = 1, max = 7, message = "개인 주간 목표 설정 오류!") - private int personalWeeklyGoal; - -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupJoinRequest.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupJoinRequest.java new file mode 100644 index 0000000..cd62f03 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupJoinRequest.java @@ -0,0 +1,21 @@ +package MathCaptain.weakness.domain.Group.dto.request; + +import lombok.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroupJoinRequest { + + private int personalDailyGoal; + + private int personalWeeklyGoal; + + private GroupJoinRequest(int personalDailyGoal, int personalWeeklyGoal) { + this.personalDailyGoal = personalDailyGoal; + this.personalWeeklyGoal = personalWeeklyGoal; + } + + public static GroupJoinRequest of(GroupCreateRequest groupCreateRequest) { + return new GroupJoinRequest(groupCreateRequest.getPersonalDailyGoal(), groupCreateRequest.getPersonalWeeklyGoal()); + } +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupJoinRequestDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupJoinRequestDto.java deleted file mode 100644 index b39ae60..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupJoinRequestDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.request; - -import jakarta.validation.constraints.NotNull; -import lombok.Builder; -import lombok.Data; -import org.hibernate.validator.constraints.Range; - -@Data -@Builder -public class GroupJoinRequestDto { - - private int personalDailyGoal; - - private int personalWeeklyGoal; -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupSearchRequestDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupSearchRequest.java similarity index 64% rename from MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupSearchRequestDto.java rename to MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupSearchRequest.java index 1334f62..ad96ca3 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupSearchRequestDto.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupSearchRequest.java @@ -2,10 +2,13 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import lombok.Data; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; -@Data -public class GroupSearchRequestDto { +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class GroupSearchRequest { @NotNull(message = "그룹 이름을 입력해주세요.") @NotBlank(message = "그룹 이름을 입력해주세요.") diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupUpdateRequestDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupUpdateRequest.java similarity index 78% rename from MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupUpdateRequestDto.java rename to MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupUpdateRequest.java index aa97641..f17f937 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupUpdateRequestDto.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/request/GroupUpdateRequest.java @@ -2,19 +2,14 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import org.hibernate.validator.constraints.Range; import java.util.List; -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class GroupUpdateRequestDto { +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class GroupUpdateRequest { @NotNull(message = "그룹 이름은 필수입니다.") @Size(min = 3, max = 15, message = "그룹 이름은 최소 3글자 이상, 15글자 이하입니다.") diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupDetailResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupDetailResponse.java new file mode 100644 index 0000000..b6d7090 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupDetailResponse.java @@ -0,0 +1,82 @@ +package MathCaptain.weakness.domain.Group.dto.response; + +import MathCaptain.weakness.domain.Group.entity.Group; +import MathCaptain.weakness.domain.Group.enums.CategoryStatus; +import MathCaptain.weakness.domain.User.entity.Users; +import lombok.*; + +import java.time.DayOfWeek; +import java.util.List; +import java.util.Map; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroupDetailResponse { + + private Long groupId; + + private String groupName; + + private CategoryStatus category; + + private Long leaderId; + + private String leaderName; + + private int minDailyHours; + + private int minWeeklyDays; + + private Long groupPoint; + + private int groupRanking; + + private List hashtags; + + private String groupImageUrl; + + private Map weeklyGoalAchieve; + + private Integer totalWeeklyGoalCount; + + private Long memberCount; + + @Builder + private GroupDetailResponse(Long groupId, String groupName, CategoryStatus category, Long leaderId, String leaderName, + int minDailyHours, int minWeeklyDays, Long groupPoint, int groupRanking, List hashtags, + String groupImageUrl, Map weeklyGoalAchieve, Integer totalWeeklyGoalCount, Long memberCount) { + this.groupId = groupId; + this.groupName = groupName; + this.category = category; + this.leaderId = leaderId; + this.leaderName = leaderName; + this.minDailyHours = minDailyHours; + this.minWeeklyDays = minWeeklyDays; + this.groupPoint = groupPoint; + this.groupRanking = groupRanking; + this.hashtags = hashtags; + this.groupImageUrl = groupImageUrl; + this.weeklyGoalAchieve = weeklyGoalAchieve; + this.totalWeeklyGoalCount = totalWeeklyGoalCount; + this.memberCount = memberCount; + } + + public static GroupDetailResponse of(Users leader, Group group, Long memberCount, Integer totalWeeklyGoalCount) { + return GroupDetailResponse.builder() + .groupId(group.getId()) + .groupName(group.getName()) + .category(group.getCategory()) + .leaderId(leader.getUserId()) + .leaderName(leader.getName()) + .minDailyHours(group.getMinDailyHours()) + .minWeeklyDays(group.getMinWeeklyDays()) + .groupPoint(group.getGroupPoint()) + .groupRanking(group.getGroupRanking()) + .hashtags(group.getHashtags()) + .groupImageUrl(group.getGroupImageUrl()) + .weeklyGoalAchieve(group.getWeeklyGoalAchieveMap()) + .totalWeeklyGoalCount(totalWeeklyGoalCount) + .memberCount(memberCount) + .build(); + } +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupDetailResponseDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupDetailResponseDto.java deleted file mode 100644 index da1b1a1..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupDetailResponseDto.java +++ /dev/null @@ -1,42 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.response; - -import MathCaptain.weakness.domain.Group.enums.CategoryStatus; -import lombok.Builder; -import lombok.Data; - -import java.time.DayOfWeek; -import java.util.List; -import java.util.Map; - -@Data -@Builder -public class GroupDetailResponseDto { - - private Long groupId; - - private String groupName; - - private CategoryStatus category; - - private Long leaderId; - - private String leaderName; - - private int minDailyHours; - - private int minWeeklyDays; - - private Long groupPoint; - - private int groupRanking; - - private List hashtags; - - private String groupImageUrl; - - private Map weeklyGoalAchieve; - - private Integer totalWeeklyGoalCount; - - private Long memberCount; -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupJoinResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupJoinResponse.java new file mode 100644 index 0000000..adbe3a3 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupJoinResponse.java @@ -0,0 +1,47 @@ +package MathCaptain.weakness.domain.Group.dto.response; + +import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; +import lombok.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroupJoinResponse { + + private Long groupJoinId; + + private Long userId; + + private Long groupId; + + private String userNickname; + + private Long userPoint; + + private int personalDailyGoal; + + private int personalWeeklyGoal; + + @Builder + private GroupJoinResponse(Long groupJoinId, Long userId, Long groupId, String userNickname, + Long userPoint, int personalDailyGoal, int personalWeeklyGoal) { + this.groupJoinId = groupJoinId; + this.userId = userId; + this.groupId = groupId; + this.userNickname = userNickname; + this.userPoint = userPoint; + this.personalDailyGoal = personalDailyGoal; + this.personalWeeklyGoal = personalWeeklyGoal; + } + + public static GroupJoinResponse of(RelationBetweenUserAndGroup relation) { + return GroupJoinResponse.builder() + .groupJoinId(relation.getGroup().getId()) + .userId(relation.getMember().getUserId()) + .userNickname(relation.getMember().getNickname()) + .userPoint(relation.getMember().getUserPoint()) + .personalDailyGoal(relation.getPersonalDailyGoal()) + .personalWeeklyGoal(relation.getPersonalWeeklyGoal()) + .build(); + } + +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupJoinResponseDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupJoinResponseDto.java deleted file mode 100644 index 65f083b..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupJoinResponseDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.response; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class GroupJoinResponseDto { - - private Long groupJoinId; - - private Long userId; - - private Long groupId; - - private String userNickname; - - private Long userPoint; - - private int personalDailyGoal; - - private int personalWeeklyGoal; -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupMemberListResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupMemberListResponse.java new file mode 100644 index 0000000..b02f22a --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupMemberListResponse.java @@ -0,0 +1,63 @@ +package MathCaptain.weakness.domain.Group.dto.response; + +import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; +import MathCaptain.weakness.domain.Group.enums.GroupRole; +import jakarta.validation.constraints.NotNull; +import lombok.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroupMemberListResponse { + + @NotNull + private Long userId; + + @NotNull + private String userName; + + private String userImageUrl; + + @NotNull + private GroupRole userRole; + + @NotNull + private Long userPoint; + + @NotNull + private int userWeeklyGoal; + + @NotNull + private int userDailyGoal; + + private int currentProgress; + + private Boolean isWeeklyGoalAchieved; + + @Builder + private GroupMemberListResponse(Long userId, String userName, String userImageUrl, + GroupRole userRole, Long userPoint, int userWeeklyGoal, int userDailyGoal, + int currentProgress, Boolean isWeeklyGoalAchieved) { + this.userId = userId; + this.userName = userName; + this.userImageUrl = userImageUrl; + this.userRole = userRole; + this.userPoint = userPoint; + this.userWeeklyGoal = userWeeklyGoal; + this.userDailyGoal = userDailyGoal; + this.currentProgress = currentProgress; + this.isWeeklyGoalAchieved = isWeeklyGoalAchieved; + } + + public static GroupMemberListResponse of(RelationBetweenUserAndGroup relation, Integer currentProgress) { + return GroupMemberListResponse.builder() + .userId(relation.getMember().getUserId()) + .userName(relation.getMember().getName()) + .userRole(relation.getGroupRole()) + .userPoint(relation.getMember().getUserPoint()) + .userWeeklyGoal(relation.getPersonalWeeklyGoal()) + .userDailyGoal(relation.getPersonalDailyGoal()) + .isWeeklyGoalAchieved(relation.isWeeklyGoalAchieved()) + .currentProgress(currentProgress) + .build(); + } +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupMemberListResponseDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupMemberListResponseDto.java deleted file mode 100644 index 9da38ed..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupMemberListResponseDto.java +++ /dev/null @@ -1,35 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.response; - -import MathCaptain.weakness.domain.Group.enums.GroupRole; -import jakarta.validation.constraints.NotNull; -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class GroupMemberListResponseDto { - - @NotNull - private Long userId; - - @NotNull - private String userName; - - private String userImageUrl; - - @NotNull - private GroupRole userRole; - - @NotNull - private Long userPoint; - - @NotNull - private int userWeeklyGoal; - - @NotNull - private int userDailyGoal; - - private int currentProgress; - - private Boolean isWeeklyGoalAchieved; -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupResponse.java new file mode 100644 index 0000000..6f2f902 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupResponse.java @@ -0,0 +1,87 @@ +package MathCaptain.weakness.domain.Group.dto.response; + +import MathCaptain.weakness.domain.Group.entity.Group; +import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; +import MathCaptain.weakness.domain.Group.enums.CategoryStatus; +import MathCaptain.weakness.domain.User.entity.Users; +import lombok.*; + +import java.time.LocalDate; +import java.util.List; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroupResponse { + + private Long groupId; + + private Long leaderId; + + private String leaderName; + + private String groupName; + + private CategoryStatus category; + + private int minDailyHours; + + private int minWeeklyDays; + + private Long groupPoint; + + private int groupRanking; + + private List hashtags; + + private LocalDate created_date; + + private String groupImageUrl; + + @Builder + private GroupResponse(Long groupId, Long leaderId, String leaderName, String groupName, + CategoryStatus category, int minDailyHours, int minWeeklyDays, Long groupPoint, + int groupRanking, List hashtags, LocalDate created_date, String groupImageUrl) { + this.groupId = groupId; + this.leaderId = leaderId; + this.leaderName = leaderName; + this.groupName = groupName; + this.category = category; + this.minDailyHours = minDailyHours; + this.minWeeklyDays = minWeeklyDays; + this.groupPoint = groupPoint; + this.groupRanking = groupRanking; + this.hashtags = hashtags; + this.created_date = created_date; + this.groupImageUrl = groupImageUrl; + } + + public static GroupResponse of(Users leader, Group group) { + return GroupResponse.builder() + .groupId(group.getId()) + .leaderId(leader.getUserId()) + .leaderName(leader.getName()) + .groupName(group.getName()) + .category(group.getCategory()) + .minDailyHours(group.getMinDailyHours()) + .minWeeklyDays(group.getMinWeeklyDays()) + .groupPoint(group.getGroupPoint()) + .groupRanking(group.getGroupRanking()) + .hashtags(group.getHashtags()) + .created_date(group.getCreateDate()) + .groupImageUrl(group.getGroupImageUrl()) + .build(); + } + + public static GroupResponse of(RelationBetweenUserAndGroup relation) { + return GroupResponse.builder() + .groupId(relation.getGroup().getId()) + .groupName(relation.getGroup().getName()) + .category(relation.getGroup().getCategory()) + .minDailyHours(relation.getGroup().getMinDailyHours()) + .minWeeklyDays(relation.getGroup().getMinWeeklyDays()) + .groupPoint(relation.getGroup().getGroupPoint()) + .hashtags(relation.getGroup().getHashtags()) + .groupImageUrl(relation.getGroup().getGroupImageUrl()) + .build(); + } +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupResponseDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupResponseDto.java deleted file mode 100644 index f694b07..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/GroupResponseDto.java +++ /dev/null @@ -1,39 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.response; - -import MathCaptain.weakness.domain.Group.enums.CategoryStatus; -import lombok.Builder; -import lombok.Data; - -import java.time.LocalDate; -import java.util.List; - -@Data -@Builder -public class GroupResponseDto { - - private Long groupId; - - private Long leaderId; - - private String leaderName; - - private String groupName; - - private CategoryStatus category; - - private int minDailyHours; - - private int minWeeklyDays; - - private Long groupPoint; - - private int groupRanking; - - private List hashtags; - - private Boolean disturb_mode; - - private LocalDate created_date; - - private String groupImageUrl; -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/RelationResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/RelationResponse.java new file mode 100644 index 0000000..ae29c67 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/RelationResponse.java @@ -0,0 +1,53 @@ +package MathCaptain.weakness.domain.Group.dto.response; + +import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; +import MathCaptain.weakness.domain.Group.enums.GroupRole; +import MathCaptain.weakness.domain.User.dto.response.UserResponse; +import lombok.*; + +import java.time.LocalDate; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class RelationResponse { + + private Long id; + + private UserResponse member; + + private GroupResponse group; + + private GroupRole groupRole; + + private LocalDate joinDate; + + private int personalDailyGoal; + + private int personalWeeklyGoal; + + @Builder + private RelationResponse(Long id, UserResponse member, GroupResponse group, GroupRole groupRole, + LocalDate joinDate, int personalDailyGoal, int personalWeeklyGoal) { + this.id = id; + this.member = member; + this.group = group; + this.groupRole = groupRole; + this.joinDate = joinDate; + this.personalDailyGoal = personalDailyGoal; + this.personalWeeklyGoal = personalWeeklyGoal; + } + + public static RelationResponse of(RelationBetweenUserAndGroup relation, UserResponse userResponse, GroupResponse groupResponse) { + return RelationResponse.builder() + .id(relation.getId()) + .member(userResponse) + .groupRole(relation.getGroupRole()) + .group(groupResponse) + .joinDate(relation.getJoinDate()) + .personalDailyGoal(relation.getPersonalDailyGoal()) + .personalWeeklyGoal(relation.getPersonalWeeklyGoal()) + .build(); + } + + +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/RelationResponseDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/RelationResponseDto.java deleted file mode 100644 index 2c1956c..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/RelationResponseDto.java +++ /dev/null @@ -1,27 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.response; - -import MathCaptain.weakness.domain.Group.enums.GroupRole; -import MathCaptain.weakness.domain.User.dto.response.UserResponse; -import lombok.Builder; -import lombok.Data; - -import java.time.LocalDate; - -@Data -@Builder -public class RelationResponseDto { - - private Long id; - - private UserResponse member; - - private GroupResponseDto group; - - private GroupRole groupRole; - - private LocalDate joinDate; - - private int personalDailyGoal; - - private int personalWeeklyGoal; -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/UserGroupCardResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/UserGroupCardResponse.java new file mode 100644 index 0000000..2100441 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/UserGroupCardResponse.java @@ -0,0 +1,59 @@ +package MathCaptain.weakness.domain.Group.dto.response; + +import MathCaptain.weakness.domain.Group.entity.Group; +import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; +import MathCaptain.weakness.domain.Group.enums.GroupRole; +import lombok.*; + +import java.time.DayOfWeek; +import java.util.Map; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UserGroupCardResponse { + + private Long groupId; + + private String groupName; + + private String groupImageUrl; + + private GroupRole groupRole; + + private int groupRanking; + + private Long groupPoint; + + private Map userAchieve; + + private int userDailyGoal; + + private int userWeeklyGoal; + + @Builder + private UserGroupCardResponse(Long groupId, String groupName, String groupImageUrl, GroupRole groupRole, int groupRanking, Long groupPoint, Map userAchieve, int userDailyGoal, int userWeeklyGoal) { + this.groupId = groupId; + this.groupName = groupName; + this.groupImageUrl = groupImageUrl; + this.groupRole = groupRole; + this.groupRanking = groupRanking; + this.groupPoint = groupPoint; + this.userAchieve = userAchieve; + this.userDailyGoal = userDailyGoal; + this.userWeeklyGoal = userWeeklyGoal; + } + + public static UserGroupCardResponse of(Group group, RelationBetweenUserAndGroup relation, Map userAchieveInGroup) { + return UserGroupCardResponse.builder() + .groupId(group.getId()) + .groupName(group.getName()) + .groupImageUrl(group.getGroupImageUrl()) + .groupRole(relation.getGroupRole()) + .groupRanking(group.getGroupRanking()) + .groupPoint(group.getGroupPoint()) + .userAchieve(userAchieveInGroup) + .userDailyGoal(relation.getPersonalDailyGoal()) + .userWeeklyGoal(relation.getPersonalWeeklyGoal()) + .build(); + } +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/UserGroupCardResponseDto.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/UserGroupCardResponseDto.java deleted file mode 100644 index 1e859e5..0000000 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/dto/response/UserGroupCardResponseDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package MathCaptain.weakness.domain.Group.dto.response; - -import MathCaptain.weakness.domain.Group.enums.GroupRole; -import lombok.Builder; -import lombok.Data; - -import java.time.DayOfWeek; -import java.util.Map; - -@Data -@Builder -public class UserGroupCardResponseDto { - - private Long groupId; - - private String groupName; - - private String groupImageUrl; - - private GroupRole groupRole; - - private int groupRanking; - - private Long groupPoint; - - private Map userAchieve; - - private int userDailyGoal; - - private int userWeeklyGoal; - -} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/Group.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/Group.java index 9183989..496844f 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/Group.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/Group.java @@ -1,13 +1,11 @@ package MathCaptain.weakness.domain.Group.entity; -import MathCaptain.weakness.domain.Group.dto.request.GroupUpdateRequestDto; +import MathCaptain.weakness.domain.Group.dto.request.GroupCreateRequest; +import MathCaptain.weakness.domain.Group.dto.request.GroupUpdateRequest; import MathCaptain.weakness.domain.Group.enums.CategoryStatus; import MathCaptain.weakness.domain.Recruitment.entity.Recruitment; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.springframework.data.annotation.CreatedDate; import java.time.DayOfWeek; @@ -18,10 +16,8 @@ @Entity @Getter -@Builder @Table(name = "UserGroup") -@NoArgsConstructor -@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Group { @Id @@ -40,8 +36,10 @@ public class Group { private CategoryStatus category; // 하루 최소 수행 시간 + @Column(nullable = false) private int minDailyHours; + @Column(nullable = false) private int minWeeklyDays; private Long groupPoint; @@ -63,62 +61,47 @@ public class Group { @CollectionTable(name = "group_weekly_goal_achieve", joinColumns = @JoinColumn(name = "group_id")) @MapKeyColumn(name = "day_of_week") // 요일을 키로 사용 @Column(name = "goal_count") // 카운트를 값으로 사용 - private Map weeklyGoalAchieveMap; + private Map weeklyGoalAchieveMap = new EnumMap<>(DayOfWeek.class); @OneToMany(mappedBy = "recruitGroup") private List recruitments; + @Builder + private Group(List relationBetweenUserAndGroup, String name, CategoryStatus category, int minDailyHours, int minWeeklyDays, List hashtags, String groupImageUrl) { + this.relationBetweenUserAndGroup = relationBetweenUserAndGroup; + this.name = name; + this.category = category; + this.minDailyHours = minDailyHours; + this.minWeeklyDays = minWeeklyDays; + this.createDate = LocalDate.now(); + this.groupPoint = 0L; + this.hashtags = hashtags; + this.groupImageUrl = groupImageUrl; + } + + public static Group of(GroupCreateRequest groupCreateRequest) { + return Group.builder() + .name(groupCreateRequest.getGroupName()) + .category(groupCreateRequest.getCategory()) + .minDailyHours(groupCreateRequest.getMinDailyHours()) + .minWeeklyDays(groupCreateRequest.getMinWeeklyDays()) + .hashtags(groupCreateRequest.getHashtags()) + .groupImageUrl(groupCreateRequest.getGroupImageUrl()) + .build(); + } + @PrePersist protected void onCreate() { - - if (this.weeklyGoalAchieveMap == null) { - this.weeklyGoalAchieveMap = new EnumMap<>(DayOfWeek.class); - } for (DayOfWeek dayOfWeek : DayOfWeek.values()) { weeklyGoalAchieveMap.put(dayOfWeek, 0); } } //==수정 로직==// - - public void updateName(String name) { - if (name != null && !name.equals(this.name)) { - this.name = name; - } - } - - public void updateCategory(CategoryStatus category) { - if (category != null && !category.equals(this.category)) { - this.category = category; - } - } - - public void updateMinDailyHours(int min_daily_hours) { - if (min_daily_hours > 0 && min_daily_hours != this.minDailyHours) { - this.minDailyHours = min_daily_hours; - } - } - - public void updateMinWeeklyDays(int min_weekly_days) { - if (min_weekly_days > 0 && min_weekly_days != this.minWeeklyDays) { - this.minWeeklyDays = min_weekly_days; - } - } - public void updateGroupPoint(Long group_point) { this.groupPoint = group_point; } - public void updateHashtags(List hashtags) { - this.hashtags = hashtags; - } - - public void updateGroupImageUrl(String group_image_url) { - if (group_image_url != null && !group_image_url.equals(this.groupImageUrl)) { - this.groupImageUrl = group_image_url; - } - } - public void updateGroupRanking(int groupRanking) { this.groupRanking = groupRanking; } @@ -127,12 +110,12 @@ public void updateWeeklyGoalAchieveMap(DayOfWeek dayOfWeek, int goalCount) { weeklyGoalAchieveMap.put(dayOfWeek, goalCount); } - public void updateGroup(GroupUpdateRequestDto requestDto) { - updateName(requestDto.getGroupName()); - updateMinDailyHours(requestDto.getMinDailyHours()); - updateMinWeeklyDays(requestDto.getMinWeeklyDays()); - updateHashtags(requestDto.getHashtags()); - updateGroupImageUrl(requestDto.getGroupImageUrl()); + public void updateGroup(GroupUpdateRequest requestDto) { + this.name = requestDto.getGroupName(); + this.minDailyHours = requestDto.getMinDailyHours(); + this.minWeeklyDays = requestDto.getMinWeeklyDays(); + this.hashtags = requestDto.getHashtags(); + this.groupImageUrl = requestDto.getGroupImageUrl(); } public boolean checkJoin(int dailyGoal, int weeklyGoal) { diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/RelationBetweenUserAndGroup.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/RelationBetweenUserAndGroup.java index 3adc87a..e60cd89 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/RelationBetweenUserAndGroup.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/entity/RelationBetweenUserAndGroup.java @@ -1,5 +1,7 @@ package MathCaptain.weakness.domain.Group.entity; +import MathCaptain.weakness.domain.Group.dto.request.GroupCreateRequest; +import MathCaptain.weakness.domain.Group.dto.request.GroupJoinRequest; import MathCaptain.weakness.domain.Group.enums.GroupRole; import MathCaptain.weakness.domain.Group.enums.RequestStatus; import MathCaptain.weakness.domain.User.entity.Users; @@ -13,9 +15,7 @@ @Entity @Getter -@Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor @Table(name = "RELATION_BETWEEN_USER_AND_GROUP") @EntityListeners(AuditingEntityListener.class) public class RelationBetweenUserAndGroup { @@ -37,8 +37,8 @@ public class RelationBetweenUserAndGroup { @Column(nullable = false) private GroupRole groupRole; - @Column(nullable = false) @CreatedDate + @Column(nullable = false) private LocalDate joinDate; private RequestStatus requestStatus; @@ -47,8 +47,8 @@ public class RelationBetweenUserAndGroup { @Range(min = 0, max = 24) private int personalDailyGoal; - @Column(nullable = false) @Range(min = 0) + @Column(nullable = false) private int personalWeeklyGoal; // 일간 인증 수행 시간 @@ -63,20 +63,47 @@ public class RelationBetweenUserAndGroup { @Range(min = 0) private int weeklyGoalAchieveStreak; - // 기본값 설정 - @PrePersist - protected void onPrePersist() { - - if (this.groupRole == null) { - this.groupRole = GroupRole.MEMBER; // 기본값 설정 - } - + @Builder + private RelationBetweenUserAndGroup(Users member, Group group, GroupRole groupRole, int personalDailyGoal, int personalWeeklyGoal) { + this.member = member; + this.group = group; + this.groupRole = groupRole; this.requestStatus = RequestStatus.WAITING; - + this.personalDailyGoal = personalDailyGoal; + this.personalWeeklyGoal = personalWeeklyGoal; + this.personalDailyGoalAchieve = 0L; this.personalWeeklyGoalAchieve = 0; this.weeklyGoalAchieveStreak = 0; - this.personalDailyGoalAchieve = 0L; + } + + public static RelationBetweenUserAndGroup of(Users leader, Group group, int dailyGoal, int weeklyGoal) { + return RelationBetweenUserAndGroup.builder() + .member(leader) + .groupRole(GroupRole.MEMBER) + .group(group) + .personalDailyGoal(dailyGoal) + .personalWeeklyGoal(weeklyGoal) + .build(); + } + + public static RelationBetweenUserAndGroup of(Users member, Group group, GroupCreateRequest groupCreateRequest) { + return RelationBetweenUserAndGroup.builder() + .member(member) + .groupRole(GroupRole.LEADER) + .group(group) + .personalDailyGoal(groupCreateRequest.getPersonalDailyGoal()) + .personalWeeklyGoal(groupCreateRequest.getPersonalWeeklyGoal()) + .build(); + } + public static RelationBetweenUserAndGroup of(Users member, Group group, GroupJoinRequest groupJoinRequest) { + return RelationBetweenUserAndGroup.builder() + .member(member) + .groupRole(GroupRole.MEMBER) + .group(group) + .personalDailyGoal(groupJoinRequest.getPersonalDailyGoal()) + .personalWeeklyGoal(groupJoinRequest.getPersonalWeeklyGoal()) + .build(); } public void subtractPoint(Long point) { diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/repository/RelationRepository.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/repository/RelationRepository.java index 63ed896..f29fb76 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/repository/RelationRepository.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/repository/RelationRepository.java @@ -27,8 +27,8 @@ public interface RelationRepository extends JpaRepository findGroupsIdByUserId(@Param("userId") Long userId); - @Query("SELECT r.group.id FROM RelationBetweenUserAndGroup r WHERE r.member = :user") - List findGroupsIdByMember(@Param("user") Users user); + @Query("SELECT r.group FROM RelationBetweenUserAndGroup r WHERE r.member = :user") + List findGroupsByMember(@Param("user") Users user); @Query("SELECT SUM(r.personalWeeklyGoal) FROM RelationBetweenUserAndGroup r WHERE r.group.id = :groupId") Integer sumPersonalWeeklyGoalByGroupId(@Param("groupId") Long groupId); diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupJoinService.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupJoinService.java index ab00319..6909e5a 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupJoinService.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupJoinService.java @@ -2,8 +2,8 @@ import MathCaptain.weakness.domain.Group.entity.Group; import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; -import MathCaptain.weakness.domain.Group.dto.request.GroupJoinRequestDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupJoinResponseDto; +import MathCaptain.weakness.domain.Group.dto.request.GroupJoinRequest; +import MathCaptain.weakness.domain.Group.dto.response.GroupJoinResponse; import MathCaptain.weakness.domain.Group.enums.RequestStatus; import MathCaptain.weakness.domain.Group.repository.GroupRepository; import MathCaptain.weakness.domain.Group.repository.RelationRepository; @@ -28,16 +28,14 @@ public class GroupJoinService { private final RelationRepository relationRepository; // 그룹 참여 - public void joinGroupRequest(Long groupId, Users user, GroupJoinRequestDto groupJoinRequestDto) { + public void joinGroupRequest(Long groupId, Users user, GroupJoinRequest groupJoinRequest) { Group group = groupRepository.findById(groupId) .orElseThrow(() -> new IllegalArgumentException("해당 그룹이 존재하지 않습니다.")); - // 이미 가입한 경우 & 목표 조건 달성 여부 - checkJoin(user, group, groupJoinRequestDto); - - // 그룹 가입 요청 저장 - saveJoinRequest(user, group, groupJoinRequestDto); + isJoined(user, group, groupJoinRequest); + RelationBetweenUserAndGroup relation = RelationBetweenUserAndGroup.of(user, group, groupJoinRequest); + relationRepository.save(relation); } // 그룹 가입 상태 변경 @@ -47,69 +45,34 @@ public void changeStatus(Long groupId, Users user, RequestStatus status) { } // 해당 그룹에 전달된 가입 요청 리스트 - public ApiResponse> getJoinRequestList(Long groupId) { + public ApiResponse> getJoinRequestList(Long groupId) { List requestList = relationRepository.findByGroupAndRequestStatus(groupId, WAITING); return ApiResponse.ok(requestList.stream() - .map(this::buildGroupJoinResponseDto) + .map(GroupJoinResponse::of) .toList()); } //==검증 로직==// - private void checkJoin(Users member, Group joinGroup, GroupJoinRequestDto groupJoinRequestDto) { - + private void isJoined(Users member, Group joinGroup, GroupJoinRequest groupJoinRequest) { if (relationRepository.findByMemberAndGroup(member, joinGroup).isPresent()) { throw new IllegalArgumentException("해당 멤버가 이미 가입되어 있습니다."); } - - int personalDailyGoal = groupJoinRequestDto.getPersonalDailyGoal(); - int personalWeeklyGoal = groupJoinRequestDto.getPersonalWeeklyGoal(); - - if (checkJoinAble(joinGroup, personalDailyGoal, personalWeeklyGoal)) { + if (joinAble(joinGroup, groupJoinRequest)) { throw new IllegalArgumentException("목표 조건을 달성하지 못했습니다."); } } - private RelationBetweenUserAndGroup checkStatusIsWaiting(Long groupId, Users user) { RelationBetweenUserAndGroup relation = relationRepository.findByMemberAndGroup_Id(user, groupId) .orElseThrow(() -> new IllegalArgumentException("해당 관계가 존재하지 않습니다.")); - if (!relation.getRequestStatus().equals(WAITING)) { throw new IllegalArgumentException("가입 요청 상태가 아닙니다."); } - return relation; } - - private boolean checkJoinAble(Group joinGroup, int personalDailyGoal, int personalWeeklyGoal) { - return !joinGroup.checkJoin(personalDailyGoal, personalWeeklyGoal); - } - - //==빌드==// - public void saveJoinRequest(Users member, Group group, GroupJoinRequestDto groupJoinRequestDto) { - RelationBetweenUserAndGroup relation = RelationBetweenUserAndGroup.builder() - .member(member) - .group(group) - .personalDailyGoal(groupJoinRequestDto.getPersonalDailyGoal()) - .personalWeeklyGoal(groupJoinRequestDto.getPersonalWeeklyGoal()) - .requestStatus(WAITING) - .build(); - - relationRepository.save(relation); - } - - private GroupJoinResponseDto buildGroupJoinResponseDto(RelationBetweenUserAndGroup relation) { - Users user = relation.getMember(); - - return GroupJoinResponseDto.builder() - .groupJoinId(relation.getGroup().getId()) - .userId(user.getUserId()) - .userNickname(user.getNickname()) - .userPoint(user.getUserPoint()) - .personalDailyGoal(relation.getPersonalDailyGoal()) - .personalWeeklyGoal(relation.getPersonalWeeklyGoal()) - .build(); + private boolean joinAble(Group joinGroup, GroupJoinRequest groupJoinRequest) { + return !joinGroup.checkJoin(groupJoinRequest.getPersonalDailyGoal(), groupJoinRequest.getPersonalWeeklyGoal()); } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupService.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupService.java index 467fbd4..00b601b 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupService.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/GroupService.java @@ -2,21 +2,18 @@ import MathCaptain.weakness.domain.Group.entity.Group; import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; -import MathCaptain.weakness.domain.Group.dto.request.GroupCreateRequestDto; -import MathCaptain.weakness.domain.Group.dto.request.GroupJoinRequestDto; -import MathCaptain.weakness.domain.Group.dto.request.GroupUpdateRequestDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupDetailResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.UserGroupCardResponseDto; +import MathCaptain.weakness.domain.Group.dto.request.GroupCreateRequest; +import MathCaptain.weakness.domain.Group.dto.request.GroupUpdateRequest; +import MathCaptain.weakness.domain.Group.dto.response.GroupDetailResponse; +import MathCaptain.weakness.domain.Group.dto.response.GroupResponse; +import MathCaptain.weakness.domain.Group.dto.response.UserGroupCardResponse; import MathCaptain.weakness.domain.Group.enums.CategoryStatus; -import MathCaptain.weakness.domain.Record.repository.RecordRepository; import MathCaptain.weakness.domain.Record.service.RecordService; import MathCaptain.weakness.domain.User.dto.response.UserResponse; import MathCaptain.weakness.domain.Group.repository.GroupRepository; import MathCaptain.weakness.domain.Group.repository.RelationRepository; import MathCaptain.weakness.domain.User.entity.Users; import MathCaptain.weakness.global.Api.ApiResponse; -import MathCaptain.weakness.global.exception.DuplicatedException; import MathCaptain.weakness.global.exception.ResourceNotFoundException; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -37,263 +34,143 @@ public class GroupService { private final GroupRepository groupRepository; private final RelationRepository relationRepository; - private final RecordRepository recordRepository; - private final RelationService relationService; private final RecordService recordService; // 그룹 생성 (CREATE) - public ApiResponse createGroup(Users leader, GroupCreateRequestDto groupCreateRequestDto, HttpServletResponse response) { - - if (checkDuplicationGroupName(groupCreateRequestDto)) { - throw new DuplicatedException("이미 존재하는 그룹 이름입니다."); - } - + public ApiResponse createGroup(Users leader, GroupCreateRequest groupCreateRequest) { // 그룹 생성 - Group group = buildGroup(leader, groupCreateRequestDto); - - Long groupId = groupRepository.save(group).getId(); + Group group = Group.of(groupCreateRequest); + groupRepository.save(group); - int leaderDailyGoal = groupCreateRequestDto.getPersonalDailyGoal(); - int leaderWeeklyGoal = groupCreateRequestDto.getPersonalWeeklyGoal(); - - GroupJoinRequestDto joinLeader = buildGroupJoinRequest(leaderDailyGoal, leaderWeeklyGoal); - - relationService.leaderJoin(groupId, leader, joinLeader); - - return ApiResponse.ok(buildGroupResponseDto(group)); + RelationBetweenUserAndGroup relation = RelationBetweenUserAndGroup.of(leader, group, groupCreateRequest); + relationRepository.save(relation); + return ApiResponse.ok(GroupResponse.of(leader, group)); } // 그룹 정보 조회 (READ) - public GroupResponseDto getGroupInfo(Long groupId) { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 없습니다.")); + public GroupResponse getGroupInfo(Long groupId) { + Group group = findById(groupId); + Users leader = findLeaderByGroup(group); + return GroupResponse.of(leader, group); + } - return buildGroupResponseDto(group); + public GroupResponse getGroupInfo(Group group) { + Users leader = findLeaderByGroup(group); + return GroupResponse.of(leader, group); } - public ApiResponse> getGroupInfo(String groupName) { + public ApiResponse> getGroupInfo(String groupName) { List groups = groupRepository.findByNameContaining(groupName) .orElseThrow(() -> new ResourceNotFoundException("검색 결과가 없습니다.")); - // 조회된 그룹들을 GroupResponseDto로 변환 return ApiResponse.ok(groups.stream() - .map(this::buildGroupResponseDto) + .map(group -> { + Users leader = findLeaderByGroup(group); + return GroupResponse.of(leader, group); + }) .collect(Collectors.toList())); } // 그룹 정보 업데이트 (UPDATE) - public ApiResponse updateGroupInfo(Long groupId, GroupUpdateRequestDto groupUpdateRequestDto) { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 없습니다.")); - - if (checkDuplicationGroupName(groupUpdateRequestDto)) { - throw new DuplicatedException("이미 존재하는 그룹 이름입니다."); - } - - group.updateGroup(groupUpdateRequestDto); - - return ApiResponse.ok(buildGroupResponseDto(group)); + public ApiResponse updateGroupInfo(Users leader, Long groupId, GroupUpdateRequest groupUpdateRequest) { + Group group = findById(groupId); + group.updateGroup(groupUpdateRequest); + return ApiResponse.ok(GroupResponse.of(leader, group)); } // 그룹 내 멤버 조회 public List getGroupMembers(Long groupId) { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 없습니다.")); - + Group group = findById(groupId); List members = relationRepository.findMembersByGroup(group); - return members.stream() - .map(GroupService::buildUserResponse) + .map(UserResponse::of) .collect(Collectors.toList()); } - // 그룹 상세 정보 조회 - public ApiResponse getGroupDetail(Long groupId) { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 없습니다.")); - + public ApiResponse getGroupDetail(Long groupId) { + Group group = findById(groupId); + Users leader = findLeaderByGroup(group); Integer totalWeeklyGoalCount = relationRepository.sumPersonalWeeklyGoalByGroupId(groupId); - Long memberCount = relationRepository.countByGroup(group); - - return ApiResponse.ok(buildGroupDetailResponseDto(group, memberCount, totalWeeklyGoalCount)); + return ApiResponse.ok(GroupDetailResponse.of(leader, group, memberCount, totalWeeklyGoalCount)); } - public ApiResponse> getUsersGroups(Users user) { - - // 유저가 속한 그룹을 모두 보여줌 - List groupsId = relationRepository.findGroupsIdByMember(user); - - List groups = groupsId.stream() - .map(this::convertToGroupResponseDto) // 각 그룹 ID를 GroupResponseDto로 변환 + // 유저가 속한 그룹을 모두 보여줌 + public ApiResponse> getUsersGroups(Users user) { + List groups = relationRepository.findGroupsByMember(user); + List groupResponses = groups.stream() + .map(group -> { + Users leader = findLeaderByGroup(group); + return GroupResponse.of(leader, group); + }) .toList(); // 결과를 리스트로 변환 - - return ApiResponse.ok(groups); + return ApiResponse.ok(groupResponses); } - public List getUsersGroups(List groupId) { - return groupId.stream() - .map(this::convertToGroupResponseDto) // 각 그룹 ID를 GroupResponseDto로 변환 + public List getUsersGroups(List groups) { + return groups.stream() + .map(this::getGroupInfo) // 각 그룹 ID를 GroupResponseDto로 변환 .toList(); // 결과를 리스트로 변환 } // 그룹 삭제 public ApiResponse deleteGroup(Long groupId) { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 존재하지 않습니다.")); - + Group group = findById(groupId); groupRepository.delete(group); - return ApiResponse.ok("그룹이 삭제되었습니다."); } // 유저가 속한 그룹의 카드 생성 - public List getUserGroupCard(Users user) { - List groupIds = relationRepository.findGroupsIdByMember(user); - - return groupIds.stream() - .map(groupId -> { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 존재하지 않습니다.")); - - RelationBetweenUserAndGroup relation = relationRepository.findByMemberAndGroup_Id(user, groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 관계가 존재하지 않습니다.")); - + public List getUserGroupCard(Users user) { + List groups = relationRepository.findGroupsByMember(user); + return groups.stream() + .map(group -> { + RelationBetweenUserAndGroup relation = findRelationByMemberAndGroup(user, group); Map userAchieveInGroup = recordService.getWeeklyGoalStatus(user, group, LocalDateTime.now()); - - return buildUserGroupCard(group, relation, userAchieveInGroup); + return UserGroupCardResponse.of(group, relation, userAchieveInGroup); }) .toList(); } public ApiResponse getGroups(String category) { - if (category == null) { return ApiResponse.ok(groupRepository.findAll().stream() - .map(this::buildGroupResponseDto) + .map(group -> { + Users leader = findLeaderByGroup(group); + return GroupResponse.of(leader, group); + }) .toList()); } try { // category를 CategoryStatus로 변환 CategoryStatus categoryStatus = CategoryStatus.valueOf(category.toUpperCase()); - // 특정 카테고리의 그룹 반환 return ApiResponse.ok(groupRepository.findAllByCategory(categoryStatus).stream() - .map(this::buildGroupResponseDto) + .map(group -> { + Users leader = findLeaderByGroup(group); + return GroupResponse.of(leader, group); + }) .toList()); - } catch (IllegalArgumentException e) { // 잘못된 카테고리 값 처리 return ApiResponse.fail("유효하지 않은 카테고리입니다: ", category); } } - /// 검증 로직 - private Boolean checkDuplicationGroupName(GroupCreateRequestDto groupCreateRequestDto) { - return groupRepository.existsByName(groupCreateRequestDto.getGroupName()); - } - - private Boolean checkDuplicationGroupName(GroupUpdateRequestDto groupUpdateRequestDto) { - return groupRepository.existsByName(groupUpdateRequestDto.getGroupName()); - } - /// 비지니스 로직 - private GroupResponseDto convertToGroupResponseDto(Long groupId) { - try { - // 그룹 정보를 조회하고 DTO로 변환 - return getGroupInfo(groupId); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("잘못된 그룹 ID 형식: " + groupId, e); - } - } - - /// 빌드 - private static GroupJoinRequestDto buildGroupJoinRequest(int leaderDailyGoal, int leaderWeeklyGoal) { - return GroupJoinRequestDto.builder() - .personalDailyGoal(leaderDailyGoal) - .personalWeeklyGoal(leaderWeeklyGoal) - .build(); - } - - private GroupResponseDto buildGroupResponseDto(Group group) { - - Users leader = relationRepository.findLeaderByGroup(group) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹의 리더가 없습니다.")); - - return GroupResponseDto.builder() - .groupId(group.getId()) - .leaderId(leader.getUserId()) - .leaderName(leader.getName()) - .groupName(group.getName()) - .category(group.getCategory()) - .minDailyHours(group.getMinDailyHours()) - .minWeeklyDays(group.getMinWeeklyDays()) - .groupPoint(group.getGroupPoint()) - .groupRanking(group.getGroupRanking()) - .hashtags(group.getHashtags()) - .created_date(group.getCreateDate()) - .groupImageUrl(group.getGroupImageUrl()) - .build(); - } - - private Group buildGroup(Users leader, GroupCreateRequestDto groupCreateRequestDto) { - - return Group.builder() - .name(groupCreateRequestDto.getGroupName()) - .category(groupCreateRequestDto.getCategory()) - .minDailyHours(groupCreateRequestDto.getMinDailyHours()) - .minWeeklyDays(groupCreateRequestDto.getMinWeeklyDays()) - .groupPoint(groupCreateRequestDto.getGroupPoint()) - .hashtags(groupCreateRequestDto.getHashtags()) - .groupImageUrl(groupCreateRequestDto.getGroupImageUrl()) - .build(); - } - - private GroupDetailResponseDto buildGroupDetailResponseDto(Group group, Long memberCount, Integer totalWeeklyGoalCount) { - - Users leader = relationRepository.findLeaderByGroup(group) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹의 리더가 없습니다.")); - - return GroupDetailResponseDto.builder() - .groupId(group.getId()) - .groupName(group.getName()) - .category(group.getCategory()) - .leaderId(leader.getUserId()) - .leaderName(leader.getName()) - .minDailyHours(group.getMinDailyHours()) - .minWeeklyDays(group.getMinWeeklyDays()) - .groupPoint(group.getGroupPoint()) - .groupRanking(group.getGroupRanking()) - .hashtags(group.getHashtags()) - .groupImageUrl(group.getGroupImageUrl()) - .weeklyGoalAchieve(group.getWeeklyGoalAchieveMap()) - .totalWeeklyGoalCount(totalWeeklyGoalCount) - .memberCount(memberCount) - .build(); + private Group findById(Long groupId) { + return groupRepository.findById(groupId) + .orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 없습니다.")); } - private static UserResponse buildUserResponse(Users user) { - return UserResponse.builder() - .userId(user.getUserId()) - .name(user.getName()) - .nickname(user.getNickname()) - .email(user.getEmail()) - .phoneNumber(user.getPhoneNumber()) - .build(); + private Users findLeaderByGroup(Group group) { + return relationRepository.findLeaderByGroup(group) + .orElseThrow(() -> new ResourceNotFoundException("그룹에 리더가 존재하지 않습니다.")); } - private static UserGroupCardResponseDto buildUserGroupCard(Group group, RelationBetweenUserAndGroup relation, Map userAchieveInGroup) { - return UserGroupCardResponseDto.builder() - .groupId(group.getId()) - .groupName(group.getName()) - .groupImageUrl(group.getGroupImageUrl()) - .groupRole(relation.getGroupRole()) - .groupRanking(group.getGroupRanking()) - .groupPoint(group.getGroupPoint()) - .userAchieve(userAchieveInGroup) - .userDailyGoal(relation.getPersonalDailyGoal()) - .userWeeklyGoal(relation.getPersonalWeeklyGoal()) - .build(); + private RelationBetweenUserAndGroup findRelationByMemberAndGroup(Users user, Group group) { + return relationRepository.findByMemberAndGroup(user, group) + .orElseThrow(() -> new ResourceNotFoundException("해당 관계가 존재하지 않습니다.")); } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/RelationService.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/RelationService.java index d1bada6..a2fcd85 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/RelationService.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Group/service/RelationService.java @@ -2,10 +2,9 @@ import MathCaptain.weakness.domain.Group.entity.Group; import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; -import MathCaptain.weakness.domain.Group.dto.request.GroupJoinRequestDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupMemberListResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.GroupResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.RelationResponseDto; +import MathCaptain.weakness.domain.Group.dto.response.GroupMemberListResponse; +import MathCaptain.weakness.domain.Group.dto.response.GroupResponse; +import MathCaptain.weakness.domain.Group.dto.response.RelationResponse; import MathCaptain.weakness.domain.Group.repository.GroupRepository; import MathCaptain.weakness.domain.Record.repository.RecordRepository; import MathCaptain.weakness.domain.User.dto.response.UserResponse; @@ -36,137 +35,65 @@ public class RelationService { // 그룹 탈퇴 public ApiResponse leaveGroup(Users user, Long groupId) { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new IllegalArgumentException("해당 그룹이 존재하지 않습니다.")); - - RelationBetweenUserAndGroup relation = getRelation(user, group); - + Group group = findGroupById(groupId); + RelationBetweenUserAndGroup relation = findRelationByMemberAndGroup(user, group); if (isLeader(relation)) { throw new IllegalArgumentException("리더는 그룹을 탈퇴할 수 없습니다."); } - relationRepository.delete(relation); - return ApiResponse.ok("그룹 탈퇴가 완료되었습니다."); } - public void leaderJoin(Long groupId, Users leader, GroupJoinRequestDto groupJoinRequestDto) { - - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new IllegalArgumentException("해당 그룹이 존재하지 않습니다.")); - - saveRelation(leader, group, groupJoinRequestDto); - } - - public void saveRelation(Users member, Group group, GroupJoinRequestDto groupJoinRequestDto) { - relationRepository.save(buildRelation(member, group, groupJoinRequestDto)); - } - // 그룹 멤버 리스트 (그룹 상세 페이지) - public List getGroupMemberList(Long groupId) { - // 그룹 멤버 관계 조회 - List relations = relationRepository.findAllByGroup_id(groupId) - .orElseThrow(() -> new ResourceNotFoundException("해당 그룹에 멤버가 없습니다.")); - + public List getGroupMemberList(Long groupId) { + List relations = findRelationsByGroupId(groupId); // 이번 주의 시작과 끝 시간 계산 LocalDateTime startOfWeek = LocalDateTime.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); LocalDateTime endOfWeek = startOfWeek.plusWeeks(1); - // 멤버 리스트 생성 return relations.stream() - .map(relation -> mapToGroupMemberListResponseDto(relation, startOfWeek, endOfWeek)) + .map(relation -> toResponse(relation, startOfWeek, endOfWeek)) .collect(Collectors.toList()); } - /// 검증 로직 - public RelationBetweenUserAndGroup getRelation(Users member, Group group) { + public RelationResponse getRelationResponse(Long relationId) { + RelationBetweenUserAndGroup relation = findRelationById(relationId); + GroupResponse groupResponse = GroupResponse.of(relation); + UserResponse member = UserResponse.of(relation); + return RelationResponse.of(relation, member, groupResponse); + } + + /// 로직 + public RelationBetweenUserAndGroup findRelationByMemberAndGroup(Users member, Group group) { return relationRepository.findByMemberAndGroup(member, group) .orElseThrow(() -> new IllegalArgumentException("해당 관계가 존재하지 않습니다.")); } - private static boolean isLeader(RelationBetweenUserAndGroup relation) { + private boolean isLeader(RelationBetweenUserAndGroup relation) { return relation.getGroupRole().equals(GroupRole.LEADER); } - public RelationResponseDto getRelationInfo(Long relationId) { - RelationBetweenUserAndGroup relation = relationRepository.findById(relationId) - .orElseThrow(() -> new IllegalArgumentException("해당 관계가 없습니다.")); - - GroupResponseDto group = GroupResponseDto.builder() - .groupId(relation.getGroup().getId()) - .groupName(relation.getGroup().getName()) - .category(relation.getGroup().getCategory()) - .minDailyHours(relation.getGroup().getMinDailyHours()) - .minWeeklyDays(relation.getGroup().getMinWeeklyDays()) - .groupPoint(relation.getGroup().getGroupPoint()) - .hashtags(relation.getGroup().getHashtags()) - .groupImageUrl(relation.getGroup().getGroupImageUrl()) - .build(); - - UserResponse member = UserResponse.builder() - .userId(relation.getMember().getUserId()) - .email(relation.getMember().getEmail()) - .name(relation.getMember().getName()) - .nickname(relation.getMember().getNickname()) - .phoneNumber(relation.getMember().getPhoneNumber()) - .build(); - - return RelationResponseDto.builder() - .id(relation.getId()) - .member(member) - .groupRole(relation.getGroupRole()) - .group(group) - .joinDate(relation.getJoinDate()) - .personalDailyGoal(relation.getPersonalDailyGoal()) - .personalWeeklyGoal(relation.getPersonalWeeklyGoal()) - .build(); - } - - /// 빌드 - - private GroupMemberListResponseDto mapToGroupMemberListResponseDto(RelationBetweenUserAndGroup relation, LocalDateTime startOfWeek, LocalDateTime endOfWeek) { + private GroupMemberListResponse toResponse(RelationBetweenUserAndGroup relation, LocalDateTime startOfWeek, LocalDateTime endOfWeek) { // 기록 리포지토리에서 현재 진행 상황 가져오기 (null 방지) Integer currentProgress = recordRepository.countDailyGoalAchieved( - relation.getGroup().getId(), - relation.getMember().getUserId(), - startOfWeek, - endOfWeek + relation.getGroup().getId(), relation.getMember().getUserId(), + startOfWeek, endOfWeek ).orElse(0); - - // DTO 빌드 및 반환 - return GroupMemberListResponseDto.builder() - .userId(relation.getMember().getUserId()) - .userName(relation.getMember().getName()) - //.userImage(relation.getMember().getImage()) // 주석 유지 또는 복원 필요 시 활성화 - .userRole(relation.getGroupRole()) - .userPoint(relation.getMember().getUserPoint()) - .userWeeklyGoal(relation.getPersonalWeeklyGoal()) - .userDailyGoal(relation.getPersonalDailyGoal()) - .isWeeklyGoalAchieved(relation.isWeeklyGoalAchieved()) - .currentProgress(currentProgress) - .build(); + return GroupMemberListResponse.of(relation, currentProgress); } - - private RelationBetweenUserAndGroup buildLeaderRelation(Users leader, Group group, int dailyGoal, int weeklyGoal) { - return RelationBetweenUserAndGroup.builder() - .member(leader) - .groupRole(GroupRole.LEADER) - .group(group) - .personalDailyGoal(dailyGoal) - .personalWeeklyGoal(weeklyGoal) - .build(); + private List findRelationsByGroupId(Long groupId) { + return relationRepository.findAllByGroup_id(groupId) + .orElseThrow(() -> new ResourceNotFoundException("해당 그룹에 멤버가 없습니다.")); } - private RelationBetweenUserAndGroup buildRelation(Users member, Group group, GroupJoinRequestDto groupJoinRequestDto) { - return RelationBetweenUserAndGroup.builder() - .member(member) - .groupRole(GroupRole.MEMBER) - .group(group) - .personalDailyGoal(groupJoinRequestDto.getPersonalDailyGoal()) - .personalWeeklyGoal(groupJoinRequestDto.getPersonalWeeklyGoal()) - .build(); + private Group findGroupById(Long groupId) { + return groupRepository.findById(groupId) + .orElseThrow(() -> new IllegalArgumentException("해당 그룹이 존재하지 않습니다.")); } - + private RelationBetweenUserAndGroup findRelationById(Long relationId) { + return relationRepository.findById(relationId) + .orElseThrow(() -> new IllegalArgumentException("해당 관계가 없습니다.")); + } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserCardResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserCardResponse.java index 8219e12..46011a4 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserCardResponse.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserCardResponse.java @@ -1,6 +1,6 @@ package MathCaptain.weakness.domain.User.dto.response; -import MathCaptain.weakness.domain.Group.dto.response.UserGroupCardResponseDto; +import MathCaptain.weakness.domain.Group.dto.response.UserGroupCardResponse; import MathCaptain.weakness.domain.User.entity.Users; import MathCaptain.weakness.domain.User.enums.Tiers; import lombok.*; @@ -19,10 +19,10 @@ public class UserCardResponse { private Long userPoint; - private List groupCards; + private List groupCards; @Builder - private UserCardResponse(Long userId, String userName, Tiers userTier, Long userPoint, List groupCards) { + private UserCardResponse(Long userId, String userName, Tiers userTier, Long userPoint, List groupCards) { this.userId = userId; this.userName = userName; this.userTier = userTier; @@ -40,7 +40,7 @@ public static UserCardResponse of(Users user) { .build(); } - public static UserCardResponse of(Users user, List groupCards) { + public static UserCardResponse of(Users user, List groupCards) { return UserCardResponse.builder() .userId(user.getUserId()) .userName(user.getName()) diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserResponse.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserResponse.java index 15ae695..3bdcefd 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserResponse.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/dto/response/UserResponse.java @@ -1,6 +1,7 @@ package MathCaptain.weakness.domain.User.dto.response; -import MathCaptain.weakness.domain.Group.dto.response.GroupResponseDto; +import MathCaptain.weakness.domain.Group.dto.response.GroupResponse; +import MathCaptain.weakness.domain.Group.entity.RelationBetweenUserAndGroup; import MathCaptain.weakness.domain.User.entity.Users; import MathCaptain.weakness.domain.User.enums.Tiers; import lombok.*; @@ -23,10 +24,10 @@ public class UserResponse { private String phoneNumber; - private List joinedGroups; + private List joinedGroups; @Builder - private UserResponse(Long userId, String email, String name, String nickname, Tiers tier, String phoneNumber, List joinedGroups) { + private UserResponse(Long userId, String email, String name, String nickname, Tiers tier, String phoneNumber, List joinedGroups) { this.userId = userId; this.email = email; this.name = name; @@ -48,7 +49,7 @@ public static UserResponse of(Users user) { .build(); } - public static UserResponse of(Users user, List joinedGroups) { + public static UserResponse of(Users user, List joinedGroups) { return UserResponse.builder() .userId(user.getUserId()) .email(user.getEmail()) @@ -59,4 +60,14 @@ public static UserResponse of(Users user, List joinedGroups) { .joinedGroups(joinedGroups) .build(); } + + public static UserResponse of(RelationBetweenUserAndGroup relation){ + return UserResponse.builder() + .userId(relation.getMember().getUserId()) + .email(relation.getMember().getEmail()) + .name(relation.getMember().getName()) + .nickname(relation.getMember().getNickname()) + .phoneNumber(relation.getMember().getPhoneNumber()) + .build(); + } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/service/UserService.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/service/UserService.java index ad1e2db..5aee71f 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/service/UserService.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/User/service/UserService.java @@ -1,7 +1,8 @@ package MathCaptain.weakness.domain.User.service; -import MathCaptain.weakness.domain.Group.dto.response.GroupResponseDto; -import MathCaptain.weakness.domain.Group.dto.response.UserGroupCardResponseDto; +import MathCaptain.weakness.domain.Group.dto.response.GroupResponse; +import MathCaptain.weakness.domain.Group.dto.response.UserGroupCardResponse; +import MathCaptain.weakness.domain.Group.entity.Group; import MathCaptain.weakness.domain.Group.repository.RelationRepository; import MathCaptain.weakness.domain.Group.service.GroupService; import MathCaptain.weakness.domain.User.dto.request.*; @@ -57,17 +58,16 @@ public ApiResponse deleteUser(Users user, UserDeleteRequest userDeleteRequest // 회원정보 수정 public ApiResponse updateUser(Users user, UpdateUserRequest userUpdateRequest) { user.updateUser(userUpdateRequest); - List joinedGroupsId = relationRepository.findGroupsIdByMember(user); - // TODO : 로직 수정 필요 - List groupResponseList = groupService.getUsersGroups(joinedGroupsId); + List joinedGroups = relationRepository.findGroupsByMember(user); + List groupResponseList = groupService.getUsersGroups(joinedGroups); return ApiResponse.ok(UserResponse.of(user, groupResponseList)); } // 회원정보 조회 public ApiResponse getUserInfo(Long userId) { Users user = findByUserId(userId); - List joinedGroupsId = relationRepository.findGroupsIdByUserId(user.getUserId()); - List groupResponseList = groupService.getUsersGroups(joinedGroupsId); + List joinedGroups = relationRepository.findGroupsByMember(user); + List groupResponseList = groupService.getUsersGroups(joinedGroups); return ApiResponse.ok(UserResponse.of(user, groupResponseList)); } @@ -101,7 +101,7 @@ public void changePwd(ChangePwdDto changePwdDto) { } public ApiResponse getUserCard(Users user) { - List groupCards = groupService.getUserGroupCard(user); + List groupCards = groupService.getUserGroupCard(user); UserCardResponse userCardResponse = UserCardResponse.of(user, groupCards); return ApiResponse.ok(userCardResponse); }