Skip to content

Commit eff99f5

Browse files
authored
[Feat] 코스 생성 시 path 값을 List로 받는 v2 controller를 만든다. (#131)
* feat: create course v2 * feat: request dto와 request image를 분리한다.
1 parent 4da61f3 commit eff99f5

5 files changed

Lines changed: 109 additions & 14 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.runnect.server.common.module.convert;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@AllArgsConstructor
8+
public class CoordinateDto {
9+
private double latitude;
10+
private double longitude;
11+
}

src/main/java/org/runnect/server/common/module/convert/CoordinatePathConverter.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,28 @@
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import java.util.ArrayList;
66
import java.util.List;
7-
import lombok.AllArgsConstructor;
8-
import lombok.Getter;
97
import lombok.extern.slf4j.Slf4j;
108
import org.locationtech.jts.geom.Coordinate;
119
import org.locationtech.jts.geom.GeometryFactory;
1210
import org.locationtech.jts.geom.LineString;
1311
import org.locationtech.jts.geom.PrecisionModel;
12+
import org.runnect.server.common.constant.ErrorStatus;
1413
import org.runnect.server.common.exception.BadRequestException;
1514
import org.runnect.server.common.exception.BasicException;
16-
import org.runnect.server.common.constant.ErrorStatus;
1715

1816
@Slf4j
1917
public class CoordinatePathConverter {
2018

19+
public static LineString coorConvertPathV2(List<CoordinateDto> path) {
20+
try {
21+
return getLineString(path);
22+
} catch (Exception e) {
23+
log.warn("course 요청 데이터 값 (path) -> " + path);
24+
log.warn("course 요청 데이터 값의 타입 (path) -> " + path.getClass().getName());
25+
throw new BadRequestException(ErrorStatus.VALIDATION_COURSE_PATH_EXCEPTION, ErrorStatus.VALIDATION_COURSE_PATH_EXCEPTION.getMessage());
26+
}
27+
}
28+
2129
public static LineString coorConvertPath(String path) {
2230

2331
List<CoordinateDto> coordinateDtos = new ArrayList<>();
@@ -34,8 +42,8 @@ public static LineString coorConvertPath(String path) {
3442

3543
return getLineString(coordinateDtos);
3644
} catch (Exception e) {
37-
log.info("course 요청 데이터 값 (path) -> " + path);
38-
log.info("course 요청 데이터 값의 타입 (path) -> " + path.getClass().getName());
45+
log.warn("course 요청 데이터 값 (path) -> " + path);
46+
log.warn("course 요청 데이터 값의 타입 (path) -> " + path.getClass().getName());
3947
throw new BadRequestException(ErrorStatus.VALIDATION_COURSE_PATH_EXCEPTION, ErrorStatus.VALIDATION_COURSE_PATH_EXCEPTION.getMessage());
4048
}
4149
}
@@ -67,13 +75,4 @@ private static LineString getLineString(List<CoordinateDto> coordinateDtos) {
6775
LineString lineString = geometryFactory.createLineString(coordinates);
6876
return lineString;
6977
}
70-
71-
@Getter
72-
@AllArgsConstructor
73-
private static class CoordinateDto {
74-
private double latitude;
75-
private double longitude;
76-
}
77-
7878
}
79-

src/main/java/org/runnect/server/course/controller/CourseController.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.runnect.server.common.exception.BadRequestException;
1010
import org.runnect.server.common.resolver.userId.UserId;
1111
import org.runnect.server.course.dto.request.CourseCreateRequestDto;
12+
import org.runnect.server.course.dto.request.CourseCreateRequestDtoV2;
1213
import org.runnect.server.course.dto.request.DeleteCoursesRequestDto;
1314
import org.runnect.server.course.dto.request.UpdateCourseRequestDto;
1415
import org.runnect.server.course.dto.response.CourseCreateResponseDto;
@@ -29,8 +30,10 @@
2930
import org.springframework.web.bind.annotation.PutMapping;
3031
import org.springframework.web.bind.annotation.RequestBody;
3132
import org.springframework.web.bind.annotation.RequestMapping;
33+
import org.springframework.web.bind.annotation.RequestPart;
3234
import org.springframework.web.bind.annotation.ResponseStatus;
3335
import org.springframework.web.bind.annotation.RestController;
36+
import org.springframework.web.multipart.MultipartFile;
3437

3538
@Slf4j
3639
@RestController
@@ -63,6 +66,25 @@ public ApiResponseDto<CourseCreateResponseDto> createCourse(
6366
courseService.createCourse(userId, courseCreateRequestDto, imageUrl));
6467
}
6568

