Skip to content

Commit

Permalink
[merge] Amplitude를 위한 일부 API 응답 변경 - #279
Browse files Browse the repository at this point in the history
[FEAT] Amplitude를 위한 일부 API 응답 변경 - #279
  • Loading branch information
gardening-y authored Sep 22, 2024
2 parents 7d6b576 + 3531174 commit ff1da0f
Show file tree
Hide file tree
Showing 16 changed files with 118 additions and 66 deletions.
4 changes: 2 additions & 2 deletions dateroad-api/src/main/java/org/dateroad/common/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ public abstract class Constants {
public static final String AUTHORIZATION = "Authorization";
public static final String BEARER = "Bearer ";
public static final String CHARACTER_TYPE = "utf-8";


public static final int COURSE_CREATE_POINT = 100;
public static final int COURSE_OPEN_POINT = 50;
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
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.dto.response.CourseAccessGetAllRes;
import org.dateroad.course.dto.response.DateAccessCreateRes;
import org.dateroad.date.dto.response.CourseGetDetailRes;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
Expand Down Expand Up @@ -217,7 +218,7 @@ ResponseEntity<CourseGetAllRes> getAllCourses(
@ApiResponse(
responseCode = "200",
content = @Content(
schema = @Schema(implementation = DateAccessGetAllRes.class),
schema = @Schema(implementation = CourseAccessGetAllRes.class),
examples = @ExampleObject(value = """
{
"courses": [
Expand Down Expand Up @@ -269,7 +270,7 @@ ResponseEntity<CourseGetAllRes> getAllCourses(
responseCode = "500",
description = "서버 내부 오류입니다.",
content = @Content)})
ResponseEntity<DateAccessGetAllRes> getAllDataAccessCourse(
ResponseEntity<CourseAccessGetAllRes> getAllDataAccessCourse(
@Parameter(hidden = true) final @UserId Long userId
);

Expand Down Expand Up @@ -348,7 +349,7 @@ ResponseEntity<DateAccessGetAllRes> getAllDataAccessCourse(
responseCode = "500",
description = "서버 내부 오류입니다.",
content = @Content)})
public ResponseEntity<CourseCreateRes> createCourse(
ResponseEntity<CourseCreateRes> createCourse(
@UserId final Long userId,
@RequestPart("course") @Valid final CourseCreateReq courseCreateReq,
@RequestPart("tags") @Validated @Size(min = 1, max = 3) final List<TagCreateReq> tags,
Expand All @@ -363,7 +364,7 @@ public ResponseEntity<CourseCreateRes> createCourse(
@ApiResponse(
responseCode = "200",
content = @Content(
schema = @Schema(implementation = DateAccessGetAllRes.class),
schema = @Schema(implementation = CourseAccessGetAllRes.class),
examples = @ExampleObject(value = """
{
"courses": [
Expand Down Expand Up @@ -415,7 +416,7 @@ public ResponseEntity<CourseCreateRes> createCourse(
responseCode = "500",
description = "서버 내부 오류입니다.",
content = @Content)})
ResponseEntity<DateAccessGetAllRes> getMyCourses(
ResponseEntity<CourseAccessGetAllRes> getMyCourses(
@Parameter(hidden = true) final @UserId Long userId
);

Expand Down Expand Up @@ -467,7 +468,7 @@ ResponseEntity<DateAccessGetAllRes> getMyCourses(
responseCode = "500",
description = "서버 내부 오류입니다.",
content = @Content)})
ResponseEntity<Void> openCourse(
ResponseEntity<DateAccessCreateRes> openCourse(
@Parameter(hidden = true)
@UserId final Long userId,
@PathVariable final Long courseId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import static org.dateroad.common.ValidatorUtil.validateListSizeMax;
import static org.dateroad.common.ValidatorUtil.validateListSizeMin;
import static org.dateroad.common.ValidatorUtil.validateTagSize;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Size;
Expand All @@ -18,16 +17,14 @@
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.dto.response.CourseAccessGetAllRes;
import org.dateroad.course.dto.response.DateAccessCreateRes;
import org.dateroad.course.service.AsyncService;
import org.dateroad.course.service.CourseService;
import org.dateroad.date.domain.Course;
import org.dateroad.date.dto.response.CourseGetDetailRes;
import org.dateroad.point.domain.TransactionType;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
Expand All @@ -37,7 +34,6 @@
@RequiredArgsConstructor
public class CourseController implements CourseApi {
private final CourseService courseService;
private final AsyncService asyncService;

@GetMapping
public ResponseEntity<CourseGetAllRes> getAllCourses(
Expand All @@ -54,10 +50,10 @@ public ResponseEntity<CourseGetAllRes> getSortedCourses(final @RequestParam Stri
}

@GetMapping("/date-access")
public ResponseEntity<DateAccessGetAllRes> getAllDataAccessCourse(final @UserId Long userId
public ResponseEntity<CourseAccessGetAllRes> getAllDataAccessCourse(final @UserId Long userId
) {
DateAccessGetAllRes dateAccessGetAllRes = courseService.getAllDataAccessCourse(userId);
return ResponseEntity.ok(dateAccessGetAllRes);
CourseAccessGetAllRes courseAccessGetAllRes = courseService.getAllCourseAccessCourse(userId);
return ResponseEntity.ok(courseAccessGetAllRes);
}

@PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE,
Expand All @@ -74,26 +70,24 @@ public ResponseEntity<CourseCreateRes> createCourse(
validateListSizeMin(tags, 1, FailureCode.WRONG_TAG_SIZE);
validateListSizeMax(tags, 3, FailureCode.WRONG_TAG_SIZE);
validateListSizeMax(images, 10, FailureCode.WRONG_IMAGE_LIST_SIZE);
Course course = courseService.createCourse(userId, courseCreateReq, places, images, tags);
return ResponseEntity.status(
HttpStatus.CREATED
).body(CourseCreateRes.of(course.getId()));
CourseCreateRes courseCreateRes = courseService.createCourse(userId, courseCreateReq, places, images, tags);
return ResponseEntity.status(HttpStatus.CREATED).body(courseCreateRes);
}

@GetMapping("/users")
public ResponseEntity<DateAccessGetAllRes> getMyCourses(final @UserId Long userId) {
DateAccessGetAllRes dateAccessGetAllRes = courseService.getMyCourses(userId);
return ResponseEntity.ok(dateAccessGetAllRes);
public ResponseEntity<CourseAccessGetAllRes> getMyCourses(final @UserId Long userId) {
CourseAccessGetAllRes courseAccessGetAllRes = courseService.getMyCourses(userId);
return ResponseEntity.ok(courseAccessGetAllRes);
}

@PostMapping("/{courseId}/date-access")
public ResponseEntity<Void> openCourse(
public ResponseEntity<DateAccessCreateRes> openCourse(
@UserId final Long userId,
@PathVariable final Long courseId,
@RequestBody @Valid final PointUseReq pointUseReq
) {
courseService.openCourse(userId, courseId, pointUseReq);
return ResponseEntity.ok().build();
DateAccessCreateRes dateAccessCreateRes = courseService.openCourse(userId, courseId, pointUseReq);
return ResponseEntity.ok(dateAccessCreateRes);
}

@GetMapping("/{courseId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.dateroad.common.Constants;
import org.dateroad.point.domain.TransactionType;

@Getter
Expand All @@ -15,7 +16,7 @@
public class PointUseReq {
@Builder.Default
@Min(0)
private final int point = 100;
private final int point = Constants.COURSE_CREATE_POINT;
@Builder.Default
private final TransactionType type = TransactionType.POINT_GAINED;
@Builder.Default
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
import lombok.Builder;

@Builder(access = AccessLevel.PRIVATE)
public record DateAccessGetAllRes(
public record CourseAccessGetAllRes(
List<CourseDtoGetRes> courses
) {
public static DateAccessGetAllRes of(List<CourseDtoGetRes> dataAccessCourse) {
return DateAccessGetAllRes.builder()
public static CourseAccessGetAllRes of(List<CourseDtoGetRes> dataAccessCourse) {
return CourseAccessGetAllRes.builder()
.courses(dataAccessCourse)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
import lombok.AccessLevel;
import lombok.Builder;

@Builder(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PRIVATE)
public record CourseCreateRes(
Long courseId
Long courseId,
int userPoint,
Long userCourseCount
) {
public static CourseCreateRes of(final Long courseId) {
public static CourseCreateRes of(final Long courseId, final int userPoint, final Long userCourseCount) {
return CourseCreateRes.builder()
.courseId(courseId)
.userPoint(userPoint)
.userCourseCount(userCourseCount)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.dateroad.course.dto.response;

import lombok.AccessLevel;
import lombok.Builder;

@Builder(access = AccessLevel.PRIVATE)
public record DateAccessCreateRes(
int userPoint,
int userFreeRemained,
Long userPurchaseCount
) {
public static DateAccessCreateRes of(final int userPoint, final int userFreeRemained, final Long userPurchaseCount) {
return DateAccessCreateRes.builder()
.userPoint(userPoint)
.userFreeRemained(userFreeRemained)
.userPurchaseCount(userPurchaseCount)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,19 @@

import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import org.dateroad.code.FailureCode;
import org.dateroad.common.Constants;
import org.dateroad.course.dto.request.CourseCreateEvent;
import org.dateroad.course.dto.request.CourseCreateReq;
import org.dateroad.course.dto.request.CourseGetAllReq;
import org.dateroad.course.dto.request.CoursePlaceGetReq;
import org.dateroad.course.dto.request.PointUseReq;
import org.dateroad.course.dto.request.TagCreateReq;
import org.dateroad.course.dto.response.CourseDtoGetRes;
import org.dateroad.course.dto.response.CourseGetAllRes;
import org.dateroad.course.dto.response.DateAccessGetAllRes;
import org.dateroad.course.dto.response.*;
import org.dateroad.date.domain.Course;
import org.dateroad.date.dto.response.CourseGetDetailRes;
import org.dateroad.date.repository.CourseRepository;
Expand Down Expand Up @@ -139,17 +137,17 @@ private CourseDtoGetRes convertToDto(final Course course, final int likeCount) {
);
}

public DateAccessGetAllRes getMyCourses(Long userId) {
public CourseAccessGetAllRes getMyCourses(Long userId) {
User findUser = getUser(userId);
List<Course> courses = courseRepository.findByUser(findUser);
List<CourseDtoGetRes> courseDtoGetResList = convertToDtoList(courses, Function.identity());
return DateAccessGetAllRes.of(courseDtoGetResList);
return CourseAccessGetAllRes.of(courseDtoGetResList);
}

public DateAccessGetAllRes getAllDataAccessCourse(final Long userId) {
public CourseAccessGetAllRes getAllCourseAccessCourse(final Long userId) {
List<Course> accesses = dateAccessRepository.findCoursesByUserIdOrderByIdDesc(userId);
List<CourseDtoGetRes> courseDtoGetResList = convertToDtoList(accesses, Function.identity());
return DateAccessGetAllRes.of(courseDtoGetResList);
return CourseAccessGetAllRes.of(courseDtoGetResList);
}

public User getUser(final Long userId) {
Expand Down Expand Up @@ -180,9 +178,9 @@ private Like getLike(User findUser, Course findCourse) {

@Transactional
@CacheEvict(value = "courses", allEntries = true)
public Course createCourse(final Long userId, final CourseCreateReq courseRegisterReq,
final List<CoursePlaceGetReq> places, final List<MultipartFile> images,
List<TagCreateReq> tags) {
public CourseCreateRes createCourse(final Long userId, final CourseCreateReq courseRegisterReq,
final List<CoursePlaceGetReq> places, final List<MultipartFile> images,
List<TagCreateReq> tags) {
final float totalTime = places.stream()
.map(CoursePlaceGetReq::getDuration)
.reduce(0.0f, Float::sum);
Expand All @@ -203,8 +201,9 @@ public Course createCourse(final Long userId, final CourseCreateReq courseRegist
String thumbnail = asyncService.createCourseImages(images, newcourse);// 썸
course.setThumbnail(thumbnail);
courseRepository.save(newcourse); // 최종적으로 썸네일을 반영하여 저장
asyncService.publishEvenUserPoint(userId, PointUseReq.of(100, TransactionType.POINT_GAINED, "코스 생성하기"));
return newcourse;
asyncService.publishEvenUserPoint(userId, PointUseReq.of(Constants.COURSE_CREATE_POINT, TransactionType.POINT_GAINED, "코스 등록하기"));
Long userCourseCount = courseRepository.countByUser(user);
return CourseCreateRes.of(newcourse.getId(), user.getTotalPoint() + Constants.COURSE_CREATE_POINT, userCourseCount);
}

@TransactionalEventListener
Expand All @@ -220,13 +219,25 @@ public void handleCourseCreatedEvent(CourseCreateEvent event) {
}

@Transactional
public void openCourse(final Long userId, final Long courseId, final PointUseReq pointUseReq) {
public DateAccessCreateRes openCourse(final Long userId, final Long courseId, final PointUseReq pointUseReq) {
Course course = getCourse(courseId);
User user = getUser(userId);
validateUserAndCourse(user, course);
CoursePaymentType coursePaymentType = validateUserFreeOrPoint(user, pointUseReq.getPoint());
processCoursePayment(coursePaymentType, userId, pointUseReq);
dateAccessRepository.save(DateAccess.create(course, user));
Long userPurchaseCount = dateAccessRepository.countCoursesByUserId(userId);
return calculateUserInfo(coursePaymentType, user.getTotalPoint(), user.getFree(), userPurchaseCount);
}

private DateAccessCreateRes calculateUserInfo(CoursePaymentType coursePaymentType, int userTotalPoint, int userFree, Long userPurchaseCount) {
if (coursePaymentType == CoursePaymentType.FREE) {
return DateAccessCreateRes.of(userTotalPoint, userFree-1, userPurchaseCount);

} else if (coursePaymentType == CoursePaymentType.POINT) {
return DateAccessCreateRes.of(userTotalPoint - Constants.COURSE_OPEN_POINT, userFree, userPurchaseCount);
}
return DateAccessCreateRes.of(userTotalPoint - Constants.COURSE_OPEN_POINT, userFree, userPurchaseCount);
}

private CoursePaymentType validateUserFreeOrPoint(final User user, final int requiredPoints) {
Expand Down
5 changes: 3 additions & 2 deletions dateroad-api/src/main/java/org/dateroad/date/api/DateApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import jakarta.validation.constraints.Pattern;
import org.dateroad.auth.argumentresolve.UserId;
import org.dateroad.date.dto.request.DateCreateReq;
import org.dateroad.date.dto.response.DateCreateRes;
import org.dateroad.date.dto.response.DateDetailRes;
import org.dateroad.date.dto.response.DateGetNearestRes;
import org.dateroad.date.dto.response.DatesGetRes;
Expand Down Expand Up @@ -86,9 +87,9 @@ public interface DateApi {
)
}
)
ResponseEntity<Void> createDate(@Parameter(hidden = true)
ResponseEntity<DateCreateRes> createDate(@Parameter(hidden = true)
@UserId final Long userId,
@RequestBody @Valid final DateCreateReq dateCreateReq);
@RequestBody @Valid final DateCreateReq dateCreateReq);

@Operation(
summary = "지난 & 다가올 데이트 일정 전체 조회 API",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.RequiredArgsConstructor;
import org.dateroad.auth.argumentresolve.UserId;
import org.dateroad.date.dto.request.DateCreateReq;
import org.dateroad.date.dto.response.DateCreateRes;
import org.dateroad.date.dto.response.DateDetailRes;
import org.dateroad.date.dto.response.DatesGetRes;
import org.dateroad.date.dto.response.DateGetNearestRes;
Expand All @@ -20,10 +21,10 @@ public class DateController implements DateApi{
private final DateService dateService;

@PostMapping
public ResponseEntity<Void> createDate(@UserId final Long userId,
@RequestBody @Valid final DateCreateReq dateCreateReq) {
dateService.createDate(userId, dateCreateReq);
return ResponseEntity.status(HttpStatus.CREATED).build();
public ResponseEntity<DateCreateRes> createDate(@UserId final Long userId,
@RequestBody @Valid final DateCreateReq dateCreateReq) {
DateCreateRes dateCreateRes = dateService.createDate(userId, dateCreateReq);
return ResponseEntity.status(HttpStatus.CREATED).body(dateCreateRes);
}

@GetMapping
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.dateroad.date.dto.response;

import lombok.AccessLevel;
import lombok.Builder;

@Builder(access = AccessLevel.PROTECTED)
public record DateCreateRes(
Long dateScheduleNum
) {
public static DateCreateRes of(final Long dateScheduleNum) {
return DateCreateRes.builder()
.dateScheduleNum(dateScheduleNum)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ Optional<Date> findClosestDateByUserIdAndCurrentDate(

List<Date> findAllByUser(final User user);

@Query("select count(d) from Date d where d.user.id = :userId and d.date >= :currentDate")
Long countFutureDatesByUserId(@Param("userId") Long userId, @Param("currentDate") LocalDate currentDate);
}


Loading

0 comments on commit ff1da0f

Please sign in to comment.