Skip to content

Commit

Permalink
Merge pull request #131 from Troth-Cam/feat/like
Browse files Browse the repository at this point in the history
feat(#125) : 좋아요 저장 및 삭제 구현
  • Loading branch information
yeon015 authored Aug 12, 2023
2 parents 4918229 + 4133b71 commit 84f7fbd
Show file tree
Hide file tree
Showing 11 changed files with 159 additions and 15 deletions.
3 changes: 2 additions & 1 deletion src/main/java/trothly/trothcam/config/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void configure(WebSecurity web) {
"/auth/google", "/auth/validate-token",
"/auth/check-id/**", "/auth/signup",
"/auth/login", "/auth/logout",
"/h2-console/**", "/health-check", "/sample/**");
"/h2-console/**", "/health-check", "/sample/**", "/api/image/**");
}

// 스프링시큐리티 설정
Expand All @@ -62,6 +62,7 @@ protected void configure(HttpSecurity http) throws Exception {
.antMatchers("/h2-console/**").permitAll()
.antMatchers("/health-check").permitAll()
.antMatchers("/sample/**").permitAll()
.antMatchers("/api/image/**").permitAll()
//.antMatchers("/**").permitAll() // 로그인 개발 끝나면 삭제
.anyRequest().authenticated()
.and()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package trothly.trothcam.controller.web;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import trothly.trothcam.domain.member.Member;
import trothly.trothcam.dto.web.LikeProductReqDto;
import trothly.trothcam.dto.web.LikeResDto;
import trothly.trothcam.exception.base.BaseResponse;
import trothly.trothcam.exception.custom.BadRequestException;
import trothly.trothcam.service.web.LikeProductService;

@RequiredArgsConstructor
@RestController
@RequestMapping("/api/like-product")
public class LikeProductController {

private final LikeProductService likeProductService;

/* 좋아요 저장 */
@PostMapping("")
public BaseResponse<LikeResDto> saveLike(@RequestBody LikeProductReqDto req, @AuthenticationPrincipal Member member) {
if(req.getProductId() == null) {
throw new BadRequestException("존재하지 않는 상품 아이디 입니다.");
}

LikeResDto res = likeProductService.saveLike(req, member);
return BaseResponse.onSuccess(res);
}

/* 좋아요 삭제 */
@DeleteMapping("")
public BaseResponse<LikeResDto> deleteLike(@RequestBody LikeProductReqDto req, @AuthenticationPrincipal Member member) {
if(req.getProductId() == null) {
throw new BadRequestException("존재하지 않는 상품 아이디 입니다.");
}

LikeResDto res = likeProductService.deleteLike(req, member);
return BaseResponse.onSuccess(res);
}
}
4 changes: 4 additions & 0 deletions src/main/java/trothly/trothcam/domain/image/Image.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import trothly.trothcam.domain.core.BaseTimeEntity;
import trothly.trothcam.domain.member.Member;

Expand All @@ -11,6 +13,8 @@
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@DynamicInsert
@DynamicUpdate
@Table(name = "image")
public class Image extends BaseTimeEntity {

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/trothly/trothcam/domain/like/LikeProduct.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,9 @@ public class LikeProduct extends BaseTimeEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;

public LikeProduct(Product product, Member member){
this.product = product;
this.member = member;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package trothly.trothcam.domain.like;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface LikeProductRepository extends JpaRepository<LikeProduct, Long> {

Optional<LikeProduct> findByProductIdAndMemberId(Long productId, Long memberId);

Long countById(Long id);
}
2 changes: 1 addition & 1 deletion src/main/java/trothly/trothcam/domain/product/Product.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public class Product extends BaseTimeEntity {
private int views;

@Column(name = "likes", nullable = false)
private int likes;
private Long likes;

@Column(name = "public_yn", nullable = false)
@Enumerated(EnumType.STRING)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {

List<Product> findAllByMember_WebIdAndPublicYn_Y(String webId); // 공개 인증서 조회
List<Product> findAllByMember_WebIdAndPublicYn_N(String webId); // 비공개 인증서 조회
// List<Product> findAllByMember_WebIdAndPublicYn_Y(String webId); // 공개 인증서 조회
// List<Product> findAllByMember_WebIdAndPublicYn_N(String webId); // 비공개 인증서 조회
}
13 changes: 13 additions & 0 deletions src/main/java/trothly/trothcam/dto/web/LikeProductReqDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package trothly.trothcam.dto.web;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class LikeProductReqDto {
private Long productId;
}
13 changes: 13 additions & 0 deletions src/main/java/trothly/trothcam/dto/web/LikeResDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package trothly.trothcam.dto.web;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class LikeResDto {
private String message;
}
53 changes: 53 additions & 0 deletions src/main/java/trothly/trothcam/service/web/LikeProductService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package trothly.trothcam.service.web;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import trothly.trothcam.domain.like.LikeProduct;
import trothly.trothcam.domain.like.LikeProductRepository;
import trothly.trothcam.domain.member.Member;
import trothly.trothcam.domain.product.Product;
import trothly.trothcam.domain.product.ProductRepository;
import trothly.trothcam.dto.web.LikeProductReqDto;
import trothly.trothcam.dto.web.LikeResDto;
import trothly.trothcam.exception.base.BaseException;
import trothly.trothcam.exception.custom.BadRequestException;

import java.util.Optional;

@Service
@Transactional
@RequiredArgsConstructor
public class LikeProductService {

private final LikeProductRepository likeProductRepository;
private final ProductRepository productRepository;

// 좋아요 저장
public LikeResDto saveLike(LikeProductReqDto req, Member member) throws BaseException {
Optional<LikeProduct> like = likeProductRepository.findByProductIdAndMemberId(req.getProductId(), member.getId());

if(like.isPresent()) {
throw new BadRequestException("이미 좋아요를 누른 상품입니다.");
}

Product product = productRepository.findById(req.getProductId()).orElseThrow(
() -> new BadRequestException("존재하지 않는 상품입니다.")
);

LikeProduct newLike = likeProductRepository.save(new LikeProduct(product, member));

return new LikeResDto("좋아요 성공");
}

// 좋아요 삭제
public LikeResDto deleteLike(LikeProductReqDto req, Member member) throws BaseException {
LikeProduct likeProduct = likeProductRepository.findByProductIdAndMemberId(req.getProductId(), member.getId()).orElseThrow(
() -> new BadRequestException("좋아요를 누르지 않은 상품입니다.")
);

likeProductRepository.deleteById(likeProduct.getId());

return new LikeResDto("좋아요 해제 성공");
}
}
22 changes: 11 additions & 11 deletions src/main/java/trothly/trothcam/service/web/ProductService.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
@RequiredArgsConstructor
public class ProductService {

private final ProductRepository productRepository;

/* 공개 인증서 조회 */
@Transactional(readOnly = true)
public List<Product> findPublicProducts(String webId) throws BaseException {
List<Product> findProducts = productRepository.findAllByMember_WebIdAndPublicYn_Y(webId);
if (findProducts == null || findProducts.isEmpty())
throw new ProductNotFoundException(ErrorCode.PRODUCT_NOT_FOUND);

return findProducts;
}
// private final ProductRepository productRepository;
//
// /* 공개 인증서 조회 */
// @Transactional(readOnly = true)
// public List<Product> findPublicProducts(String webId) throws BaseException {
// List<Product> findProducts = productRepository.findAllByMember_WebIdAndPublicYn_Y(webId);
// if (findProducts == null || findProducts.isEmpty())
// throw new ProductNotFoundException(ErrorCode.PRODUCT_NOT_FOUND);
//
// return findProducts;
// }
}

0 comments on commit 84f7fbd

Please sign in to comment.