diff --git a/src/main/java/NextLevel/demo/funding/controller/CouponController.java b/src/main/java/NextLevel/demo/funding/controller/CouponController.java new file mode 100644 index 0000000..adacf27 --- /dev/null +++ b/src/main/java/NextLevel/demo/funding/controller/CouponController.java @@ -0,0 +1,39 @@ +package NextLevel.demo.funding.controller; + +import NextLevel.demo.common.SuccessResponse; +import NextLevel.demo.funding.dto.request.RequestAddCouponDto; +import NextLevel.demo.funding.dto.response.ResponseCouponDto; +import NextLevel.demo.funding.service.CouponService; +import NextLevel.demo.util.jwt.JWTUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class CouponController { + + private final CouponService couponService; + + @PostMapping("/admin/coupon/add") + public ResponseEntity addCoupon(@RequestBody RequestAddCouponDto dto) { + if(dto.getUserId()==null) + dto.setUserId(JWTUtil.getUserIdFromSecurityContext()); + couponService.addCoupon(dto); + return ResponseEntity.ok().body(new SuccessResponse("success", null)); + } + + @GetMapping("/social/coupon") + public ResponseEntity getCoupon() { + List coupons = + couponService.couponList(JWTUtil.getUserIdFromSecurityContext()) + .stream().map(ResponseCouponDto::of).toList(); + return ResponseEntity.ok().body(new SuccessResponse("success", coupons)); + } + +} diff --git a/src/main/java/NextLevel/demo/funding/controller/FundingController.java b/src/main/java/NextLevel/demo/funding/controller/FundingController.java index bc0a590..b75fb9f 100644 --- a/src/main/java/NextLevel/demo/funding/controller/FundingController.java +++ b/src/main/java/NextLevel/demo/funding/controller/FundingController.java @@ -26,7 +26,7 @@ public class FundingController { private final FundingService fundingService; @PostMapping - public ResponseEntity funding(@RequestBody RequestFundingDto dto) { + public ResponseEntity funding(@RequestBody @Valid RequestFundingDto dto) { dto.setUserId(JWTUtil.getUserIdFromSecurityContext()); if(dto.getFree() != null) @@ -37,7 +37,7 @@ public ResponseEntity funding(@RequestBody RequestFundingDto dto) { return ResponseEntity.ok().body(new SuccessResponse("success", null)); } - @DeleteMapping("/delete") + @PostMapping("/delete") public ResponseEntity deleteFunding(@RequestBody RequestCancelFundingDto dto) { dto.setUserId(JWTUtil.getUserIdFromSecurityContext()); if(dto.getFundingType().equals(FundingType.FREE)) diff --git a/src/main/java/NextLevel/demo/funding/dto/request/RequestAddCouponDto.java b/src/main/java/NextLevel/demo/funding/dto/request/RequestAddCouponDto.java new file mode 100644 index 0000000..1e8c565 --- /dev/null +++ b/src/main/java/NextLevel/demo/funding/dto/request/RequestAddCouponDto.java @@ -0,0 +1,33 @@ +package NextLevel.demo.funding.dto.request; + +import NextLevel.demo.funding.entity.CouponEntity; +import NextLevel.demo.user.entity.UserEntity; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@Getter +@Setter +@AllArgsConstructor +public class RequestAddCouponDto { + + private Long userId; + @NotEmpty + private String name; + @NotNull + private Long price; + + public CouponEntity toEntity(UserEntity user) { + return CouponEntity + .builder() + .name(name) + .price(price) + .user(user) + .build(); + } + +} diff --git a/src/main/java/NextLevel/demo/funding/dto/request/RequestOptionFundingDto.java b/src/main/java/NextLevel/demo/funding/dto/request/RequestOptionFundingDto.java index 7e14c8d..3bb9938 100644 --- a/src/main/java/NextLevel/demo/funding/dto/request/RequestOptionFundingDto.java +++ b/src/main/java/NextLevel/demo/funding/dto/request/RequestOptionFundingDto.java @@ -3,6 +3,7 @@ import NextLevel.demo.option.OptionEntity; import NextLevel.demo.funding.entity.OptionFundingEntity; import NextLevel.demo.user.entity.UserEntity; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -12,8 +13,10 @@ @NoArgsConstructor public class RequestOptionFundingDto { + @NotNull private Long optionId; - private Long count; + private Long count = 1L; + private Long couponId; private Long userId; diff --git a/src/main/java/NextLevel/demo/funding/dto/response/ResponseCouponDto.java b/src/main/java/NextLevel/demo/funding/dto/response/ResponseCouponDto.java new file mode 100644 index 0000000..3612197 --- /dev/null +++ b/src/main/java/NextLevel/demo/funding/dto/response/ResponseCouponDto.java @@ -0,0 +1,24 @@ +package NextLevel.demo.funding.dto.response; + +import NextLevel.demo.funding.entity.CouponEntity; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@Getter +@Setter +public class ResponseCouponDto { + + private Long id; + private String name; + private Long percent; + + public static ResponseCouponDto of(CouponEntity couponEntity) { + ResponseCouponDto dto = new ResponseCouponDto(); + dto.id = couponEntity.getId(); + dto.name = couponEntity.getName(); + dto.percent = couponEntity.getPrice(); + return dto; + } +} diff --git a/src/main/java/NextLevel/demo/funding/entity/CouponEntity.java b/src/main/java/NextLevel/demo/funding/entity/CouponEntity.java new file mode 100644 index 0000000..ffa9f46 --- /dev/null +++ b/src/main/java/NextLevel/demo/funding/entity/CouponEntity.java @@ -0,0 +1,48 @@ +package NextLevel.demo.funding.entity; + +import NextLevel.demo.user.entity.UserEntity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "coupon") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder +@AllArgsConstructor +public class CouponEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + private String name; + @Column + private Long price; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private UserEntity user; + + @OneToOne + @JoinColumn(name = "option_funding_id", nullable = true) + private OptionFundingEntity optionFunding; + + public void rollBackUseCoupon() { + optionFunding = null; + } + + public void updateProjectFundingEntity(OptionFundingEntity optionFunding) { + this.optionFunding = optionFunding; + } + +} + +/* +option 펀딩을 한다 +user coupon <-> option funding entity 와 1대 1 관계 (관계의 주인 : coupon) +option funding을 취소 한다 -> update coupon의 option_funding_id = null + +coupon list 조회 : coupon.option_funding.id is null 인 값들만 렌더링 한다 + */ diff --git a/src/main/java/NextLevel/demo/funding/entity/OptionFundingEntity.java b/src/main/java/NextLevel/demo/funding/entity/OptionFundingEntity.java index bbc139e..5021135 100644 --- a/src/main/java/NextLevel/demo/funding/entity/OptionFundingEntity.java +++ b/src/main/java/NextLevel/demo/funding/entity/OptionFundingEntity.java @@ -3,15 +3,7 @@ import NextLevel.demo.BasedEntity; import NextLevel.demo.option.OptionEntity; import NextLevel.demo.user.entity.UserEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -38,6 +30,9 @@ public class OptionFundingEntity extends BasedEntity { @JoinColumn(name = "user_id", nullable = false) private UserEntity user; + @OneToOne(mappedBy = "optionFunding", targetEntity = CouponEntity.class, fetch = FetchType.LAZY) + private CouponEntity coupon; + @Column private long count; diff --git a/src/main/java/NextLevel/demo/funding/repository/CouponRepository.java b/src/main/java/NextLevel/demo/funding/repository/CouponRepository.java new file mode 100644 index 0000000..7f878c0 --- /dev/null +++ b/src/main/java/NextLevel/demo/funding/repository/CouponRepository.java @@ -0,0 +1,18 @@ +package NextLevel.demo.funding.repository; + +import NextLevel.demo.funding.entity.CouponEntity; +import NextLevel.demo.funding.entity.OptionFundingEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Optional; + +public interface CouponRepository extends JpaRepository { + @Query("select c from CouponEntity c where c.user.id = :userId and c.optionFunding.option.id = :optionFundingId") + Optional findByUserIdAndOptionFundingId(@Param("userId") Long userId, @Param("optionFundingId") Long optionFundingId); + + @Query("select c from CouponEntity c where c.optionFunding is null") + List findByUserIdAndOptionFundingIsNull(@Param("userId") Long userId); +} diff --git a/src/main/java/NextLevel/demo/funding/repository/FreeFundingRepository.java b/src/main/java/NextLevel/demo/funding/repository/FreeFundingRepository.java index dd99f97..0aea7f9 100644 --- a/src/main/java/NextLevel/demo/funding/repository/FreeFundingRepository.java +++ b/src/main/java/NextLevel/demo/funding/repository/FreeFundingRepository.java @@ -10,4 +10,7 @@ public interface FreeFundingRepository extends JpaRepository couponList(long userId) { + return couponRepository.findByUserIdAndOptionFundingIsNull(userId); + } + + @Transactional + public long useCoupon(long userId, long couponId, OptionFundingEntity optionFunding, long price) { + CouponEntity coupon = couponRepository.findById(couponId).orElseThrow( + ()->{return new CustomException(ErrorCode.NOT_FOUND, "coupon");} + ); + + if(!coupon.getUser().getId().equals(userId)) + throw new CustomException(ErrorCode.NOT_AUTHOR); + + price -= coupon.getPrice(); + + coupon.updateProjectFundingEntity(optionFunding); + + return price>0?price:0; + } + + public long rollBackUseCoupon(CouponEntity coupon, long price) { + price -= coupon.getPrice(); + coupon.rollBackUseCoupon(); + couponRepository.save(coupon); + return price; + } + +} diff --git a/src/main/java/NextLevel/demo/funding/service/FundingService.java b/src/main/java/NextLevel/demo/funding/service/FundingService.java index 46da8a6..c1977c4 100644 --- a/src/main/java/NextLevel/demo/funding/service/FundingService.java +++ b/src/main/java/NextLevel/demo/funding/service/FundingService.java @@ -5,6 +5,7 @@ import NextLevel.demo.funding.dto.request.RequestCancelFundingDto; import NextLevel.demo.funding.dto.request.RequestFreeFundingDto; import NextLevel.demo.funding.dto.request.RequestOptionFundingDto; +import NextLevel.demo.funding.entity.CouponEntity; import NextLevel.demo.funding.entity.FreeFundingEntity; import NextLevel.demo.option.OptionEntity; import NextLevel.demo.funding.entity.OptionFundingEntity; @@ -32,6 +33,9 @@ public class FundingService { private final OptionFundingRepository optionFundingRepository; private final FreeFundingRepository freeFundingRepository; + private final CouponService couponService; + + @Transactional public void cancelFreeFunding(RequestCancelFundingDto dto) { UserEntity user = userValidateService.getUserInfo(dto.getUserId()); FreeFundingEntity funding = freeFundingRepository.findById(dto.getId()).orElseThrow( @@ -42,14 +46,23 @@ public void cancelFreeFunding(RequestCancelFundingDto dto) { freeFundingRepository.deleteById(dto.getId()); } + @Transactional public void cancelOptionFunding(RequestCancelFundingDto dto) { UserEntity user = userValidateService.getUserInfo(dto.getUserId()); OptionFundingEntity funding = optionFundingRepository.findById(dto.getId()).orElseThrow( ()->{return new CustomException(ErrorCode.NOT_FOUND, "optionFunding");} ); + long price = funding.getCount() * funding.getOption().getPrice(); + if(!user.getId().equals(funding.getUser().getId())) throw new CustomException(ErrorCode.NOT_AUTHOR); + + if(funding.getCoupon() != null){ + price = couponService.rollBackUseCoupon(funding.getCoupon(), price); + } + optionFundingRepository.deleteById(dto.getId()); + user.updatePoint(+price); } @Transactional @@ -57,13 +70,18 @@ public void optionFunding(RequestOptionFundingDto dto) { UserEntity user = userValidateService.getUserInfo(dto.getUserId()); OptionEntity option = optionValidateService.getOption(dto.getOptionId()); + OptionFundingEntity entity = dto.toEntity(user, option); + // validate price <> option.price * count long totalPrice = option.getPrice() * dto.getCount(); + if(dto.getCouponId() != null) + totalPrice = couponService.useCoupon(user.getId(), dto.getCouponId(), entity, totalPrice); if(totalPrice > user.getPoint()) throw new CustomException(ErrorCode.NOT_ENOUGH_POINT, String.valueOf(user.getPoint()), String.valueOf(totalPrice)); - optionFundingRepository.save(dto.toEntity(user, option)); + optionFundingRepository.save(entity); + user.updatePoint(-totalPrice); } @Transactional @@ -75,6 +93,7 @@ public void freeFunding(RequestFreeFundingDto dto) { throw new CustomException(ErrorCode.NOT_ENOUGH_POINT, String.valueOf(user.getPoint()), String.valueOf(dto.getFreePrice())); freeFundingRepository.save(dto.toEntity(user, project)); + user.updatePoint(-dto.getFreePrice()); } } diff --git a/src/main/java/NextLevel/demo/funding/service/FundingValidateService.java b/src/main/java/NextLevel/demo/funding/service/FundingValidateService.java index 0109d49..967c382 100644 --- a/src/main/java/NextLevel/demo/funding/service/FundingValidateService.java +++ b/src/main/java/NextLevel/demo/funding/service/FundingValidateService.java @@ -21,4 +21,11 @@ public Long getTotalFundingPrice(Long projectId) { + (freeFundingPrice != null ? freeFundingPrice : 0); } + public Long getTotalFundingCount(Long projectId) { + Long optionFundingPrice = optionFundingRepository.getTotalFundingCount(projectId); + Long freeFundingPrice = freeFundingRepository.getFundingCount(projectId); + return (optionFundingPrice != null ? optionFundingPrice : 0) + + (freeFundingPrice != null ? freeFundingPrice : 0); + } + } diff --git a/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java b/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java index 08574af..6369d78 100644 --- a/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java +++ b/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java @@ -34,7 +34,7 @@ public class ProjectController { // 추가 @PostMapping("/api1/project") - public ResponseEntity createNewProject(@ModelAttribute CreateProjectDto dto) { + public ResponseEntity createNewProject(@ModelAttribute @Valid CreateProjectDto dto) { Long userId = JWTUtil.getUserIdFromSecurityContext(); dto.setUserId(userId); diff --git a/src/main/java/NextLevel/demo/project/project/dto/request/CreateProjectDto.java b/src/main/java/NextLevel/demo/project/project/dto/request/CreateProjectDto.java index 798e404..e4a89c8 100644 --- a/src/main/java/NextLevel/demo/project/project/dto/request/CreateProjectDto.java +++ b/src/main/java/NextLevel/demo/project/project/dto/request/CreateProjectDto.java @@ -7,6 +7,8 @@ import NextLevel.demo.project.story.entity.ProjectStoryEntity; import NextLevel.demo.project.tag.entity.ProjectTagEntity; import NextLevel.demo.user.entity.UserEntity; + +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -30,15 +32,16 @@ public class CreateProjectDto { private String title; @NotEmpty private String content; - + @NotEmpty private String expired; + @NotNull private Long goal; - private List tags; - @NotNull + private List tags = new ArrayList<>(); + private MultipartFile titleImg; - @NotNull - private List imgs; + + private List imgs = new ArrayList<>(); public ProjectEntity toProjectEntity(UserEntity user, ImgEntity titleImg) { try { diff --git a/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectDetailDto.java b/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectDetailDto.java index b6320f4..c7b6895 100644 --- a/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectDetailDto.java +++ b/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectDetailDto.java @@ -20,9 +20,6 @@ @Builder @AllArgsConstructor public class ResponseProjectDetailDto { - @Value("${page_count}") - private Long PAGE_COUNT; - private Long id; private String title; private String content; @@ -42,25 +39,28 @@ public class ResponseProjectDetailDto { private Double completionRate; private int likeCount; - private int fundingCount; + private long fundingCount; private Long userCount; - public static ResponseProjectDetailDto of(ProjectEntity entity, Long fundingPrice, Long userId) { + public static ResponseProjectDetailDto of(ProjectEntity entity, Long fundingPrice, Long fundingCount, Long userId) { ResponseProjectDetailDto dto = new ResponseProjectDetailDto(); dto.setId(entity.getId()); dto.setTitle(entity.getTitle()); dto.setContent(entity.getContent()); dto.setTitleImg(new ImgDto(entity.getTitleImg())); + dto.setCreatedAt(entity.getCreatedAt()); dto.setExpiredAt(entity.getExpired()); dto.setAuthorNickName(entity.getUser().getNickName()); dto.setGoal(entity.getGoal()); dto.setSum(fundingPrice); dto.setCompletionRate(FundingUtil.getCompletionRate(dto.sum, dto.goal)); dto.setLikeCount(entity.getLikes().size()); - dto.setFundingCount(entity.getFreeFundings().size()); dto.setIsAuthor(entity.getUser().getId() == userId); dto.setIsExpired( LocalDateTime.now().isBefore(entity.getExpired()) ); - dto.userCount = (long) entity.getFreeFundings().size(); + dto.setFundingCount(fundingCount); // 펀딩의 총 갯수 + + dto.setUserCount(null); // 조회한 조회 수, 아직 추가 예정 + return dto; } diff --git a/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectListDetailDto.java b/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectListDetailDto.java index 4f772ae..f129427 100644 --- a/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectListDetailDto.java +++ b/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectListDetailDto.java @@ -31,8 +31,7 @@ public class ResponseProjectListDetailDto { private Long likeCount; private List tags; - - private Long totalCount; + private Long userCount; private Long viewCount; diff --git a/src/main/java/NextLevel/demo/project/project/repository/ProjectDslRepository.java b/src/main/java/NextLevel/demo/project/project/repository/ProjectDslRepository.java index 8b1a607..2b30437 100644 --- a/src/main/java/NextLevel/demo/project/project/repository/ProjectDslRepository.java +++ b/src/main/java/NextLevel/demo/project/project/repository/ProjectDslRepository.java @@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.Arrays; import java.util.List; import static NextLevel.demo.project.tag.entity.QProjectTagEntity.projectTagEntity; @@ -46,7 +47,7 @@ private BooleanExpression whereSearch(QProjectEntity projectEntity, String searc } private BooleanExpression whereTag(QProjectEntity projectEntity, List tagIds){ - if(tagIds != null || !tagIds.isEmpty()) { + if(tagIds != null && !tagIds.isEmpty() && tagIds.get(0) != null) { return JPAExpressions .select(projectTagEntity.id) .from(projectTagEntity) diff --git a/src/main/java/NextLevel/demo/project/project/service/ProjectService.java b/src/main/java/NextLevel/demo/project/project/service/ProjectService.java index 9c163f8..498d88b 100644 --- a/src/main/java/NextLevel/demo/project/project/service/ProjectService.java +++ b/src/main/java/NextLevel/demo/project/project/service/ProjectService.java @@ -57,10 +57,9 @@ public void save(CreateProjectDto dto, ArrayList imgPaths) { UserEntity user = userValidateService.getUserInfo(dto.getUserId()); validateUser(user); - ImgEntity img = null; - try{ - img = imgService.saveImg(dto.getTitleImg(), imgPaths); - }catch (CustomException e){;} + if(dto.getTitleImg() == null || dto.getTitleImg().isEmpty()) + throw new CustomException(ErrorCode.INPUT_REQUIRED_PARAMETER); + ImgEntity img = imgService.saveImg(dto.getTitleImg(), imgPaths); ProjectEntity newProject = projectRepository.save(dto.toProjectEntity(user, img)); @@ -130,8 +129,9 @@ public ResponseProjectDetailDto getProjectDetailById(Long id, Long userId) { projectViewService.save(project, userId); Long fundingPrice = fundingValidateService.getTotalFundingPrice(project.getId()); + Long fundingCount = fundingValidateService.getTotalFundingCount(project.getId()); - return ResponseProjectDetailDto.of(project, fundingPrice, userId); + return ResponseProjectDetailDto.of(project, fundingPrice, fundingCount, userId); } // notice and community and story diff --git a/src/main/java/NextLevel/demo/project/select/SelectProjectListDslRepository.java b/src/main/java/NextLevel/demo/project/select/SelectProjectListDslRepository.java index a50ef0c..554cf6c 100644 --- a/src/main/java/NextLevel/demo/project/select/SelectProjectListDslRepository.java +++ b/src/main/java/NextLevel/demo/project/select/SelectProjectListDslRepository.java @@ -1,6 +1,7 @@ package NextLevel.demo.project.select; import NextLevel.demo.funding.repository.FundingDslRepository; +import NextLevel.demo.img.entity.QImgEntity; import NextLevel.demo.project.project.dto.response.ResponseProjectListDetailDto; import NextLevel.demo.project.project.dto.response.ResponseProjectListDto; import NextLevel.demo.project.project.entity.ProjectEntity; @@ -35,6 +36,7 @@ public class SelectProjectListDslRepository { private QProjectTagEntity projectTagEntity = QProjectTagEntity.projectTagEntity; private QLikeEntity likeEntity = QLikeEntity.likeEntity; private QProjectViewEntity projectViewEntity = QProjectViewEntity.projectViewEntity; + private QImgEntity imgEntity = QImgEntity.imgEntity; public Builder builder() { return new Builder(); } @@ -105,6 +107,7 @@ private List selectProjectsWithSingle ( projectViewEntity.createAt // select distinct 용 컬럼 )) .from(projectEntity) + // .leftJoin(imgEntity).on(projectEntity.titleImg.id.eq(imgEntity.id)).fetchJoin() // .leftJoin(projectTagEntity).on(projectEntity.id.eq(projectTagEntity.project.id)) .leftJoin(likeEntity).on(projectEntity.id.eq(likeEntity.project.id)) .leftJoin(projectViewEntity).on(latestProjectViewOn(projectEntity, projectViewEntity, userId)) @@ -121,6 +124,9 @@ private BooleanExpression latestProjectViewOn( ) { QProjectViewEntity subView = new QProjectViewEntity("subView"); + if(userId == null) + return Expressions.FALSE; + return projectView.id.eq( JPAExpressions .select(subView.id.max()) diff --git a/src/main/java/NextLevel/demo/user/dto/RequestUserCreateDto.java b/src/main/java/NextLevel/demo/user/dto/RequestUserCreateDto.java index 9e47907..bb21fc5 100644 --- a/src/main/java/NextLevel/demo/user/dto/RequestUserCreateDto.java +++ b/src/main/java/NextLevel/demo/user/dto/RequestUserCreateDto.java @@ -18,15 +18,19 @@ public class RequestUserCreateDto { private Long id; + @NotEmpty private String name; + @NotEmpty private String nickName; @NotEmpty private String email; + @NotEmpty private String key; private String address; private String number; private String areaNumber; + @NotEmpty private String password; private String socialProvider; private String socialId; diff --git a/src/main/java/NextLevel/demo/user/dto/user/request/RequestMyPageProjectListDto.java b/src/main/java/NextLevel/demo/user/dto/user/request/RequestMyPageProjectListDto.java index b242279..e90651d 100644 --- a/src/main/java/NextLevel/demo/user/dto/user/request/RequestMyPageProjectListDto.java +++ b/src/main/java/NextLevel/demo/user/dto/user/request/RequestMyPageProjectListDto.java @@ -1,6 +1,7 @@ package NextLevel.demo.user.dto.user.request; import NextLevel.demo.user.repository.MyPageProjectListType; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -15,6 +16,7 @@ public class RequestMyPageProjectListDto { private Long userId; private Integer page = 0; private Long pageCount = 10L; // default 10 + @NotNull private MyPageProjectListType type; public long getLimit() { diff --git a/src/main/java/NextLevel/demo/user/entity/UserEntity.java b/src/main/java/NextLevel/demo/user/entity/UserEntity.java index a6955ce..e3c9936 100644 --- a/src/main/java/NextLevel/demo/user/entity/UserEntity.java +++ b/src/main/java/NextLevel/demo/user/entity/UserEntity.java @@ -84,4 +84,6 @@ public void setNumber(String number) { this.number = StringUtil.getFormattedNumber(number, StringUtil.PHONE_NUMBER_FORMAT); } public void setAreaNumber(String areaNumber) { this.areaNumber = StringUtil.getFormattedNumber(areaNumber, StringUtil.AREA_NUMBER_FORMAT); } + + public void updatePoint(long point) { this.point+= point;} } diff --git a/src/main/java/NextLevel/demo/user/repository/UserProjectDslRepository.java b/src/main/java/NextLevel/demo/user/repository/UserProjectDslRepository.java index 4655163..c14616d 100644 --- a/src/main/java/NextLevel/demo/user/repository/UserProjectDslRepository.java +++ b/src/main/java/NextLevel/demo/user/repository/UserProjectDslRepository.java @@ -1,5 +1,7 @@ package NextLevel.demo.user.repository; +import NextLevel.demo.exception.CustomException; +import NextLevel.demo.exception.ErrorCode; import NextLevel.demo.funding.repository.FundingDslRepository; import NextLevel.demo.project.project.dto.response.ResponseProjectListDto; import NextLevel.demo.project.project.entity.QProjectEntity; @@ -49,6 +51,8 @@ private SelectProjectListDslRepository.Builder where(SelectProjectListDslReposit // projectViewEntity.createAt.desc() // 이건 되면 진짜 // ); break; + default: + throw new CustomException(ErrorCode.NOT_FOUND, "type"); } return builder; } diff --git a/src/main/java/NextLevel/demo/user/service/LikeService.java b/src/main/java/NextLevel/demo/user/service/LikeService.java index e8ee541..71f2437 100644 --- a/src/main/java/NextLevel/demo/user/service/LikeService.java +++ b/src/main/java/NextLevel/demo/user/service/LikeService.java @@ -1,6 +1,7 @@ package NextLevel.demo.user.service; import NextLevel.demo.project.project.entity.ProjectEntity; +import NextLevel.demo.project.project.service.ProjectValidateService; import NextLevel.demo.user.dto.LikeDto; import NextLevel.demo.user.entity.LikeEntity; import NextLevel.demo.user.entity.UserEntity; @@ -17,16 +18,18 @@ public class LikeService { private final EntityManager entityManager; private final LikeRepository likeRepository; + private final ProjectValidateService projectValidateService; @Transactional public void like(LikeDto dto) { + ProjectEntity targetProject = projectValidateService.getProjectEntity(dto.getProjectId()); Optional oldLikeOpt = likeRepository.findByUser_IdAndProject_Id(dto.getUserId(), dto.getProjectId()); if(dto.getLike() && oldLikeOpt.isEmpty()) { // 좋야요를 누름 likeRepository.save(LikeEntity .builder() .user(entityManager.getReference(UserEntity.class, dto.getUserId())) - .project(entityManager.getReference(ProjectEntity.class, dto.getProjectId())) + .project(targetProject) .build()); } if(!dto.getLike() && oldLikeOpt.isPresent()) { diff --git a/src/main/java/NextLevel/demo/user/service/LoginService.java b/src/main/java/NextLevel/demo/user/service/LoginService.java index fd1557c..c1184e1 100644 --- a/src/main/java/NextLevel/demo/user/service/LoginService.java +++ b/src/main/java/NextLevel/demo/user/service/LoginService.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Optional; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; @@ -63,7 +64,7 @@ public UserDetailEntity socialLogin(RequestUserCreateDto socialLoginDto) { // user UserController : post register @ImgTransaction @Transactional - public UserDetailEntity register(RequestUserCreateDto dto, ArrayList imgPaths) { + public UserDetailEntity register(@Valid RequestUserCreateDto dto, ArrayList imgPaths) { userValidateService.checkEmailAndNickNameElseThrow(dto.getEmail(), dto.getNickName()); // save img get uri diff --git a/src/main/java/NextLevel/demo/user/service/UserService.java b/src/main/java/NextLevel/demo/user/service/UserService.java index 05507a9..51bd8cc 100644 --- a/src/main/java/NextLevel/demo/user/service/UserService.java +++ b/src/main/java/NextLevel/demo/user/service/UserService.java @@ -23,6 +23,7 @@ import java.nio.file.Path; import java.util.*; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; @@ -122,7 +123,7 @@ public void updateTempPassword(String email) { // 임시 비밀번호 아직 미 user.getUserDetail().setPassword(randomPassword); } - public ResponseProjectListDto mypageProjectList(RequestMyPageProjectListDto dto) { + public ResponseProjectListDto mypageProjectList(@Valid RequestMyPageProjectListDto dto) { ResponseProjectListDto result = userProjectDslRepository.myProject(dto); if(dto.getType().equals(MyPageProjectListType.VIEW)){