Skip to content

Commit b52140c

Browse files
authored
{feat} 그룹 상세 정보에 삽입할 데이터 추가
{feat} 그룹 상세 정보에 삽입할 데이터 추가
2 parents 1755dbe + 3509d9e commit b52140c

8 files changed

Lines changed: 71 additions & 14 deletions

File tree

Dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
FROM amazoncorretto:17
1+
FROM amazoncorretto:17-alpine
2+
3+
RUN apk update && apk add --no-cache curl
4+
5+
WORKDIR /app
26

37
EXPOSE 8080
48

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/domain/Group.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public class Group {
6565
@CollectionTable(name = "group_weekly_goal_achieve", joinColumns = @JoinColumn(name = "group_id"))
6666
@MapKeyColumn(name = "day_of_week") // 요일을 키로 사용
6767
@Column(name = "goal_count") // 카운트를 값으로 사용
68-
private Map<DayOfWeek, Integer> weeklyGoalAchieve = new EnumMap<>(DayOfWeek.class);
68+
private Map<DayOfWeek, Integer> weeklyGoalAchieve;
6969

7070
@OneToMany(mappedBy = "recruitGroup")
7171
private List<Recruitment> recruitments;

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/dto/response/GroupDetailResponseDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,7 @@ public class GroupDetailResponseDto {
3333

3434
private Map<DayOfWeek, Integer> weeklyGoalAchieve;
3535

36+
private Integer totalWeeklyGoalCount;
37+
3638
private Long memberCount;
3739
}

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/dto/response/GroupMemberListResponseDto.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,10 @@ public class GroupMemberListResponseDto {
2626
@NotNull
2727
private int userWeeklyGoal;
2828

29+
@NotNull
30+
private int userDailyGoal;
31+
32+
private int currentProgress;
33+
2934
private Boolean isAchieveWeeklyGoal;
3035
}

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/repository/RelationRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ public interface RelationRepository extends JpaRepository<RelationBetweenUserAnd
3030
@Query("SELECT r.joinGroup.id FROM RelationBetweenUserAndGroup r WHERE r.member = :user")
3131
List<Long> findGroupsIdByMember(@Param("user") Users user);
3232

33+
@Query("SELECT SUM(r.personalWeeklyGoal) FROM RelationBetweenUserAndGroup r WHERE r.joinGroup.id = :groupId")
34+
Integer sumPersonalWeeklyGoalByGroupId(@Param("groupId") Long groupId);
35+
3336
Optional<List<RelationBetweenUserAndGroup>> findAllByMember_Email(String email);
3437

3538
Optional<RelationBetweenUserAndGroup> findByMember_EmailAndJoinGroup_Id(String memberEmail, Long joinGroupId);

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/service/GroupService.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import MathCaptain.weakness.Group.dto.response.GroupDetailResponseDto;
99
import MathCaptain.weakness.Group.dto.response.GroupResponseDto;
1010
import MathCaptain.weakness.Group.dto.response.UserGroupCardResponseDto;
11+
import MathCaptain.weakness.Record.repository.RecordRepository;
1112
import MathCaptain.weakness.Record.service.RecordService;
1213
import MathCaptain.weakness.User.domain.UserDetailsImpl;
1314
import MathCaptain.weakness.User.dto.response.UserResponseDto;
@@ -27,6 +28,7 @@
2728

2829
import java.time.DayOfWeek;
2930
import java.time.LocalDateTime;
31+
import java.time.temporal.TemporalAdjusters;
3032
import java.util.*;
3133
import java.util.stream.Collectors;
3234

@@ -38,6 +40,7 @@ public class GroupService {
3840

3941
private final GroupRepository groupRepository;
4042
private final RelationRepository relationRepository;
43+
private final RecordRepository recordRepository;
4144
private final RelationService relationService;
4245
private final RecordService recordService;
4346

@@ -114,9 +117,11 @@ public GroupDetailResponseDto getGroupDetail(Long groupId) {
114117
Group group = groupRepository.findById(groupId)
115118
.orElseThrow(() -> new ResourceNotFoundException("해당 그룹이 없습니다."));
116119

120+
Integer totalWeeklyGoalCount = relationRepository.sumPersonalWeeklyGoalByGroupId(groupId);
121+
117122
Long memberCount = relationRepository.countByJoinGroup_Id(groupId);
118123

119-
return buildGroupDetailResponseDto(group, memberCount);
124+
return buildGroupDetailResponseDto(group, memberCount, totalWeeklyGoalCount);
120125
}
121126

122127
public ApiResponse<List<GroupResponseDto>> getUsersGroups(Users user) {
@@ -248,7 +253,7 @@ private Group buildGroup(Users leader, GroupCreateRequestDto groupCreateRequestD
248253
.build();
249254
}
250255

251-
private GroupDetailResponseDto buildGroupDetailResponseDto(Group group, Long memberCount) {
256+
private GroupDetailResponseDto buildGroupDetailResponseDto(Group group, Long memberCount, Integer totalWeeklyGoalCount) {
252257
return GroupDetailResponseDto.builder()
253258
.groupId(group.getId())
254259
.groupName(group.getName())
@@ -261,6 +266,7 @@ private GroupDetailResponseDto buildGroupDetailResponseDto(Group group, Long mem
261266
.hashtags(group.getHashtags())
262267
.groupImageUrl(group.getGroupImageUrl())
263268
.weeklyGoalAchieve(group.getWeeklyGoalAchieve())
269+
.totalWeeklyGoalCount(totalWeeklyGoalCount)
264270
.memberCount(memberCount)
265271
.build();
266272
}

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Group/service/RelationService.java

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import MathCaptain.weakness.Group.dto.response.GroupResponseDto;
88
import MathCaptain.weakness.Group.dto.response.RelationResponseDto;
99
import MathCaptain.weakness.Group.repository.GroupRepository;
10+
import MathCaptain.weakness.Record.repository.RecordRepository;
1011
import MathCaptain.weakness.User.dto.response.UserResponseDto;
1112
import MathCaptain.weakness.Group.enums.GroupRole;
1213
import MathCaptain.weakness.Group.repository.RelationRepository;
@@ -19,6 +20,9 @@
1920
import org.springframework.stereotype.Service;
2021
import org.springframework.transaction.annotation.Transactional;
2122

23+
import java.time.DayOfWeek;
24+
import java.time.LocalDateTime;
25+
import java.time.temporal.TemporalAdjusters;
2226
import java.util.List;
2327
import java.util.stream.Collectors;
2428

@@ -29,6 +33,7 @@ public class RelationService {
2933

3034
private final RelationRepository relationRepository;
3135
private final GroupRepository groupRepository;
36+
private final RecordRepository recordRepository;
3237

3338
// 그룹 탈퇴
3439
public ApiResponse<?> leaveGroup(Users user, Long groupId) {
@@ -70,20 +75,17 @@ public void saveRelation(Users member, Group group, GroupJoinRequestDto groupJoi
7075

7176
// 그룹 멤버 리스트 (그룹 상세 페이지)
7277
public List<GroupMemberListResponseDto> getGroupMemberList(Long groupId) {
73-
78+
// 그룹 멤버 관계 조회
7479
List<RelationBetweenUserAndGroup> relations = relationRepository.findAllByJoinGroup_id(groupId)
7580
.orElseThrow(() -> new ResourceNotFoundException("해당 그룹에 멤버가 없습니다."));
7681

82+
// 이번 주의 시작과 끝 시간 계산
83+
LocalDateTime startOfWeek = LocalDateTime.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
84+
LocalDateTime endOfWeek = startOfWeek.plusWeeks(1);
85+
86+
// 멤버 리스트 생성
7787
return relations.stream()
78-
.map(relation -> GroupMemberListResponseDto.builder()
79-
.userId(relation.getMember().getUserId())
80-
.userName(relation.getMember().getName())
81-
// .userImage(relation.getMember().getImage())
82-
.userRole(relation.getGroupRole())
83-
.userPoint(relation.getMember().getUserPoint())
84-
.userWeeklyGoal(relation.getPersonalWeeklyGoal())
85-
.isAchieveWeeklyGoal(relation.getIsWeeklyGoalAchieved())
86-
.build())
88+
.map(relation -> mapToGroupMemberListResponseDto(relation, startOfWeek, endOfWeek))
8789
.collect(Collectors.toList());
8890
}
8991

@@ -131,6 +133,30 @@ public RelationResponseDto getRelationInfo(Long relationId) {
131133

132134
/// 빌드
133135

136+
private GroupMemberListResponseDto mapToGroupMemberListResponseDto(RelationBetweenUserAndGroup relation, LocalDateTime startOfWeek, LocalDateTime endOfWeek) {
137+
// 기록 리포지토리에서 현재 진행 상황 가져오기 (null 방지)
138+
Integer currentProgress = recordRepository.countDailyGoalAchieved(
139+
relation.getJoinGroup().getId(),
140+
relation.getMember().getUserId(),
141+
startOfWeek,
142+
endOfWeek
143+
).orElse(0);
144+
145+
// DTO 빌드 및 반환
146+
return GroupMemberListResponseDto.builder()
147+
.userId(relation.getMember().getUserId())
148+
.userName(relation.getMember().getName())
149+
//.userImage(relation.getMember().getImage()) // 주석 유지 또는 복원 필요 시 활성화
150+
.userRole(relation.getGroupRole())
151+
.userPoint(relation.getMember().getUserPoint())
152+
.userWeeklyGoal(relation.getPersonalWeeklyGoal())
153+
.userDailyGoal(relation.getPersonalDailyGoal())
154+
.isAchieveWeeklyGoal(relation.getIsWeeklyGoalAchieved())
155+
.currentProgress(currentProgress)
156+
.build();
157+
}
158+
159+
134160
private RelationBetweenUserAndGroup buildLeaderRelation(Users leader, Group group, int dailyGoal, int weeklyGoal) {
135161
return RelationBetweenUserAndGroup.builder()
136162
.member(leader)

MathCaptain/weakness/src/main/java/MathCaptain/weakness/Record/repository/RecordRepository.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,15 @@ List<DayOfWeek> findDaysWithActivity(
2626
@Param("group") Group group,
2727
@Param("startOfWeek") LocalDateTime startOfWeek,
2828
@Param("endOfWeek") LocalDateTime endOfWeek);
29+
30+
// 이번주에 그룹원이 수행한 인증의 횟수
31+
@Query("SELECT SUM (CASE WHEN ar.dailyGoalAchieved = true THEN 1 ELSE 0 END) " +
32+
"FROM ActivityRecord ar " +
33+
"WHERE ar.group.id = :groupId " +
34+
"AND ar.user.userId = :userId " +
35+
"AND ar.startTime >= :startOfWeek AND ar.startTime < :endOfWeek")
36+
Optional<Integer> countDailyGoalAchieved(@Param("groupId") Long groupId,
37+
@Param("userId") Long userId,
38+
@Param("startOfWeek") LocalDateTime startOfWeek,
39+
@Param("endOfWeek") LocalDateTime endOfWeek);
2940
}

0 commit comments

Comments
 (0)