Skip to content

Commit 709fc68

Browse files
Konstantin PankratovKonstantin Pankratov
authored andcommitted
Implements MeetingCreationTypes, conversion and constraints
1 parent c0c78f0 commit 709fc68

File tree

15 files changed

+280
-1
lines changed

15 files changed

+280
-1
lines changed

.DS_Store

6 KB
Binary file not shown.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.studybuddies.server.web.mapper;
2+
3+
import com.studybuddies.server.domain.MeetingEntity;
4+
import com.studybuddies.server.web.dto.MeetingCreationRequest;
5+
import javax.annotation.processing.Generated;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Component;
8+
9+
@Generated(
10+
value = "org.mapstruct.ap.MappingProcessor",
11+
date = "2024-11-26T16:04:59+0100",
12+
comments = "version: 1.6.1, compiler: javac, environment: Java 17.0.12 (Azul Systems, Inc.)"
13+
)
14+
@Component
15+
public class MeetingMapperImpl implements MeetingMapper {
16+
17+
@Autowired
18+
private MeetingMapperUtils meetingMapperUtils;
19+
20+
@Override
21+
public MeetingEntity MeetingCreationRequestToMeetingEntity(MeetingCreationRequest meetingCreationRequest) {
22+
if ( meetingCreationRequest == null ) {
23+
return null;
24+
}
25+
26+
MeetingEntity.MeetingEntityBuilder meetingEntity = MeetingEntity.builder();
27+
28+
meetingEntity.title( meetingCreationRequest.title );
29+
meetingEntity.description( meetingCreationRequest.description );
30+
meetingEntity.links( meetingCreationRequest.links );
31+
meetingEntity.place( meetingCreationRequest.place );
32+
meetingEntity.date_from( meetingMapperUtils.stringToLocalDate( meetingCreationRequest.date_from ) );
33+
meetingEntity.date_until( meetingMapperUtils.stringToLocalDate( meetingCreationRequest.date_until ) );
34+
meetingEntity.repeatable( meetingMapperUtils.stringToRepeatEnum( meetingCreationRequest.repeatable ) );
35+
36+
MeetingEntity meetingEntityResult = meetingEntity.build();
37+
38+
validate( meetingEntityResult );
39+
40+
return meetingEntityResult;
41+
}
42+
}

server/pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
<dependency>
6161
<groupId>org.projectlombok</groupId>
6262
<artifactId>lombok</artifactId>
63-
<version>1.18.28</version>
63+
<version>1.18.36</version>
6464
<scope>provided</scope> <!-- Only needed during development, not runtime -->
6565
</dependency>
6666

