diff --git a/src/main/java/kusitms/gallae/config/BaseResponseStatus.java b/src/main/java/kusitms/gallae/config/BaseResponseStatus.java index 140dedf..53ec39e 100644 --- a/src/main/java/kusitms/gallae/config/BaseResponseStatus.java +++ b/src/main/java/kusitms/gallae/config/BaseResponseStatus.java @@ -15,7 +15,9 @@ public enum BaseResponseStatus { FORBIDDEN(false, HttpStatus.FORBIDDEN, 403, "권한이 없습니다."), NOT_FOUND(false, HttpStatus.NOT_FOUND, 404, "대상을 찾을 수 없습니다."), - ALEADY_EXIST(false, HttpStatus.BAD_REQUEST, 410, "이미 존재합니다."); + ALEADY_EXIST(false, HttpStatus.BAD_REQUEST, 410, "이미 존재합니다."), + + POINT_TRIBE(false, HttpStatus.BAD_REQUEST, 1001, "포인트가 부족합니다."); private final boolean isSuccess; @JsonIgnore diff --git a/src/main/java/kusitms/gallae/config/SpringSecurityConfig.java b/src/main/java/kusitms/gallae/config/SpringSecurityConfig.java index 925e39f..9884e28 100644 --- a/src/main/java/kusitms/gallae/config/SpringSecurityConfig.java +++ b/src/main/java/kusitms/gallae/config/SpringSecurityConfig.java @@ -52,9 +52,12 @@ public SecurityFilterChain SecurityFilterChain(HttpSecurity httpSecurity) throws .authorizeHttpRequests() .requestMatchers("/manager/**").hasRole(Role.MANAGER.getValue()) .requestMatchers("/reviews/saveReview").hasAnyRole(Role.USER.getValue(),Role.MANAGER.getValue()) + .requestMatchers("/reviews/detail").hasAnyRole(Role.USER.getValue(),Role.MANAGER.getValue()) .requestMatchers("/archives/saveArchive").hasAnyRole(Role.USER.getValue(),Role.MANAGER.getValue()) + .requestMatchers("/archives/detail").hasAnyRole(Role.USER.getValue(),Role.MANAGER.getValue()) .requestMatchers("/favorite/**").hasAnyRole(Role.USER.getValue(),Role.MANAGER.getValue()) .requestMatchers("/users/myPosts/**").hasAnyRole(Role.USER.getValue(),Role.MANAGER.getValue()) + .requestMatchers("/point/list/**").hasAnyRole(Role.USER.getValue(),Role.MANAGER.getValue()) .anyRequest().permitAll().and() .exceptionHandling() .authenticationEntryPoint(this.jwtAuthenticationEntryPoint) diff --git a/src/main/java/kusitms/gallae/controller/ArchiveController.java b/src/main/java/kusitms/gallae/controller/ArchiveController.java index 0123bd0..f76b6ca 100644 --- a/src/main/java/kusitms/gallae/controller/ArchiveController.java +++ b/src/main/java/kusitms/gallae/controller/ArchiveController.java @@ -85,6 +85,18 @@ public ResponseEntity> saveArchive( } + @Operation(summary = "자료실 정보 가져오기", description = """ + 포인트가 부족하면 + \n + "isSuccess": false,\n + "code": 1001,\n + "message": "포인트가 부족합니다."\n + 이 반환합니다. + \n + 로그인한 유저는 포인트 15포인트 차감되고 포인트 컬럼 생성됩니다.\n + *주의* 자료실 작성한 유저가 열람 할때는 포인트 차감이 되지 않습니다. + + """) @GetMapping("/detail") public ResponseEntity> getArchiveDetail( Principal principal, diff --git a/src/main/java/kusitms/gallae/controller/PointController.java b/src/main/java/kusitms/gallae/controller/PointController.java new file mode 100644 index 0000000..085a1bc --- /dev/null +++ b/src/main/java/kusitms/gallae/controller/PointController.java @@ -0,0 +1,72 @@ +package kusitms.gallae.controller; + + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Positive; +import kusitms.gallae.config.BaseResponse; +import kusitms.gallae.domain.Program; +import kusitms.gallae.dto.point.PointPageListRes; +import kusitms.gallae.dto.program.ProgramManagerReq; +import kusitms.gallae.dto.program.ProgramPageMangagerRes; +import kusitms.gallae.service.point.PointService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.security.Principal; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/point") +public class PointController { + + @Autowired + private PointService pointService; + + + @Operation(summary = "사용자별 포인트 목록 가져오기", description = """ + 로그인이 되어있어야합니다.\n + type : 적립/사용 -> null이면 전체 \n + period: 1주일/한달/3개월/6개월/1년 -> null이면 전체\n + + 반환에서 userPoint는 현재 유저가 가지고있는 포인트 + totalpage 가 1인 것은 말그대로 페이지 1밖에 없다는 뜻 + size를 10으로 주고 데이터가 92개 이면 페이지는 totalpage는 10 + 10*9 9개와 나머지 2개를 가진 1페이지 + """) + @GetMapping("/list") + public ResponseEntity> findProgramManagerProgress( + Principal principal, + + @Parameter(description = "타입",example = "적립,사용") + @RequestParam(value = "type", required = false) + String type, + + @Parameter(description = "기간",example = "1주일,1달,3개월,6개월,1년") + @RequestParam(value = "period", required = false) + String period, + + @Parameter(description = "페이지 번호") + @Positive(message = "must be greater than 0") + @RequestParam(value = "page", defaultValue = "0") + Integer pageNumber, + + @Parameter(description = "페이징 사이즈 (최대 100)") + @Min(value = 1, message = "must be greater than or equal to 1") + @Max(value = 100, message = "must be less than or equal to 100") + @RequestParam(value = "size", defaultValue = "20") + Integer pagingSize + ){ + PageRequest pageRequest = PageRequest.of(pageNumber,pagingSize); + return ResponseEntity.ok(new BaseResponse<>(this.pointService.getPointList(type,period, + principal.getName(),pageRequest))); + } +} diff --git a/src/main/java/kusitms/gallae/controller/ReviewController.java b/src/main/java/kusitms/gallae/controller/ReviewController.java index 2e9a204..cda876e 100644 --- a/src/main/java/kusitms/gallae/controller/ReviewController.java +++ b/src/main/java/kusitms/gallae/controller/ReviewController.java @@ -92,6 +92,18 @@ public ResponseEntity> saveReview( } + + @Operation(summary = "지원후기 정보 가져오기", description = """ + 포인트가 부족하면 + \n + "isSuccess": false,\n + "code": 1001,\n + "message": "포인트가 부족합니다."\n + 이 반환합니다. + \n + 로그인한 유저는 포인트 10포인트 차감되고 포인트 컬럼 생성됩니다.\n + *주의* 지원후기 작성한 유저가 열람 할때는 포인트 차감이 되지 않습니다. + """) @GetMapping("/detail") public ResponseEntity> getReviewDetail( Principal principal, @@ -100,11 +112,7 @@ public ResponseEntity> getReviewDetail( @RequestParam(value = "reviewId", required = false) Long reviewId ) { - String username = null; - if(principal != null) { - username = principal.getName(); - } - ReviewDetailRes reviewDetail = reviewService.getReviewById(reviewId, username); + ReviewDetailRes reviewDetail = reviewService.getReviewById(reviewId, principal.getName()); return ResponseEntity.ok(new BaseResponse<>(reviewDetail)); } diff --git a/src/main/java/kusitms/gallae/domain/Point.java b/src/main/java/kusitms/gallae/domain/Point.java index 36f43f6..457e4b2 100644 --- a/src/main/java/kusitms/gallae/domain/Point.java +++ b/src/main/java/kusitms/gallae/domain/Point.java @@ -2,15 +2,18 @@ import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; @Entity @Table(name = "points") @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor +@Setter +@NoArgsConstructor(access = AccessLevel.PUBLIC) +@AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder public class Point { @Id @@ -34,4 +37,8 @@ public class Point { @ManyToOne @JoinColumn(name = "user_id") private User user; + + @Column + @CreationTimestamp + private LocalDateTime createdAt; } diff --git a/src/main/java/kusitms/gallae/dto/point/PointListRes.java b/src/main/java/kusitms/gallae/dto/point/PointListRes.java new file mode 100644 index 0000000..760d0ae --- /dev/null +++ b/src/main/java/kusitms/gallae/dto/point/PointListRes.java @@ -0,0 +1,26 @@ +package kusitms.gallae.dto.point; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Data +public class PointListRes { + + + private Long id; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate date; + + @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "HH:mm:ss", timezone = "Asia/Seoul") + private LocalTime time; + + private String type; + + private String activityDetails; + + private Integer pointScore; +} diff --git a/src/main/java/kusitms/gallae/dto/point/PointPageListRes.java b/src/main/java/kusitms/gallae/dto/point/PointPageListRes.java new file mode 100644 index 0000000..49e011e --- /dev/null +++ b/src/main/java/kusitms/gallae/dto/point/PointPageListRes.java @@ -0,0 +1,17 @@ +package kusitms.gallae.dto.point; + + +import lombok.Data; + +import java.util.List; + +@Data +public class PointPageListRes { + + private Integer totalPage; + + private Long userPoint; + + private List points; + +} diff --git a/src/main/java/kusitms/gallae/repository/favorite/FavoriteRepositoryImpl.java b/src/main/java/kusitms/gallae/repository/favorite/FavoriteRepositoryImpl.java index 856c1ae..20470e6 100644 --- a/src/main/java/kusitms/gallae/repository/favorite/FavoriteRepositoryImpl.java +++ b/src/main/java/kusitms/gallae/repository/favorite/FavoriteRepositoryImpl.java @@ -51,9 +51,11 @@ private BooleanBuilder createFavoriteCondition(FavoriteSearchReq favoriteSearchR } if(favoriteSearchReq.getStatus() != null){ - booleanBuilder.and(program.status.eq(Program.ProgramStatus.FINISH)); - }else{ - booleanBuilder.and(program.status.eq(Program.ProgramStatus.SAVE)); + if(favoriteSearchReq.getStatus().contains("모집 중")) { + booleanBuilder.and(program.status.eq(Program.ProgramStatus.SAVE)); + }else{ + booleanBuilder.and(program.status.eq(Program.ProgramStatus.FINISH)); + } } return booleanBuilder; diff --git a/src/main/java/kusitms/gallae/repository/point/PointRepository.java b/src/main/java/kusitms/gallae/repository/point/PointRepository.java new file mode 100644 index 0000000..4a06747 --- /dev/null +++ b/src/main/java/kusitms/gallae/repository/point/PointRepository.java @@ -0,0 +1,7 @@ +package kusitms.gallae.repository.point; + +import kusitms.gallae.domain.Point; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PointRepository extends JpaRepository { +} diff --git a/src/main/java/kusitms/gallae/repository/point/PointRepositoryCustom.java b/src/main/java/kusitms/gallae/repository/point/PointRepositoryCustom.java new file mode 100644 index 0000000..973176e --- /dev/null +++ b/src/main/java/kusitms/gallae/repository/point/PointRepositoryCustom.java @@ -0,0 +1,12 @@ +package kusitms.gallae.repository.point; + +import kusitms.gallae.domain.Point; +import kusitms.gallae.domain.User; +import kusitms.gallae.dto.program.ProgramMainRes; +import kusitms.gallae.dto.program.ProgramSearchReq; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface PointRepositoryCustom { + Page getDynamicPoint(User user, String type, String period, Pageable pageable); +} diff --git a/src/main/java/kusitms/gallae/repository/point/PointRepositoryImpl.java b/src/main/java/kusitms/gallae/repository/point/PointRepositoryImpl.java new file mode 100644 index 0000000..c18070b --- /dev/null +++ b/src/main/java/kusitms/gallae/repository/point/PointRepositoryImpl.java @@ -0,0 +1,77 @@ +package kusitms.gallae.repository.point; + + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.Tuple; +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.Wildcard; +import com.querydsl.jpa.impl.JPAQueryFactory; +import kusitms.gallae.domain.Point; +import kusitms.gallae.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; + +import static kusitms.gallae.domain.QPoint.point; +import static kusitms.gallae.domain.QProgram.program; + +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Repository +public class PointRepositoryImpl implements PointRepositoryCustom{ + + private final JPAQueryFactory jpaQueryFactory; + + + @Override + public Page getDynamicPoint(User user, String type, String period, Pageable pageable ){ + List points = this.jpaQueryFactory + .select(point) + .from(point) + .where(createPointCondition(user, type, period)) + .orderBy(new OrderSpecifier<>(Order.DESC,point.createdAt)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + Long totalSize = this.jpaQueryFactory + .select(Wildcard.count) + .from(point) + .where(createPointCondition(user, type,period)) + .fetchOne(); + + return new PageImpl<>(points, pageable , Objects.requireNonNull(totalSize)); + } + + private BooleanBuilder createPointCondition(User user, String type, String period) { + BooleanBuilder booleanBuilder = new BooleanBuilder(); + booleanBuilder.and(point.user.eq(user)); + if(type != null) { + booleanBuilder.and(point.pointCategory.contains(type)); + } + + if(period != null) { + LocalDateTime now = LocalDateTime.now(); + if(period.contains("1주일")) { + booleanBuilder.and(point.createdAt.goe(now.minusDays(7))); + }else if(period.contains("1달")){ + booleanBuilder.and(point.createdAt.goe(now.minusMonths(1))); + }else if(period.contains("3개월")) { + booleanBuilder.and(point.createdAt.goe(now.minusMonths(3))); + }else if(period.contains("6개월")) { + booleanBuilder.and(point.createdAt.goe(now.minusMonths(6))); + }else{ + booleanBuilder.and(point.createdAt.goe(now.minusYears(1))); + } + } + return booleanBuilder; + } +} diff --git a/src/main/java/kusitms/gallae/service/archive/ArchiveService.java b/src/main/java/kusitms/gallae/service/archive/ArchiveService.java index 05dfa43..039b14e 100644 --- a/src/main/java/kusitms/gallae/service/archive/ArchiveService.java +++ b/src/main/java/kusitms/gallae/service/archive/ArchiveService.java @@ -1,7 +1,10 @@ package kusitms.gallae.service.archive; +import kusitms.gallae.config.BaseException; +import kusitms.gallae.config.BaseResponseStatus; import kusitms.gallae.domain.Archive; +import kusitms.gallae.domain.Point; import kusitms.gallae.domain.Review; import kusitms.gallae.domain.User; import kusitms.gallae.dto.archive.ArchiveDetailRes; @@ -11,12 +14,15 @@ import kusitms.gallae.repository.archive.ArchiveRepository; import kusitms.gallae.repository.archive.ArchiveRespositoryCustom; import kusitms.gallae.repository.favoriteArchiveRepository.FavoriteArchiveRepository; +import kusitms.gallae.repository.point.PointRepository; import kusitms.gallae.repository.user.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.List; import java.util.stream.Collectors; @Service @@ -35,6 +41,8 @@ public class ArchiveService { @Autowired private UserRepository userRepository; + @Autowired + private PointRepository pointRepository; public ArchivePageRes getArchivesByCategory(String category, Pageable pageable) { Page archives = archiveRespositoryCustom.findArchiveDynamicCategory(category,pageable); @@ -69,39 +77,40 @@ public Long postArchive(ArchivePostReq archivePostReq, String username) { archive.setHashtag(archivePostReq.getHashTags()); archive.setLikes(0L); Archive saveArchive = archiveRepository.save(archive); + + //포인트 적립 + Point point = new Point(); + point.setDate(LocalDate.now()); + point.setPointCategory("적립"); + point.setPointActivity("보고서 작성"); + point.setTime(LocalTime.now()); + point.setPointScore(30); + point.setUser(user); + pointRepository.save(point); + user.setPoint(user.getPoint() + 30); + userRepository.save(user); return saveArchive.getId(); } public ArchiveDetailRes getArchiveById(Long archiveId , String username) { - User user = null; - if(username != null) { - user = userRepository.findById(Long.valueOf(username)).orElse(null); + User user = userRepository.findById(Long.valueOf(username)).orElse(null); + if(user.getPoint() < 15 ) throw new BaseException(BaseResponseStatus.POINT_TRIBE); + Archive archive = archiveRepository.findById(archiveId).orElse(null); + if(archive.getUser().getId() != user.getId()) { + //포인트 적립 + Point point = new Point(); + point.setDate(LocalDate.now()); + point.setPointCategory("사용"); + point.setPointActivity("보고서 열람"); + point.setTime(LocalTime.now()); + point.setPointScore(-15); + point.setUser(user); + pointRepository.save(point); + user.setPoint(user.getPoint() - 15); + userRepository.save(user); } - User finalUser = user; - return archiveRepository.findById(archiveId) - .map(archive -> { - ArchiveDetailRes detailRes = new ArchiveDetailRes(); - detailRes.setId(archive.getId()); - detailRes.setCategory(archive.getCategory()); - detailRes.setTitle(archive.getTitle()); - detailRes.setWriter(archive.getWriter()); - detailRes.setFileName(archive.getFileName()); - detailRes.setFileUrl(archive.getFileUrl()); - detailRes.setHashtag(archive.getHashtag()); - detailRes.setBody(archive.getBody()); - detailRes.setCreatedDate(archive.getCreatedAt()); - if(finalUser != null) { - detailRes.setLikeCheck(favoriteArchiveRepository.existsByUserAndArchive(finalUser,archive)); - } - Long prevId = getPreviousArchiveId(archiveId); - Long nextId = getNextArchiveId(archiveId); - - detailRes.setPreviousId(prevId); - detailRes.setNextId(nextId); - - return detailRes; - }) - .orElse(null); + + return convertArchive(archive,user); } @@ -121,5 +130,26 @@ public Page getAllArchivesSortedByLikes(Pageable pageable) { return archiveRepository.findAllByOrderByLikesDesc(pageable); } + private ArchiveDetailRes convertArchive(Archive archive,User user){ + ArchiveDetailRes detailRes = new ArchiveDetailRes(); + detailRes.setId(archive.getId()); + detailRes.setCategory(archive.getCategory()); + detailRes.setTitle(archive.getTitle()); + detailRes.setWriter(archive.getWriter()); + detailRes.setFileName(archive.getFileName()); + detailRes.setFileUrl(archive.getFileUrl()); + detailRes.setHashtag(archive.getHashtag()); + detailRes.setBody(archive.getBody()); + detailRes.setCreatedDate(archive.getCreatedAt()); + if(user != null) { + detailRes.setLikeCheck(favoriteArchiveRepository.existsByUserAndArchive(user,archive)); + } + Long prevId = getPreviousArchiveId(archive.getId()); + Long nextId = getNextArchiveId(archive.getId()); + + detailRes.setPreviousId(prevId); + detailRes.setNextId(nextId); + return detailRes; + } } diff --git a/src/main/java/kusitms/gallae/service/point/PointService.java b/src/main/java/kusitms/gallae/service/point/PointService.java new file mode 100644 index 0000000..efe7d83 --- /dev/null +++ b/src/main/java/kusitms/gallae/service/point/PointService.java @@ -0,0 +1,54 @@ +package kusitms.gallae.service.point; + + +import jakarta.transaction.Transactional; +import kusitms.gallae.domain.Point; +import kusitms.gallae.domain.User; +import kusitms.gallae.dto.point.PointListRes; +import kusitms.gallae.dto.point.PointPageListRes; +import kusitms.gallae.dto.program.ProgramMainRes; +import kusitms.gallae.dto.program.ProgramPageMainRes; +import kusitms.gallae.repository.point.PointRepositoryCustom; +import kusitms.gallae.repository.point.PointRepositoryImpl; +import kusitms.gallae.repository.user.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional +public class PointService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private PointRepositoryCustom pointRepositoryCustom; + + public PointPageListRes getPointList(String type, String period, String username, Pageable pageable) { + User user = userRepository.findById(Long.valueOf(username)).orElse(null); + Page points = pointRepositoryCustom.getDynamicPoint(user,type,period,pageable); + List pageToListNewPrograms = points.getContent(); + List pointListResList = pageToListNewPrograms.stream().map(point -> { + PointListRes pointListRes = new PointListRes(); + pointListRes.setId(point.getPointId()); + pointListRes.setType(point.getPointCategory()); + pointListRes.setActivityDetails(point.getPointActivity()); + pointListRes.setDate(point.getDate()); + pointListRes.setTime(point.getTime()); + pointListRes.setPointScore(point.getPointScore()); + return pointListRes; + }).collect(Collectors.toList()); + PointPageListRes pointPageListRes = new PointPageListRes(); + pointPageListRes.setUserPoint(user.getPoint()); + pointPageListRes.setPoints(pointListResList); + pointPageListRes.setTotalPage(points.getTotalPages()); + return pointPageListRes; + } +} diff --git a/src/main/java/kusitms/gallae/service/review/ReviewService.java b/src/main/java/kusitms/gallae/service/review/ReviewService.java index b132fea..80c0aa1 100644 --- a/src/main/java/kusitms/gallae/service/review/ReviewService.java +++ b/src/main/java/kusitms/gallae/service/review/ReviewService.java @@ -1,4 +1,7 @@ package kusitms.gallae.service.review; +import kusitms.gallae.config.BaseException; +import kusitms.gallae.config.BaseResponseStatus; +import kusitms.gallae.domain.Point; import kusitms.gallae.domain.Review; import kusitms.gallae.domain.User; @@ -7,6 +10,7 @@ import kusitms.gallae.dto.review.ReviewPageRes; import kusitms.gallae.dto.review.ReviewPostReq; import kusitms.gallae.repository.favoriteReviewRepository.FavoriteReviewRepository; +import kusitms.gallae.repository.point.PointRepository; import kusitms.gallae.repository.review.ReviewRepository; import kusitms.gallae.repository.review.ReviewRepositoryCustom; @@ -16,6 +20,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.List; import java.util.stream.Collectors; @@ -34,6 +40,9 @@ public class ReviewService { @Autowired private FavoriteReviewRepository favoriteReviewRepository; + @Autowired + private PointRepository pointRepository; + public ReviewPageRes getReviewsByCategory(String category, Pageable pageable) { Page reviews = reviewRepositoryCustom.findReviewDynamicCategory(category,pageable); @@ -69,41 +78,40 @@ public Long postReivew(ReviewPostReq reviewPostReq,String username) { review.setHashtag(reviewPostReq.getHashTags()); review.setLikes(0L); Review saveReview = reviewRepository.save(review); + + //포인트 적립 + Point point = new Point(); + point.setDate(LocalDate.now()); + point.setPointCategory("적립"); + point.setPointActivity("후기 작성"); + point.setTime(LocalTime.now()); + point.setPointScore(20); + point.setUser(user); + pointRepository.save(point); + user.setPoint(user.getPoint() + 20); + userRepository.save(user); return saveReview.getId(); } public ReviewDetailRes getReviewById(Long reviewId, String username) { - User user = null; - if(username != null) { - user = userRepository.findById(Long.valueOf(username)).orElse(null); + User user = userRepository.findById(Long.valueOf(username)).orElse(null); + if(user.getPoint()<10) throw new BaseException(BaseResponseStatus.POINT_TRIBE); + Review review = reviewRepository.findById(reviewId).orElse(null); + if(review.getUser().getId() != user.getId()) { + //포인트 적립 + Point point = new Point(); + point.setDate(LocalDate.now()); + point.setPointCategory("사용"); + point.setPointActivity("후기 열람"); + point.setTime(LocalTime.now()); + point.setPointScore(-10); + point.setUser(user); + pointRepository.save(point); + user.setPoint(user.getPoint() - 10); + userRepository.save(user); } - User finalUser = user; - return reviewRepository.findById(reviewId) - .map(review -> { - ReviewDetailRes detailRes = new ReviewDetailRes(); - detailRes.setId(review.getId()); - detailRes.setCategory(review.getCategory()); - detailRes.setTitle(review.getTitle()); - detailRes.setWriter(review.getWriter()); - detailRes.setFileName(review.getFileName()); - detailRes.setFileUrl(review.getFileUrl()); - detailRes.setHashtag(review.getHashtag()); - detailRes.setBody(review.getBody()); - detailRes.setCreatedDate(review.getCreatedAt()); - if( finalUser != null) { - detailRes.setLikeCheck(favoriteReviewRepository.existsByUserAndReview(finalUser,review)); - } - Long prevId = getPreviousReviewId(reviewId); - Long nextId = getNextReviewId(reviewId); - - detailRes.setPreviousId(prevId); - detailRes.setNextId(nextId); - - - return detailRes; - }) - .orElse(null); + return convertReview(review,user); } public Long getPreviousReviewId(Long currentId) { @@ -121,4 +129,28 @@ public Long getNextReviewId(Long currentId) { public Page getAllReviewsSortedByLikes(Pageable pageable) { return reviewRepository.findAllByOrderByLikesDesc(pageable); } + + private ReviewDetailRes convertReview(Review review,User user){ + ReviewDetailRes detailRes = new ReviewDetailRes(); + detailRes.setId(review.getId()); + detailRes.setCategory(review.getCategory()); + detailRes.setTitle(review.getTitle()); + detailRes.setWriter(review.getWriter()); + detailRes.setFileName(review.getFileName()); + detailRes.setFileUrl(review.getFileUrl()); + detailRes.setHashtag(review.getHashtag()); + detailRes.setBody(review.getBody()); + detailRes.setCreatedDate(review.getCreatedAt()); + if( user != null) { + detailRes.setLikeCheck(favoriteReviewRepository.existsByUserAndReview(user,review)); + } + Long prevId = getPreviousReviewId(review.getId()); + Long nextId = getNextReviewId(review.getId()); + + detailRes.setPreviousId(prevId); + detailRes.setNextId(nextId); + + + return detailRes; + } }