Skip to content

Commit 6156ea9

Browse files
Konstantin PankratovKonstantin Pankratov
authored andcommitted
Correctly create meetings based off their repeatable values. This commit will break the change function as well as the deletion function, hence calling them will result in an exception.
1 parent 7d6af74 commit 6156ea9

File tree

10 files changed

+197
-46
lines changed

10 files changed

+197
-46
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.studybuddies.server.domain;
2+
3+
public enum ChangeType {
4+
SERIES,
5+
OCCURRENCE
6+
}

server/src/main/java/com/studybuddies/server/domain/MeetingEntity.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import jakarta.persistence.ManyToOne;
99
import jakarta.persistence.Table;
1010
import java.time.LocalDateTime;
11+
import java.util.UUID;
1112
import lombok.AllArgsConstructor;
1213
import lombok.Builder;
1314
import lombok.Getter;
@@ -22,9 +23,12 @@
2223
@AllArgsConstructor
2324
@NoArgsConstructor
2425
public class MeetingEntity {
26+
2527
@Id
26-
@GeneratedValue(strategy = GenerationType.IDENTITY)
27-
Long id;
28+
@GeneratedValue(strategy = GenerationType.UUID)
29+
UUID id;
30+
31+
UUID superId;
2832

2933
@Column(nullable = false)
3034
String title;
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.studybuddies.server.persistance;
22

33
import com.studybuddies.server.domain.MeetingEntity;
4+
import java.util.List;
5+
import java.util.Optional;
6+
import java.util.UUID;
47
import org.springframework.data.repository.CrudRepository;
58
import org.springframework.stereotype.Repository;
69

710
@Repository
8-
public interface MeetingRepository extends CrudRepository<MeetingEntity, Long> {
9-
void deleteById(Long id);
11+
public interface MeetingRepository extends CrudRepository<MeetingEntity, UUID> {
12+
void deleteById(UUID id);
13+
List<Optional<MeetingEntity>> findBySuperId(UUID superId);
1014
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package com.studybuddies.server.services;
2+
3+
import com.studybuddies.server.domain.MeetingEntity;
4+
import com.studybuddies.server.domain.Repeat;
5+
import com.studybuddies.server.domain.UserEntity;
6+
import com.studybuddies.server.web.dto.MeetingCreationRequest;
7+
import com.studybuddies.server.web.mapper.MeetingMapper;
8+
import java.time.LocalDate;
9+
import java.time.LocalDateTime;
10+
import java.time.Month;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
import java.util.UUID;
14+
import lombok.RequiredArgsConstructor;
15+
import org.springframework.stereotype.Service;
16+
17+
@Service
18+
@RequiredArgsConstructor
19+
public class MeetingCreationService {
20+
private final MeetingMapper meetingMapper;
21+
private final UserService userService;
22+
23+
private LocalDateTime endTime;
24+
25+
public List<MeetingEntity> createMeetingInstances(
26+
MeetingCreationRequest meetingCreationRequest,
27+
String uuid
28+
) {
29+
List<MeetingEntity> meetingEntities = new ArrayList<>();
30+
setEndTime();
31+
32+
UUID superUUID = UUID.randomUUID();
33+
34+
MeetingEntity baseMeeting = meetingMapper.meetingCreationRequestToMeetingEntity(meetingCreationRequest);
35+
UserEntity creator = userService.findByUUID(UUIDService.parseUUID(uuid));
36+
baseMeeting.setCreator(creator);
37+
baseMeeting.setSuperId(superUUID);
38+
meetingEntities.add(baseMeeting);
39+
40+
while(shouldCreateMeeting(baseMeeting)) {
41+
MeetingEntity newMeeting = cloneMeetingEntity(baseMeeting);
42+
updateMeeting(newMeeting);
43+
meetingEntities.add(newMeeting);
44+
baseMeeting = newMeeting;
45+
}
46+
47+
return meetingEntities;
48+
}
49+
50+
private void updateMeeting(MeetingEntity meetingEntity) {
51+
LocalDateTime startDate = meetingEntity.getDate_from();
52+
LocalDateTime endDate = meetingEntity.getDate_until();
53+
54+
switch(meetingEntity.getRepeatable()) {
55+
case DAILY:
56+
meetingEntity.setDate_from(startDate.plusDays(1));
57+
meetingEntity.setDate_until(endDate.plusDays(1));
58+
break;
59+
case WEEKLY:
60+
meetingEntity.setDate_from(startDate.plusWeeks(1));
61+
meetingEntity.setDate_until(endDate.plusWeeks(1));
62+
break;
63+
case MONTHLY:
64+
meetingEntity.setDate_from(startDate.plusMonths(1));
65+
meetingEntity.setDate_until(endDate.plusMonths(1));
66+
break;
67+
default:
68+
throw new IllegalArgumentException("Invalid repeatable");
69+
}
70+
}
71+
72+
private boolean shouldCreateMeeting(MeetingEntity meetingEntity) {
73+
if(meetingEntity.getRepeatable() == Repeat.NEVER) {
74+
return false;
75+
}
76+
return meetingEntity.getDate_from().isBefore(endTime);
77+
78+
}
79+
80+
private void setEndTime() {
81+
LocalDate now = LocalDate.now();
82+
Month endMonth;
83+
84+
boolean semester =
85+
now.getMonth().compareTo(Month.FEBRUARY) < 0 || now.getMonth().compareTo(Month.OCTOBER) > 0;
86+
87+
if(semester) {
88+
endMonth = Month.FEBRUARY;
89+
} else {
90+
endMonth = Month.OCTOBER;
91+
}
92+
93+
endTime = LocalDate.of(LocalDate.now().getYear(), endMonth.getValue(), 1).atStartOfDay();
94+
}
95+
96+
97+
private MeetingEntity cloneMeetingEntity(MeetingEntity meetingEntity) {
98+
return MeetingEntity.builder()
99+
.superId(meetingEntity.getSuperId())
100+
.title(meetingEntity.getTitle())
101+
.description(meetingEntity.getDescription())
102+
.date_from(meetingEntity.getDate_from())
103+
.date_until(meetingEntity.getDate_until())
104+
.repeatable(meetingEntity.getRepeatable())
105+
.place(meetingEntity.getPlace())
106+
.creator(meetingEntity.getCreator())
107+
.build();
108+
}
109+
}

server/src/main/java/com/studybuddies/server/services/MeetingService.java

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.studybuddies.server.domain.ChangeType;
56
import com.studybuddies.server.domain.MeetingEntity;
6-
import com.studybuddies.server.domain.UserEntity;
77
import com.studybuddies.server.persistance.MeetingRepository;
88
import com.studybuddies.server.services.exceptions.InvalidUUIDException;
99
import com.studybuddies.server.services.exceptions.MeetingNotFoundException;
1010
import com.studybuddies.server.web.dto.MeetingChangeRequest;
1111
import com.studybuddies.server.web.dto.MeetingCreationRequest;
1212
import com.studybuddies.server.web.dto.MeetingResponse;
1313
import com.studybuddies.server.web.mapper.MeetingMapper;
14-
import com.studybuddies.server.web.mapper.MeetingMapperUtils;
1514
import jakarta.transaction.Transactional;
1615
import java.util.ArrayList;
16+
import java.util.List;
17+
import java.util.UUID;
1718
import lombok.AllArgsConstructor;
19+
import org.apache.commons.lang3.NotImplementedException;
1820
import org.springframework.stereotype.Service;
1921

2022
import java.util.Optional;
@@ -26,24 +28,33 @@ public class MeetingService {
2628
private final MeetingMapper meetingMapper;
2729
private final MeetingRepository meetingRepository;
2830
private final UserService userService;
29-
private final MeetingMapperUtils meetingMapperUtils;
31+
private final MeetingCreationService meetingCreationService;
3032

3133
@Transactional
32-
public Long saveMeetingToDatabase(MeetingCreationRequest mcr, String uuid) {
33-
MeetingEntity meetingEntity = meetingMapper.meetingCreationRequestToMeetingEntity(mcr);
34-
UserEntity creator = userService.findByUUID(UUIDService.parseUUID(uuid));
35-
meetingEntity.setCreator(creator);
36-
return meetingRepository.save(meetingEntity).getId();
34+
public UUID createMeetings(MeetingCreationRequest mcr, String uuid) {
35+
List<MeetingEntity> meetingEntities = meetingCreationService.createMeetingInstances(mcr, uuid);
36+
meetingRepository.saveAll(meetingEntities);
37+
38+
return meetingEntities.get(0).getSuperId();
3739
}
3840

3941
@Transactional
40-
public void changeMeetingInDatabase(Long id, MeetingChangeRequest meetingChangeRequest, String uuid) {
41-
Optional<MeetingEntity> requestResult = meetingRepository.findById(id);
42+
public void changeMeetingInDatabase(UUID id, MeetingChangeRequest meetingChangeRequest, String uuid, ChangeType changeType) {
43+
if(true) throw new NotImplementedException("Not implemented correctly");
44+
45+
List<Optional<MeetingEntity>> requestResult;
46+
47+
if(changeType == ChangeType.OCCURRENCE) {
48+
requestResult = List.of(meetingRepository.findById(id));
49+
} else {
50+
requestResult = meetingRepository.findBySuperId(id);
51+
}
4252

4353
if (requestResult.isEmpty()) {
4454
throw new MeetingNotFoundException("");
4555
}
46-
MeetingEntity meetingEntity = requestResult.get();
56+
57+
MeetingEntity meetingEntity = requestResult.get(0).get();
4758

4859
if (!meetingEntity.getCreator().getUuid().equals(UUIDService.parseUUID(uuid))) {
4960
throw new MeetingNotFoundException("");
@@ -56,30 +67,38 @@ public void changeMeetingInDatabase(Long id, MeetingChangeRequest meetingChangeR
5667
}
5768

5869
MeetingEntity changedMeetingEntity = meetingMapper.meetingChangeRequestToMeetingEntity(meetingChangeRequest);
59-
MergingService.mergeObjects(changedMeetingEntity, meetingEntity);
70+
71+
for(var targetMeeting : requestResult) {
72+
MergingService.mergeObjects(changedMeetingEntity, targetMeeting.get());
73+
}
6074

6175
meetingMapper.validate(meetingEntity);
6276
meetingRepository.save(meetingEntity);
6377
}
6478

6579
@Transactional
66-
public String retrieveMeetingFromDatabase(Long id) {
80+
public String retrieveMeetingFromDatabase(UUID superId) {
6781
ObjectMapper mapper = new ObjectMapper();
82+
List<MeetingResponse> responses = new ArrayList<>();
6883
try {
69-
if (id == null) {
84+
if (superId == null) {
7085
ArrayList<MeetingResponse> meetings = findAllMeetingEntities();
7186
return mapper.writeValueAsString(meetings);
7287
}
73-
MeetingEntity meeting = meetingRepository.findById(id)
74-
.orElseThrow(() -> new MeetingNotFoundException(""));
75-
return mapper.writeValueAsString(meetingMapper.meetingEntityToMeetingResponse(meeting));
88+
List<Optional<MeetingEntity>> meetings = meetingRepository.findBySuperId(superId);
89+
90+
for(Optional<MeetingEntity> meetingEntity : meetings) {
91+
responses.add(meetingMapper.meetingEntityToMeetingResponse(meetingEntity.get()));
92+
}
93+
return mapper.writeValueAsString(responses);
7694
} catch (JsonProcessingException e) {
7795
return "Error processing data";
7896
}
7997
}
8098

8199
@Transactional
82-
public void deleteMeetingFromDatabase(Long id, String uuid) {
100+
public void deleteMeetingFromDatabase(UUID id, String uuid) {
101+
if(true) throw new NotImplementedException("Not implemented correctly");
83102
MeetingEntity meeting = meetingRepository.findById(id)
84103
.orElseThrow(() -> new MeetingNotFoundException(""));
85104

server/src/main/java/com/studybuddies/server/services/MergingService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
@Service
88
public class MergingService {
9+
10+
private MergingService() {}
11+
912
public static void mergeObjects(Object source, Object target) {
1013
if (source == null || target == null) {
1114
throw new IllegalArgumentException("Source and target objects must not be null");

server/src/main/java/com/studybuddies/server/web/MeetingController.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.studybuddies.server.web;
22

3+
import com.studybuddies.server.domain.ChangeType;
34
import com.studybuddies.server.web.dto.MeetingChangeRequest;
45
import com.studybuddies.server.web.dto.MeetingCreationRequest;
56
import com.studybuddies.server.services.MeetingService;
67
import jakarta.servlet.http.HttpServletRequest;
78
import jakarta.validation.Valid;
9+
import jakarta.validation.constraints.NotNull;
810
import java.net.URI;
11+
import java.util.UUID;
912
import lombok.AllArgsConstructor;
1013
import org.springframework.http.HttpHeaders;
1114
import org.springframework.http.HttpStatus;
@@ -23,7 +26,7 @@ public ResponseEntity<?> createMeeting(
2326
@Valid @RequestBody MeetingCreationRequest meetingCreationRequest,
2427
HttpServletRequest request
2528
) {
26-
Long meetingId = meetingService.saveMeetingToDatabase(meetingCreationRequest,
29+
UUID meetingId = meetingService.createMeetings(meetingCreationRequest,
2730
request.getUserPrincipal().getName());
2831

2932
HttpHeaders returnHeader = new HttpHeaders();
@@ -33,25 +36,26 @@ public ResponseEntity<?> createMeeting(
3336

3437
@PutMapping
3538
public ResponseEntity<?> changeMeeting(
36-
@RequestParam Long id,
39+
@RequestParam UUID id,
40+
@RequestParam ChangeType changeType,
3741
@Valid @RequestBody MeetingChangeRequest meetingChangeRequest,
3842
HttpServletRequest request
3943
) {
40-
meetingService.changeMeetingInDatabase(id, meetingChangeRequest, request.getUserPrincipal().getName());
44+
meetingService.changeMeetingInDatabase(id, meetingChangeRequest, request.getUserPrincipal().getName(), changeType);
4145
return new ResponseEntity<>(HttpStatus.OK);
4246
}
4347

4448
@GetMapping
4549
public ResponseEntity<?> getMeeting(
46-
@RequestParam(required = false) Long id
50+
@RequestParam(required = false) UUID id
4751
) {
4852
String response = meetingService.retrieveMeetingFromDatabase(id);
4953
return ResponseEntity.status(HttpStatus.OK).body(response);
5054
}
5155

5256
@DeleteMapping
5357
public ResponseEntity<?> deleteMeeting(
54-
@RequestParam Long id,
58+
@RequestParam UUID id,
5559
HttpServletRequest request
5660
) {
5761
meetingService.deleteMeetingFromDatabase(id, request.getUserPrincipal().getName());

server/src/main/java/com/studybuddies/server/web/dto/MeetingResponse.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
public class MeetingResponse {
66
@NotBlank
7-
public Long id;
7+
public String id;
8+
public String superId;
89
@NotBlank
910
public String title;
1011
public String description;

server/src/main/java/com/studybuddies/server/web/mapper/MeetingMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public interface MeetingMapper {
2323
MeetingEntity meetingCreationRequestToMeetingEntity(MeetingCreationRequest meetingCreationRequest);
2424

2525
@Mapping(source = "id", target = "id")
26+
@Mapping(source = "superId", target = "superId")
2627
@Mapping(source = "title", target = "title")
2728
@Mapping(source = "description", target = "description")
2829
@Mapping(source = "place", target = "place")

0 commit comments

Comments
 (0)