Skip to content

Commit

Permalink
[merge] 데이트 코스 등록 API 구현 - #42
Browse files Browse the repository at this point in the history
[FEAT] 데이트 코스 등록 API 구현 - #42
  • Loading branch information
rlarlgnszx authored Jul 11, 2024
2 parents c31fdc3 + 2eced5a commit bef4ae2
Show file tree
Hide file tree
Showing 65 changed files with 567 additions and 795 deletions.
10 changes: 1 addition & 9 deletions .github/workflows/CICD-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,7 @@ jobs:
echo "${{ secrets.CD_APPLICATION }}" > ./application.yml
cat ./application.yml
working-directory: ${{ env.working-directory }}

- name: AuthKey_39CUV6ST46.p8 생성
run: |
mkdir -p dateroad-external/src/main/resources/static && cd $_
touch ./AuthKey_39CUV6ST46.p8
echo "${{ secrets.CD_APPLICATION }}" > ./AuthKey_39CUV6ST46.p8
cat ./AuthKey_39CUV6ST46.p8
working-directory: ${{ env.working-directory }}


- name: 빌드
run: |
chmod +x gradlew
Expand Down
5 changes: 1 addition & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,4 @@ out/

### Yml ###
dateroad-api/src/main/resources/application.yml
dateroad-api/src/test/resources/application.yml

