diff --git a/dateroad-api/src/main/java/org/dateroad/common/Constants.java b/dateroad-api/src/main/java/org/dateroad/common/Constants.java index 14c92ef8..2ef16c98 100644 --- a/dateroad-api/src/main/java/org/dateroad/common/Constants.java +++ b/dateroad-api/src/main/java/org/dateroad/common/Constants.java @@ -5,4 +5,5 @@ public abstract class Constants { 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; } diff --git a/dateroad-api/src/main/java/org/dateroad/course/api/CourseApi.java b/dateroad-api/src/main/java/org/dateroad/course/api/CourseApi.java index 5615ed8c..e16f706f 100644 --- a/dateroad-api/src/main/java/org/dateroad/course/api/CourseApi.java +++ b/dateroad-api/src/main/java/org/dateroad/course/api/CourseApi.java @@ -22,6 +22,7 @@ import org.dateroad.course.dto.response.CourseCreateRes; import org.dateroad.course.dto.response.CourseGetAllRes; 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; @@ -348,7 +349,7 @@ ResponseEntity getAllDataAccessCourse( responseCode = "500", description = "서버 내부 오류입니다.", content = @Content)}) - public ResponseEntity createCourse( + ResponseEntity createCourse( @UserId final Long userId, @RequestPart("course") @Valid final CourseCreateReq courseCreateReq, @RequestPart("tags") @Validated @Size(min = 1, max = 3) final List tags, @@ -467,7 +468,7 @@ ResponseEntity getMyCourses( responseCode = "500", description = "서버 내부 오류입니다.", content = @Content)}) - ResponseEntity openCourse( + ResponseEntity openCourse( @Parameter(hidden = true) @UserId final Long userId, @PathVariable final Long courseId, diff --git a/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java b/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java index 8788661a..13dfd683 100644 --- a/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java +++ b/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java @@ -18,6 +18,7 @@ import org.dateroad.course.dto.response.CourseCreateRes; import org.dateroad.course.dto.response.CourseGetAllRes; 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.dto.response.CourseGetDetailRes; @@ -33,7 +34,6 @@ @RequiredArgsConstructor public class CourseController implements CourseApi { private final CourseService courseService; - private final AsyncService asyncService; @GetMapping public ResponseEntity getAllCourses( @@ -81,13 +81,13 @@ public ResponseEntity getMyCourses(final @UserId Long use } @PostMapping("/{courseId}/date-access") - public ResponseEntity openCourse( + public ResponseEntity 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}") diff --git a/dateroad-api/src/main/java/org/dateroad/course/dto/request/PointUseReq.java b/dateroad-api/src/main/java/org/dateroad/course/dto/request/PointUseReq.java index 453fe964..5952363f 100644 --- a/dateroad-api/src/main/java/org/dateroad/course/dto/request/PointUseReq.java +++ b/dateroad-api/src/main/java/org/dateroad/course/dto/request/PointUseReq.java @@ -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 @@ -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 diff --git a/dateroad-api/src/main/java/org/dateroad/course/dto/response/CourseCreateRes.java b/dateroad-api/src/main/java/org/dateroad/course/dto/response/CourseCreateRes.java index edb93c26..ae78f96d 100644 --- a/dateroad-api/src/main/java/org/dateroad/course/dto/response/CourseCreateRes.java +++ b/dateroad-api/src/main/java/org/dateroad/course/dto/response/CourseCreateRes.java @@ -3,7 +3,7 @@ import lombok.AccessLevel; import lombok.Builder; -@Builder(access = AccessLevel.PROTECTED) +@Builder(access = AccessLevel.PRIVATE) public record CourseCreateRes( Long courseId, int userPoint, diff --git a/dateroad-api/src/main/java/org/dateroad/course/dto/response/DateAccessCreateRes.java b/dateroad-api/src/main/java/org/dateroad/course/dto/response/DateAccessCreateRes.java new file mode 100644 index 00000000..b8ca643e --- /dev/null +++ b/dateroad-api/src/main/java/org/dateroad/course/dto/response/DateAccessCreateRes.java @@ -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(); + } +} diff --git a/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java b/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java index 38145169..d5251444 100644 --- a/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java +++ b/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java @@ -16,10 +16,7 @@ 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.CourseCreateRes; -import org.dateroad.course.dto.response.CourseDtoGetRes; -import org.dateroad.course.dto.response.CourseGetAllRes; -import org.dateroad.course.dto.response.CourseAccessGetAllRes; +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; @@ -222,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) { diff --git a/dateroad-domain/src/main/java/org/dateroad/dateAccess/repository/DateAccessRepository.java b/dateroad-domain/src/main/java/org/dateroad/dateAccess/repository/DateAccessRepository.java index dec749d4..fabc489b 100644 --- a/dateroad-domain/src/main/java/org/dateroad/dateAccess/repository/DateAccessRepository.java +++ b/dateroad-domain/src/main/java/org/dateroad/dateAccess/repository/DateAccessRepository.java @@ -3,7 +3,6 @@ import java.util.List; import org.dateroad.date.domain.Course; import org.dateroad.dateAccess.domain.DateAccess; -import org.dateroad.user.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -26,4 +25,7 @@ public interface DateAccessRepository extends JpaRepository { @Modifying @Query("DELETE FROM UserTag ut WHERE ut.user.id = :userId") void deleteAllByUserId(@Param("userId") Long userId); + + @Query("SELECT COUNT(da.course) FROM DateAccess da WHERE da.user.id = :userId") + Long countCoursesByUserId(@Param("userId") Long userId); }