Skip to content

Commit eae8fe3

Browse files
authored
Merge pull request #155 from depromeet/develop
deploy-22.11.15.1
2 parents 1bb4c0b + 296d495 commit eae8fe3

36 files changed

Lines changed: 1131 additions & 149 deletions
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.depromeet.fairer.api;
2+
3+
import com.depromeet.fairer.dto.houseworkComplete.response.HouseWorkCompleteResponseDto;
4+
import com.depromeet.fairer.global.resolver.RequestMemberId;
5+
import com.depromeet.fairer.global.util.DateTimeUtils;
6+
import com.depromeet.fairer.service.houseworkComplete.HouseWorkCompleteService;
7+
import io.swagger.annotations.ApiOperation;
8+
import io.swagger.v3.oas.annotations.tags.Tag;
9+
import lombok.RequiredArgsConstructor;
10+
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.http.HttpStatus;
12+
import org.springframework.http.ResponseEntity;
13+
import org.springframework.web.bind.annotation.*;
14+
15+
import java.time.LocalDate;
16+
17+
@Slf4j
18+
@RestController
19+
@RequiredArgsConstructor
20+
@Tag(name = "houseWorkComplete", description = "집안일 완료 API")
21+
@RequestMapping("/api/houseworks/complete")
22+
public class HouseWorkCompleteController {
23+
24+
private final HouseWorkCompleteService houseWorkCompleteService;
25+
26+
@Tag(name = "houseWorkComplete")
27+
@ApiOperation(value = "집안일 완료 생성 - 반복 기능 구현 후")
28+
@PostMapping(value = "/{houseWorkId}")
29+
public ResponseEntity<HouseWorkCompleteResponseDto> createHouseWorkComp(@PathVariable("houseWorkId") Long houseWorkId,
30+
@RequestParam("scheduledDate") String scheduledDate) {
31+
final LocalDate date = DateTimeUtils.stringToLocalDate(scheduledDate);
32+
33+
final Long houseWorkCompleteId = houseWorkCompleteService.create(houseWorkId, date);
34+
return new ResponseEntity<>(HouseWorkCompleteResponseDto.create(houseWorkCompleteId), HttpStatus.CREATED);
35+
}
36+
37+
@Tag(name = "houseWorkComplete")
38+
@ApiOperation(value = "집안일 완료 삭제 - 반복 기능 구현 후")
39+
@DeleteMapping("/{houseWorkCompleteId}")
40+
public ResponseEntity<?> deleteHouseWorkComp(@PathVariable("houseWorkCompleteId") Long houseWorkCompleteId) {
41+
houseWorkCompleteService.delete(houseWorkCompleteId);
42+
return new ResponseEntity<>(HttpStatus.OK);
43+
}
44+
}

fairer-api/src/main/java/com/depromeet/fairer/api/HouseWorkController.java

Lines changed: 132 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.depromeet.fairer.service.member.MemberService;
1414

1515
import com.depromeet.fairer.service.team.TeamService;
16+
import com.depromeet.fairer.dto.housework.request.HouseWorkDeleteRequestDto;
1617
import com.depromeet.fairer.vo.houseWork.HouseWorkUpdateVo;
1718
import io.swagger.annotations.ApiOperation;
1819
import io.swagger.annotations.ApiParam;
@@ -27,11 +28,10 @@
2728

2829
import javax.validation.Valid;
2930
import java.time.LocalDate;
30-
import java.util.ArrayList;
31-
import java.util.HashMap;
32-
import java.util.List;
33-
import java.util.Map;
31+
import java.time.temporal.ChronoUnit;
32+
import java.util.*;
3433
import java.util.stream.Collectors;
34+
import java.util.stream.Stream;
3535