@@ -132,6 +132,7 @@
132132
<version>1.6.1</version>
133133
</path>
134134
</annotationProcessorPaths>
135+
<generatedSourcesDirectory>${project.basedir}/generated-sources</generatedSourcesDirectory>
135136
</configuration>
136137
</plugin>
137138
</plugins>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.studybuddies.server.domain;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.ManyToOne;
9+
import jakarta.persistence.Table;
10+
import java.time.LocalDate;
11+
import java.time.LocalDateTime;
12+
import lombok.AllArgsConstructor;
13+
import lombok.Builder;
14+
import lombok.Getter;
15+
import lombok.NoArgsConstructor;
16+
import lombok.Setter;
17+
18+
@Table(name = "meeting")
19+
@Entity
20+
@Getter
21+
@Setter
22+
@Builder // debatable, makes testing easier
23+
@AllArgsConstructor
24+
@NoArgsConstructor
25+
public class MeetingEntity {
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.IDENTITY)
28+
private Long id;
29+
30+
@Column(nullable = false)
31+
String title;
32+
33+
String description;
34+
String links;
35+
36+
@Column(nullable = false)
37+
LocalDateTime date_from;
38+
@Column(nullable = false)
39+
LocalDateTime date_until;
40+
Repeat repeatable;
41+
String place;
42+
43+
@ManyToOne
44+
private UserEntity creator; // retrieve creator in Mapping function via JWT Token
45+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.studybuddies.server.domain;
2+
3+
public enum Repeat {
4+
NEVER,
5+
DAILY,
6+
WEEKLY,
7+
MONTHLY
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.studybuddies.server.domain;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.GenerationType;
6+
import jakarta.persistence.Id;
7+
8+
@Entity
9+
public class UserEntity {
10+
@Id
11+
@GeneratedValue(strategy = GenerationType.IDENTITY)
12+
private Long id;
13+
// not implemented
14+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.studybuddies.server.services.exceptions;
2+
3+
public class StudyBuddiesException extends RuntimeException {
4+
public StudyBuddiesException(String m) {
5+
super(m);
6+
}
7+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.studybuddies.server.web;
2+
3+
import com.studybuddies.server.web.mapper.mapper_exceptions.DateFormatException;
4+
import com.studybuddies.server.web.mapper.mapper_exceptions.EndDateAfterStartDateException;
5+
import com.studybuddies.server.web.mapper.mapper_exceptions.InvalidRepeatStringException;
6+
import com.studybuddies.server.web.mapper.mapper_exceptions.TimeFormatException;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.ExceptionHandler;
10+
import org.springframework.web.bind.annotation.RestControllerAdvice;
11+
12+
@RestControllerAdvice
13+
public class GlobalExceptionHandler {
14+
@ExceptionHandler(DateFormatException.class)
15+
protected ResponseEntity<?> handleDateFormatException() {
16+
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Wrong date format. Please use dd-MM-yyyy:HH:mm");
17+
}
18+
19+
@ExceptionHandler(TimeFormatException.class)
20+
protected ResponseEntity<?> handleTimeFormatException() {
21+
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Minutes must be divisible by 15");
22+
}
23+
24+
@ExceptionHandler(InvalidRepeatStringException.class)
25+
protected ResponseEntity<?> handleInvalidRepeatStringException() {
26+
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Not allowed. (daily, weekly, monthly, never)");
27+
}
28+
29+
@ExceptionHandler(EndDateAfterStartDateException.class)
30+
protected ResponseEntity<?> handleEndDateAfterStartDateException() {
31+
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Start date must be before end date");
32+
}
33+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.studybuddies.server.web.dto;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public class MeetingCreationRequest {
6+
@NotBlank
7+
public String title;
8+
public String description;
9+
public String links;
10+
@NotBlank
11+
public String date_from;
12+
@NotBlank
13+
public String date_until;
14+
public String repeatable;
15+
public String place;
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.studybuddies.server.web.mapper;
2+
3+
import com.studybuddies.server.domain.MeetingEntity;
4+
import com.studybuddies.server.web.dto.MeetingCreationRequest;
5+
import com.studybuddies.server.web.mapper.mapper_exceptions.EndDateAfterStartDateException;
6+
import java.time.LocalDateTime;
7+
import org.mapstruct.AfterMapping;
8+
import org.mapstruct.Mapper;
9+
import org.mapstruct.Mapping;
10+
import org.mapstruct.MappingTarget;
11+
12+
@Mapper(componentModel = "spring", uses = {MeetingMapperUtils.class})
13+
public interface MeetingMapper {
14+
@Mapping(source = "title", target = "title")
15+
@Mapping(source = "description", target = "description")
16+
@Mapping(source = "links", target = "links")
17+
@Mapping(source = "place", target = "place")
18+
19+
@Mapping(source = "date_from", target = "date_from", qualifiedByName = "stringToLocalDate")
20+
@Mapping(source = "date_until", target = "date_until", qualifiedByName = "stringToLocalDate")
21+
@Mapping(source = "repeatable", target = "repeatable", qualifiedByName = "stringToRepeatEnum")
22+
23+
MeetingEntity MeetingCreationRequestToMeetingEntity(MeetingCreationRequest meetingCreationRequest);
24+
25+
@AfterMapping
26+
default void validate(@MappingTarget MeetingEntity meetingEntity) {
27+
LocalDateTime start = meetingEntity.getDate_from();
28+
LocalDateTime end = meetingEntity.getDate_until();
29+
if(start.isAfter(end)) {
30+
throw new EndDateAfterStartDateException("");
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)