69+
@PostMapping(value = "/v2", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}, produces = MediaType.APPLICATION_JSON_VALUE)
70+
@ResponseStatus(HttpStatus.CREATED)
71+
public ApiResponseDto<CourseCreateResponseDto> createCourseV2(
72+
@UserId Long userId,
73+
@RequestPart @Valid final CourseCreateRequestDtoV2 courseCreateRequestDto,
74+
@RequestPart final MultipartFile image
75+
) {
76+
log.info("create course 요청 값");
77+
log.info("departureAddress : " + courseCreateRequestDto.getDepartureAddress());
78+
log.info("departureName : " + courseCreateRequestDto.getDepartureName());
79+
log.info("path : " + courseCreateRequestDto.getPath());
80+
log.info("distance : " + courseCreateRequestDto.getDistance().toString());
81+
82+
String imageUrl = s3Service.uploadImage(image, "course");
83+
return ApiResponseDto.success(SuccessStatus.CREATE_COURSE_SUCCESS,
84+
courseService.createCourseV2(userId, courseCreateRequestDto, imageUrl));
85+
}
86+
87+
6688
@GetMapping("/user")
6789
@ResponseStatus(HttpStatus.OK)
6890
public ApiResponseDto<CourseGetByUserResponseDto> getCourseByUser(@UserId Long userId) {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.runnect.server.course.dto.request;
2+
3+
import java.io.Serializable;
4+
import java.util.List;
5+
import javax.validation.constraints.NotBlank;
6+
import javax.validation.constraints.NotNull;
7+
import lombok.AccessLevel;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
import org.runnect.server.common.module.convert.CoordinateDto;
12+
13+
@Getter
14+
@AllArgsConstructor
15+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
16+
public class CourseCreateRequestDtoV2 implements Serializable {
17+
18+
@NotNull(message = "path는 필수 입력 항목입니다.")
19+
private List<CoordinateDto> path;
20+
21+
@NotBlank(message = "title은 필수 입력 항목입니다.")
22+
private String title;
23+
24+
@NotNull(message = "distance는 필수 입력 항목입니다.")
25+
private Float distance;
26+
27+
private String departureName;
28+
29+
@NotBlank(message = "departureAddress는 필수 입력 항목입니다.")
30+
private String departureAddress;
31+
}

src/main/java/org/runnect/server/course/service/CourseService.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.runnect.server.common.module.convert.CoordinatePathConverter;
1313
import org.runnect.server.common.module.convert.DepartureConverter;
1414
import org.runnect.server.course.dto.request.CourseCreateRequestDto;
15+
import org.runnect.server.course.dto.request.CourseCreateRequestDtoV2;
1516
import org.runnect.server.course.dto.response.CourseCreateResponseDto;
1617
import org.runnect.server.course.dto.response.CourseGetByUserResponseDto;
1718
import org.runnect.server.course.dto.response.CourseResponse;
@@ -70,6 +71,37 @@ public CourseCreateResponseDto createCourse(Long userId, CourseCreateRequestDto
7071
return CourseCreateResponseDto.of(saved.getId(), saved.getCreatedAt());
7172
}
7273

74+
@Transactional
75+
public CourseCreateResponseDto createCourseV2(Long userId, CourseCreateRequestDtoV2 requestDto,
76+
String image) {
77+
RunnectUser user = userRepository.findById(userId)
78+
.orElseThrow(() -> new NotFoundUserException(NOT_FOUND_USER_EXCEPTION,
79+
NOT_FOUND_USER_EXCEPTION.getMessage()));
80+
81+
LineString path = CoordinatePathConverter.coorConvertPathV2(requestDto.getPath());
82+
DepartureResponse departureResponse = DepartureConverter.requestConvertDeparture(
83+
requestDto.getDepartureAddress(), requestDto.getDepartureName());
84+
85+
Course course = Course.builder()
86+
.runnectUser(user)
87+
.title(requestDto.getTitle())
88+
.departureRegion(departureResponse.getRegion())
89+
.departureCity(departureResponse.getCity())
90+
.departureTown(departureResponse.getTown())
91+
.departureDetail(departureResponse.getDetail())
92+
.departureName(departureResponse.getName())
93+
.distance(requestDto.getDistance())
94+
.image(image)
95+
.path(path)
96+
.build();
97+
98+
Course saved = courseRepository.save(course);
99+
user.updateCreatedCourse();
100+
userStampService.createStampByUser(user, StampType.c);
101+
102+
return CourseCreateResponseDto.of(saved.getId(), saved.getCreatedAt());
103+
}
104+
73105
@Transactional(readOnly = true)
74106
public CourseGetByUserResponseDto getCourseByUser(Long userId) {
75107
RunnectUser user = userRepository.findById(userId)

0 commit comments

Comments
 (0)