### File ###
**/static/*.p8
dateroad-api/src/test/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.dateroad.Image.service;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicInteger;
import lombok.RequiredArgsConstructor;
import org.dateroad.code.FailureCode;
import org.dateroad.date.domain.Course;
import org.dateroad.exception.DateRoadException;
import org.dateroad.image.domain.Image;
import org.dateroad.image.repository.ImageRepository;
import org.dateroad.s3.S3Service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ImageService {
private final ImageRepository imageRepository;
private final S3Service s3Service;
@Value("${s3.bucket.path}")
private String path;
@Value("${cloudfront.domain}")
private String cachePath;

public List<Image> saveImages(final List<MultipartFile> images, final Course course) {
AtomicInteger sequence = new AtomicInteger();
List<Image> courseimages = images.stream()
.map(img -> {
try {
return Image.create(
course,
cachePath + s3Service.uploadImage(path, img).get(),
sequence.getAndIncrement()
);
} catch (IOException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
})
.toList();
return imageRepository.saveAll(courseimages);
}

public Image findFirstByCourseOrderBySequenceAsc(Course course) {
return imageRepository.findFirstByCourseOrderBySequenceAsc(course)
.orElseThrow(
() -> new DateRoadException(FailureCode.COURSE_THUMBNAIL_NOT_FOUND)
);
}
}
Original file line number Diff line number Diff line change
@@ -1,35 +1,23 @@
package org.dateroad.advertisment.dto.response;

import java.util.List;
import lombok.AccessLevel;
import lombok.Builder;
import org.dateroad.advertisement.domain.AdTagType;
import org.dateroad.advertisement.domain.Advertisment;

@Builder(access = AccessLevel.PRIVATE)
public record AdvGetAllRes(
List<AdvertismentDtoRes> advertismentDtoResList
) {
public static AdvGetAllRes of(List<AdvertismentDtoRes> advertismentDtoResList) {
return AdvGetAllRes.builder()
.advertismentDtoResList(advertismentDtoResList)
.build();
}

@Builder(access = AccessLevel.PRIVATE)
public record AdvertismentDtoRes(
Long advertismentId,
String thumbnail,
String title,
AdTagType tag
) {
){
public static AdvertismentDtoRes of(Advertisment advertisment) {
return AdvertismentDtoRes.builder()
.advertismentId(advertisment.getId())
.thumbnail(advertisment.getThumbnail())
.title(advertisment.getTitle())
.tag(advertisment.getTag())
.build();
return new AdvertismentDtoRes(advertisment.getId(), advertisment.getTitle(), advertisment.getThumbnail(), advertisment.getTag());
}
}
public static AdvGetAllRes of(List<AdvertismentDtoRes> advertismentDtoResList) {
return new AdvGetAllRes(advertismentDtoResList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.dateroad.auth.filter.JwtAuthenticationFilter;
import org.dateroad.auth.jwt.JwtProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
Expand Down
12 changes: 12 additions & 0 deletions dateroad-api/src/main/java/org/dateroad/config/AsyncConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.dateroad.config;

import java.util.concurrent.Executor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
public class AsyncConfig {
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,44 @@
package org.dateroad.course.api;


import java.net.URI;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.dateroad.auth.argumentresolve.UserId;
import org.dateroad.course.dto.request.CourseGetAllReq;
import org.dateroad.course.dto.request.CourseCreateReq;
import org.dateroad.course.dto.request.CoursePlaceGetReq;
import org.dateroad.course.dto.request.TagCreateReq;
import org.dateroad.course.dto.response.CourseCreateRes;
import org.dateroad.course.dto.response.CourseGetAllRes;
import org.dateroad.course.dto.response.DateAccessGetAllRes;
import org.dateroad.course.facade.AsyncService;
import org.dateroad.course.service.CourseService;
import org.dateroad.date.domain.Course;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/api/v1/courses")
@RequiredArgsConstructor
public class CourseController {
private final CourseService courseService;
private final AsyncService asyncService;

@GetMapping
public ResponseEntity<CourseGetAllRes> getAllCourse(
@ModelAttribute CourseGetAllReq courseGetAllReq
) {
CourseGetAllRes courseAll = courseService.getAllCourses(courseGetAllReq);
return ResponseEntity.ok(courseAll);

}

@GetMapping("/date-access")
Expand All @@ -35,4 +48,20 @@ public ResponseEntity<DateAccessGetAllRes> getAllDataAccesCourse(
DateAccessGetAllRes dateAccessGetAllRes = courseService.getAllDataAccessCourse(userId);
return ResponseEntity.ok(dateAccessGetAllRes);
}

@PostMapping(value = "/create", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<CourseCreateRes> createCourse(
@UserId final Long userId,
@RequestPart("course") final CourseCreateReq courseCreateReq,
@RequestPart("tags") final List<TagCreateReq> tags,
@RequestPart("places") final List<CoursePlaceGetReq> places,
@RequestPart("images") final List<MultipartFile> images
) {
Course course = courseService.createCourse(userId, courseCreateReq, places, images);
asyncService.createCoursePlace(places, course);
asyncService.createCourseTags(tags, course);
return ResponseEntity.status(
HttpStatus.CREATED
).body(CourseCreateRes.of(course.getId()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.dateroad.course.dto.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
import java.time.LocalTime;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

@Getter
@Builder(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class CourseCreateReq {
private String title;

@DateTimeFormat(pattern = "yyyy.MM.dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd", timezone = "Asia/Seoul")
private LocalDate date;

@DateTimeFormat(pattern = "HH:mm")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm", timezone = "Asia/Seoul")
private LocalTime startAt;

private String country;

private String city;

private String description;

private int cost;

public static CourseCreateReq of(final String title,final LocalDate date,final LocalTime startAt,
final String country,final String city,final String description,
int cost) {
return CourseCreateReq.builder()
.title(title)
.date(date)
.startAt(startAt)
.country(country)
.city(city)
.description(description)
.cost(cost)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.dateroad.course.dto.request;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Builder(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class CoursePlaceGetReq {
private String title;
private float duration;
private int sequence;

public static CoursePlaceGetReq of(String title, float duration, int sequence) {
return CoursePlaceGetReq.builder()
.title(title)
.duration(duration)
.sequence(sequence)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.dateroad.course.dto.request;


import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.dateroad.tag.domain.DateTagType;

@Getter
@Setter
@Builder(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class TagCreateReq{
private DateTagType tag;

public static TagCreateReq of(DateTagType tag) {
return TagCreateReq.builder()
.tag(tag).build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.dateroad.course.dto.response;

import lombok.AccessLevel;
import lombok.Builder;

@Builder(access = AccessLevel.PROTECTED)
public record CourseCreateRes(
Long courseId
) {
public static CourseCreateRes of(Long courseId) {
return CourseCreateRes.builder()
.courseId(courseId)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import lombok.Builder;

@Builder(access = AccessLevel.PRIVATE)
public record CourseDtoRes(
public record CourseDtoGetRes(
Long courseId,
String thumbnail,
String city,
Expand All @@ -13,14 +13,14 @@ public record CourseDtoRes(
int cost,
float duration
) {
public static CourseDtoRes of(Long courseId,
String thumbnail,
String city,
String title,
int like,
int cost,
float duration) {
return CourseDtoRes.builder()
public static CourseDtoGetRes of(Long courseId,
String thumbnail,
String city,
String title,
int like,
int cost,
float duration) {
return CourseDtoGetRes.builder()
.courseId(courseId)
.thumbnail(thumbnail)
.city(city)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

@Builder(access = AccessLevel.PRIVATE)
public record CourseGetAllRes(
List<CourseDtoRes> courses
List<CourseDtoGetRes> courses
) {
public static CourseGetAllRes of(List<CourseDtoRes> courses) {
public static CourseGetAllRes of(List<CourseDtoGetRes> courses) {
return CourseGetAllRes.builder()
.courses(courses)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

@Builder(access = AccessLevel.PRIVATE)
public record DateAccessGetAllRes(
List<CourseDtoRes> courses
List<CourseDtoGetRes> courses
) {
public static DateAccessGetAllRes of(List<CourseDtoRes> dataAccessCourse) {
public static DateAccessGetAllRes of(List<CourseDtoGetRes> dataAccessCourse) {
return DateAccessGetAllRes.builder()
.courses(dataAccessCourse)
.build();
Expand Down
Loading

0 comments on commit bef4ae2

Please sign in to comment.