3636
@Slf4j
3737
@RestController
@@ -45,16 +45,128 @@ public class HouseWorkController {
4545
private final ModelMapper modelMapper;
4646

4747
@Tag(name = "houseWorks")
48-
@ApiOperation(value = "집안일 생성 API ")
48+
@ApiOperation(value = "집안일 생성 API")
4949
@PostMapping("")
50-
public ResponseEntity<HouseWorksCreateResponseDto> createHouseWorks(@ApiIgnore @RequestMemberId Long memberId,
51-
@RequestBody @Valid HouseWorksCreateRequestDto dto) {
52-
List<HouseWorkResponseDto> houseWorkList = houseWorkService.createHouseWorks(memberId, dto.getHouseWorks());
53-
return new ResponseEntity<>(new HouseWorksCreateResponseDto(houseWorkList), HttpStatus.CREATED);
50+
public ResponseEntity<List<HouseWorkResponseDto>> createHouseWorks(@ApiIgnore @RequestMemberId Long memberId,
51+
@RequestBody @Valid List<HouseWorksCreateRequestDto> request) {
52+
List<HouseWorkResponseDto> responseDtos = new ArrayList<>();
53+
for (HouseWorksCreateRequestDto requestDto : request) {
54+
responseDtos.add(houseWorkService.createHouseWork(memberId, requestDto));
55+
}
56+
return new ResponseEntity<>(responseDtos, HttpStatus.CREATED);
57+
}
58+
59+
@Tag(name = "houseWorks")
60+
@ApiOperation(value = "집안일 수정 API - 반복 기능 구현 후")
61+
@PutMapping("/v2")
62+
public ResponseEntity<?> editHouseWork(@ApiIgnore @RequestMemberId Long memberId,
63+
@RequestBody @Valid HouseWorkUpdateRequestDto dto) {
64+
return ResponseEntity.ok(houseWorkService.updateHouseWork(memberId, dto));
65+
}
66+
67+
@Tag(name = "houseWorks")
68+
@ApiOperation(value = "집안일 삭제 API - 반복 기능 구현 후")
69+
@DeleteMapping("/v2")
70+
public ResponseEntity<?> deleteHouseWork(
71+
@ApiIgnore @RequestMemberId Long memberId,
72+
@RequestBody @Valid HouseWorkDeleteRequestDto dto) {
73+
houseWorkService.deleteHouseWork(memberId, dto.getHouseWorkId(), dto.getType(), dto.getDeleteStandardDate());
74+
return new ResponseEntity<>(HttpStatus.OK);
75+
}
76+
77+
// 쿼리 1개로 처리
78+
@Tag(name = "houseWorks")
79+
@ApiOperation(value = "팀원의 특정 기간 집안일 목록 조회 - 반복 기능 구현 후", notes = "본인이 속한 팀의 팀원의 특정 기간 집안일 목록 조회")
80+
@GetMapping("/list/member/{teamMemberId}/query")
81+
public ResponseEntity<Map<String, HouseWorkDateResponseDto>> getHouseWorkListByTeamMemberAndDateQuery(@RequestParam("fromDate") String fromDate,
82+
@RequestParam("toDate") String toDate,@PathVariable("teamMemberId") Long teamMemberId,
83+
@ApiIgnore @RequestMemberId Long memberId) {
84+
final LocalDate from = DateTimeUtils.stringToLocalDate(fromDate);
85+
final LocalDate to = DateTimeUtils.stringToLocalDate(toDate);
86+
87+
teamService.checkJoinSameTeam(teamMemberId, memberId);
88+
Member teamMember = memberService.find(teamMemberId);
89+
90+
Map<LocalDate, List<HouseWorkResponseDto>> results = new HashMap<>();
91+
Stream.iterate(from, date -> date.plusDays(1))
92+
.limit(ChronoUnit.DAYS.between(from, to) + 1).forEach(date -> {
93+
94+
List<HouseWorkResponseDto> houseWorkResponseDtoList = houseWorkService.getHouseWorkByDateRepeatQuery(teamMember, date).stream().map(arr -> {
95+
List<MemberDto> memberDtoList = memberService.getMemberListByHouseWorkId(arr.getHouseWork().getHouseWorkId())
96+
.stream().map(MemberDto::from).collect(Collectors.toList());
97+
return HouseWorkResponseDto.from(arr.getHouseWork(), memberDtoList, date, arr.getHouseWorkCompleteId());
98+
99+
}).collect(Collectors.toList());
100+
101+
results.put(date, houseWorkResponseDtoList);
102+
});
103+
104+
return ResponseEntity.ok(makeHouseWorkListResponse(teamMemberId, results));
105+
}
106+
107+
// 팀 전체 쿼리 1개
108+
@Tag(name = "houseWorks")
109+
@ApiOperation(value = "특정 날짜별 집안일 조회 - 반복 기능 구현 후", notes = "특정 날짜별 집안일 조회")
110+
@GetMapping("/list/query")
111+
public ResponseEntity<Map<String, HouseWorkDateResponseDto>> getHouseWorkListByDateQuery(@RequestParam("fromDate") String fromDate,
112+
@RequestParam("toDate") String toDate,
113+
@ApiIgnore @RequestMemberId Long memberId) {
114+
final LocalDate from = DateTimeUtils.stringToLocalDate(fromDate);
115+
final LocalDate to = DateTimeUtils.stringToLocalDate(toDate);
116+
117+
Member member = memberService.find(memberId);
118+
Map<LocalDate, List<HouseWorkResponseDto>> results = new HashMap<>();
119+
120+
Stream.iterate(from, date -> date.plusDays(1))
121+
.limit(ChronoUnit.DAYS.between(from, to) + 1).forEach(date -> {
122+
List<HouseWorkResponseDto> houseWorkResponseDtoList = houseWorkService.getHouseWorkByDateRepeatTeamQuery(member.getTeam(), date).stream().map(arr -> {
123+
List<MemberDto> memberDtoList = memberService.getMemberListByHouseWorkId(arr.getHouseWork().getHouseWorkId())
124+
.stream().map(MemberDto::from).collect(Collectors.toList());
125+
return HouseWorkResponseDto.from(arr.getHouseWork(), memberDtoList, date, arr.getHouseWorkCompleteId());
126+
}).collect(Collectors.toList());
127+
128+
results.put(date, houseWorkResponseDtoList);
129+
});
130+
131+
return ResponseEntity.ok(makeHouseWorkListResponse(memberId, results));
132+
}
133+
134+
private Map<LocalDate, List<HouseWorkResponseDto>> getHouseWorkListGroupByScheduledDate(List<HouseWork> houseWorkList) {
135+
return houseWorkList.stream().map(houseWork -> {
136+
List<MemberDto> memberDtoList = memberService.getMemberListByHouseWorkId(houseWork.getHouseWorkId())
137+
.stream().map(MemberDto::from).collect(Collectors.toList());
138+
return HouseWorkResponseDto.from(houseWork, memberDtoList);
139+
}).collect(Collectors.groupingBy(HouseWorkResponseDto::getScheduledDate, HashMap::new, Collectors.toCollection(ArrayList::new)));
140+
}
141+
142+
private Map<String, HouseWorkDateResponseDto> makeHouseWorkListResponse(Long memberId, Map<LocalDate, List<HouseWorkResponseDto>> houseWorkListGroupByScheduledDate) {
143+
Map<String, HouseWorkDateResponseDto> response = new HashMap<>();
144+
houseWorkListGroupByScheduledDate.forEach((scheduledDate, houseWorkResponseDtoList) -> {
145+
long countDone = houseWorkResponseDtoList.stream().filter(HouseWorkResponseDto::getSuccess).count();
146+
long countLeft = houseWorkResponseDtoList.stream().filter(houseWorkResponseDto -> !houseWorkResponseDto.getSuccess()).count();
147+
response.put(DateTimeUtils.localDateToString(scheduledDate), HouseWorkDateResponseDto.from(memberId, scheduledDate, countDone, countLeft, houseWorkResponseDtoList));
148+
});
149+
return response;
150+
}
151+
152+
@Tag(name = "houseWorks")
153+
@ApiOperation(value = "개별 집안일 조회", notes = "")
154+
@GetMapping(value = "{houseWorkId}/detail")
155+
public ResponseEntity<HouseWorkResponseDto> getHouseWorkDetail(@PathVariable("houseWorkId") Long houseWorkId) {
156+
return ResponseEntity.ok(houseWorkService.getHouseWorkDetail(houseWorkId));
157+
}
158+
159+
@Tag(name = "houseWorks")
160+
@GetMapping("/success/count")
161+
public ResponseEntity<HouseWorkSuccessCountResponseDto> getSuccessCount(@RequestParam String scheduledDate,
162+
@ApiIgnore @RequestMemberId Long memberId) {
163+
HouseWorkSuccessCountResponseDto houseWorkSuccessCountResponseDto = houseWorkService.getSuccessCount(scheduledDate, memberId);
164+
return ResponseEntity.ok(houseWorkSuccessCountResponseDto);
54165
}
55166

167+
@Deprecated
56168
@Tag(name = "houseWorks")
57-
@ApiOperation(value = "집안일 수정 API")
169+
@ApiOperation(value = "집안일 수정 API - 반복 기능 구현 전")
58170
@PutMapping("/{houseWorkId}")
59171
public ResponseEntity<HouseWorkResponseDto> editHouseWork(@ApiIgnore @RequestMemberId Long memberId,
60172
@RequestBody @Valid HouseWorkUpdateRequestDto dto,
@@ -66,8 +178,9 @@ public ResponseEntity<HouseWorkResponseDto> editHouseWork(@ApiIgnore @RequestMem
66178
return new ResponseEntity<>(houseWorkService.updateHouseWork(houseWorkUpdateVo), HttpStatus.OK);
67179
}
68180

181+
@Deprecated
69182
@Tag(name = "houseWorks")
70-
@ApiOperation(value = "집안일 삭제 API ")
183+
@ApiOperation(value = "집안일 삭제 API - 반복 기능 구현 전")
71184
@DeleteMapping("/{houseWorkId}")
72185
public ResponseEntity<?> deleteHouseWork(
73186
@ApiIgnore @RequestMemberId Long memberId,
@@ -106,8 +219,10 @@ public ResponseEntity<List<HouseWorkDateResponseDto>> getHouseWork(@RequestParam
106219
return ResponseEntity.ok(houseWorkDateResponseDtos);
107220
}
108221

222+
// 1명 조회
223+
@Deprecated
109224
@Tag(name = "houseWorks")
110-
@ApiOperation(value = "팀원의 특정 기간 집안일 목록 조회", notes = "본인이 속한 팀의 팀원의 특정 기간 집안일 목록 조회")
225+
@ApiOperation(value = "팀원의 특정 기간 집안일 목록 조회 - 반복 기능 구현 전", notes = "본인이 속한 팀의 팀원의 특정 기간 집안일 목록 조회")
111226
@GetMapping("/list/member/{teamMemberId}")
112227
public ResponseEntity<Map<String, HouseWorkDateResponseDto>> getHouseWorkListByTeamMemberAndDate(@RequestParam("fromDate") String fromDate,
113228
@RequestParam("toDate") String toDate,
@@ -124,8 +239,10 @@ public ResponseEntity<Map<String, HouseWorkDateResponseDto>> getHouseWorkListByT
124239
return ResponseEntity.ok(makeHouseWorkListResponse(teamMemberId, houseWorkListGroupByScheduledDate));
125240
}
126241

242+
// 팀 전체 조회
243+
@Deprecated
127244
@Tag(name = "houseWorks")
128-
@ApiOperation(value = "특정 날짜별 집안일 조회", notes = "특정 날짜별 집안일 조회")
245+
@ApiOperation(value = "특정 날짜별 집안일 조회 - 반복 기능 구현 전", notes = "특정 날짜별 집안일 조회")
129246
@GetMapping("/list")
130247
public ResponseEntity<Map<String, HouseWorkDateResponseDto>> getHouseWorkListByDate(@RequestParam("fromDate") String fromDate,
131248
@RequestParam("toDate") String toDate,
@@ -139,44 +256,12 @@ public ResponseEntity<Map<String, HouseWorkDateResponseDto>> getHouseWorkListByD
139256
return ResponseEntity.ok(makeHouseWorkListResponse(memberId, houseWorkListGroupByScheduledDate));
140257
}
141258

142-
private Map<LocalDate, List<HouseWorkResponseDto>> getHouseWorkListGroupByScheduledDate(List<HouseWork> houseWorkList) {
143-
return houseWorkList.stream().map(houseWork -> {
144-
List<MemberDto> memberDtoList = memberService.getMemberListByHouseWorkId(houseWork.getHouseWorkId())
145-
.stream().map(MemberDto::from).collect(Collectors.toList());
146-
return HouseWorkResponseDto.from(houseWork, memberDtoList);
147-
}).collect(Collectors.groupingBy(HouseWorkResponseDto::getScheduledDate, HashMap::new, Collectors.toCollection(ArrayList::new)));
148-
}
149-
150-
private Map<String, HouseWorkDateResponseDto> makeHouseWorkListResponse(Long memberId, Map<LocalDate, List<HouseWorkResponseDto>> houseWorkListGroupByScheduledDate) {
151-
Map<String, HouseWorkDateResponseDto> response = new HashMap<>();
152-
houseWorkListGroupByScheduledDate.forEach((scheduledDate, houseWorkResponseDtoList) -> {
153-
long countDone = houseWorkResponseDtoList.stream().filter(HouseWorkResponseDto::getSuccess).count();
154-
long countLeft = houseWorkResponseDtoList.stream().filter(houseWorkResponseDto -> !houseWorkResponseDto.getSuccess()).count();
155-
response.put(DateTimeUtils.localDateToString(scheduledDate), HouseWorkDateResponseDto.from(memberId, scheduledDate, countDone, countLeft, houseWorkResponseDtoList));
156-
});
157-
return response;
158-
}
159-
160-
@Tag(name = "houseWorks")
161-
@ApiOperation(value = "개별 집안일 조회", notes = "")
162-
@GetMapping(value = "{houseWorkId}/detail")
163-
public ResponseEntity<HouseWorkResponseDto> getHouseWorkDetail(@PathVariable("houseWorkId") Long houseWorkId) {
164-
return ResponseEntity.ok(houseWorkService.getHouseWorkDetail(houseWorkId));
165-
}
166-
167259
@Tag(name = "houseWorks")
168-
@ApiOperation(value = "집안일 완료여부 수정", notes = "toBeStatus=0이면 완료->미완료, toBeStatus=1이면 미완료->완료")
260+
@ApiOperation(value = "집안일 완료여부 수정 - 반복 기능 구현 전", notes = "toBeStatus=0이면 완료->미완료, toBeStatus=1이면 미완료->완료")
169261
@PatchMapping(value = "{houseWorkId}")
262+
@Deprecated
170263
public ResponseEntity<HouseWorkStatusResponseDto> updateHouseWorkStatus(@PathVariable("houseWorkId") Long houseWorkId,
171264
@RequestBody @Valid HouseWorkStatusRequestDto req) {
172265
return ResponseEntity.ok(houseWorkService.updateHouseWorkStatus(houseWorkId, req.getToBeStatus()));
173266
}
174-
175-
@Tag(name = "houseWorks")
176-
@GetMapping("/success/count")
177-
public ResponseEntity<HouseWorkSuccessCountResponseDto> getSuccessCount(@RequestParam String scheduledDate,
178-
@ApiIgnore @RequestMemberId Long memberId) {
179-
HouseWorkSuccessCountResponseDto houseWorkSuccessCountResponseDto = houseWorkService.getSuccessCount(scheduledDate, memberId);
180-
return ResponseEntity.ok(houseWorkSuccessCountResponseDto);
181-
}
182267
}

fairer-api/src/main/java/com/depromeet/fairer/domain/housework/HouseWork.java

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,26 @@
22

33
import com.depromeet.fairer.domain.assignment.Assignment;
44
import com.depromeet.fairer.domain.base.BaseTimeEntity;
5+
import com.depromeet.fairer.domain.housework.constant.RepeatCycle;
6+
import com.depromeet.fairer.domain.houseworkComplete.HouseworkComplete;
57
import com.depromeet.fairer.domain.preset.Space;
8+
import com.depromeet.fairer.domain.repeatexception.RepeatException;
69
import com.depromeet.fairer.domain.team.Team;
10+
import com.depromeet.fairer.global.util.DateTimeUtils;
711
import lombok.*;
12+
import org.apache.commons.lang3.StringUtils;
813

914
import javax.persistence.*;
1015
import java.time.LocalDate;
1116
import java.time.LocalDateTime;
1217
import java.time.LocalTime;
13-
import java.util.ArrayList;
14-
import java.util.List;
18+
import java.util.*;
1519

1620
@Entity
1721
@Table(name = "housework")
1822
@Getter
1923
@Setter
20-
@ToString(exclude = {"assignments"})
24+
@ToString(exclude = {"assignments", "houseworkComplete"})
2125
@EqualsAndHashCode
2226
@Builder
2327
@NoArgsConstructor
@@ -54,4 +58,41 @@ public class HouseWork extends BaseTimeEntity {
5458
@Builder.Default
5559
@OneToMany(mappedBy = "houseWork", cascade = CascadeType.ALL, orphanRemoval = true)
5660
private List<Assignment> assignments = new ArrayList<>();
61+
62+
@Enumerated(EnumType.STRING)
63+
@Column(name = "repeat_cycle", columnDefinition = "VARCHAR(30)")
64+
private RepeatCycle repeatCycle;
65+
66+
@Column(name = "repeat_pattern", columnDefinition = "VARCHAR(100)")
67+
private String repeatPattern;
68+
69+
@Column(name = "repeat_end_date", columnDefinition = "DATE")
70+
private LocalDate repeatEndDate; //endDate 당일까지 반복 포함
71+
72+
@OneToMany(mappedBy = "houseWork", cascade = CascadeType.ALL, orphanRemoval = true)
73+
private List<HouseworkComplete> houseworkCompleteList;
74+
75+
@OneToMany(mappedBy = "houseWork", cascade = CascadeType.ALL, orphanRemoval = true)
76+
private List<RepeatException> repeatExceptionList;
77+
78+
public boolean isIncludingDate(LocalDate date) {
79+
if (repeatEndDate != null && date.isAfter(repeatEndDate)) {
80+
return false;
81+
}
82+
boolean result = true;
83+
if (repeatCycle == RepeatCycle.WEEKLY) {
84+
result = StringUtils.containsIgnoreCase(repeatPattern, DateTimeUtils.convertDayOfWeekToEng(date.getDayOfWeek()));
85+
} else if (repeatCycle == RepeatCycle.MONTHLY) {
86+
result = Integer.parseInt(repeatPattern) == date.getDayOfMonth();
87+
} /*else if (repeatCycle == RepeatCycle.DAILY) {
88+
return date.isEqual(scheduledDate) || date.isAfter(scheduledDate);
89+
} else if (repeatCycle == RepeatCycle.ONCE) {
90+
return date.isEqual(scheduledDate) || date.isAfter(scheduledDate);
91+
}*/
92+
return result && (date.isEqual(scheduledDate) || date.isAfter(scheduledDate));
93+
}
94+
95+
public void deleteRepeatEndDateByCycle(LocalDate deleteStandardDate) {
96+
repeatEndDate = deleteStandardDate.minusDays(1);
97+
}
5798
}

0 commit comments

Comments
 (0)