Skip to content

Commit

Permalink
Merge pull request #80 from Drink-Easy/feature/wineWishList
Browse files Browse the repository at this point in the history
Feature/wine wish list
  • Loading branch information
jeongyun1206 authored Aug 20, 2024
2 parents 82457a7 + 5833ec0 commit e610172
Show file tree
Hide file tree
Showing 9 changed files with 227 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,12 @@ public enum ErrorStatus implements BaseCode {
WINE_STORE_UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "WINE_STORE4002", "권한이 없는 스토어입니다."),

// WineSale Error
WINE_SALE_NOT_FOUND(HttpStatus.BAD_REQUEST, "WINE_SALE4001", "와인 판매가 없습니다.");
WINE_SALE_NOT_FOUND(HttpStatus.BAD_REQUEST, "WINE_SALE4001", "와인 판매가 없습니다."),

// WineWishlist Error
WINE_WISHLIST_NOT_FOUND(HttpStatus.BAD_REQUEST, "WINE_WISHLIST4001", "와인 위시리스트가 없습니다."),
WINE_WISHLIST_UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "WINE_WISHLIST4002", "권한이 없는 위시리스트입니다."),
WINE_WISHLIST_ALREADY_EXISTS(HttpStatus.BAD_REQUEST, "WINE_WISHLIST4003", "이미 존재하는 위시리스트입니다.");



Expand Down
42 changes: 42 additions & 0 deletions src/main/java/com/drinkeg/drinkeg/controller/WineWishlist.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.drinkeg.drinkeg.controller;

import com.drinkeg.drinkeg.apipayLoad.ApiResponse;
import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.dto.WineWishlistDTO.request.WineWishlistRequestDTO;
import com.drinkeg.drinkeg.dto.WineWishlistDTO.response.WineWishlistResponseDTO;
import com.drinkeg.drinkeg.dto.loginDTO.commonDTO.PrincipalDetail;
import com.drinkeg.drinkeg.service.memberService.MemberService;
import com.drinkeg.drinkeg.service.wineWishlistService.WineWishlistService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/wine-wishlist")
public class WineWishlist {
private final WineWishlistService wineWishlistService;
private final MemberService memberService;

@PostMapping("")
public ApiResponse<WineWishlistResponseDTO> createWineWishlist(@RequestBody WineWishlistRequestDTO wineWishlistRequestDTO, @AuthenticationPrincipal PrincipalDetail principalDetail) {
WineWishlistResponseDTO wineWishlistResponseDTO = wineWishlistService.createWineWishlist(wineWishlistRequestDTO, principalDetail.getUsername());
return ApiResponse.onSuccess(wineWishlistResponseDTO);
}

@GetMapping("")
public ApiResponse<List<WineWishlistResponseDTO>> getWineWishlist(@AuthenticationPrincipal PrincipalDetail principalDetail) {
List<WineWishlistResponseDTO> wineWishlistResponseDTOS = wineWishlistService.getAllWineWishlistByMember(principalDetail.getUsername());
return ApiResponse.onSuccess(wineWishlistResponseDTOS);
}

@DeleteMapping("/{wineWishlistId}")
public ApiResponse<String> deleteWineWishlist(@PathVariable("wineWishlistId") Long wineWishlistId, @AuthenticationPrincipal PrincipalDetail principalDetail) {
wineWishlistService.deleteWineWishlistById(wineWishlistId, principalDetail.getUsername());
return ApiResponse.onSuccess("와인 위시리트스 삭제 완료");
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.drinkeg.drinkeg.converter;

import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.domain.Wine;
import com.drinkeg.drinkeg.domain.WineWishlist;
import com.drinkeg.drinkeg.dto.WineWishlistDTO.response.WineWishlistResponseDTO;

public class WineWishlistConverter {
public static WineWishlistResponseDTO toWineWishlistResponseDTO(WineWishlist wineWishlist) {
return WineWishlistResponseDTO.builder()
.id(wineWishlist.getId())
.wine(WineConverter.toSearchWineDTO(wineWishlist.getWine()))
.build();
}

public static WineWishlist toWineWishlist(Wine wine, Member member) {
return WineWishlist.builder()
.wine(wine)
.member(member)
.build();
}
}
29 changes: 29 additions & 0 deletions src/main/java/com/drinkeg/drinkeg/domain/WineWishlist.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.drinkeg.drinkeg.domain;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import static jakarta.persistence.FetchType.LAZY;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WineWishlist {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "member_id")
private Member member;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "wine_id")
private Wine wine;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.drinkeg.drinkeg.dto.WineWishlistDTO.request;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WineWishlistRequestDTO {
private long wineId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.drinkeg.drinkeg.dto.WineWishlistDTO.response;

import com.drinkeg.drinkeg.dto.WineDTO.response.SearchWineResponseDTO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WineWishlistResponseDTO {
private Long id;
private SearchWineResponseDTO wine;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.drinkeg.drinkeg.repository;

import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.domain.Wine;
import com.drinkeg.drinkeg.domain.WineWishlist;
import com.drinkeg.drinkeg.dto.WineWishlistDTO.response.WineWishlistResponseDTO;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;


public interface WineWishlistRepository extends JpaRepository<WineWishlist, Long> {

List<WineWishlist> findAllByMember(Member member);

Boolean existsByMemberAndWine(Member member, Wine wine);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.drinkeg.drinkeg.service.wineWishlistService;

import com.drinkeg.drinkeg.dto.WineWishlistDTO.request.WineWishlistRequestDTO;
import com.drinkeg.drinkeg.dto.WineWishlistDTO.response.WineWishlistResponseDTO;

import java.util.List;

public interface WineWishlistService {
WineWishlistResponseDTO createWineWishlist(WineWishlistRequestDTO wineWishlistRequestDTO, String username);

List<WineWishlistResponseDTO> getAllWineWishlistByMember(String username);

void deleteWineWishlistById(Long wineWishlistId, String username);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.drinkeg.drinkeg.service.wineWishlistService;

import com.drinkeg.drinkeg.apipayLoad.code.status.ErrorStatus;
import com.drinkeg.drinkeg.converter.WineWishlistConverter;
import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.domain.Wine;
import com.drinkeg.drinkeg.domain.WineWishlist;
import com.drinkeg.drinkeg.dto.WineWishlistDTO.request.WineWishlistRequestDTO;
import com.drinkeg.drinkeg.dto.WineWishlistDTO.response.WineWishlistResponseDTO;
import com.drinkeg.drinkeg.exception.GeneralException;
import com.drinkeg.drinkeg.repository.MemberRepository;
import com.drinkeg.drinkeg.repository.WineRepository;
import com.drinkeg.drinkeg.repository.WineWishlistRepository;
import com.drinkeg.drinkeg.service.memberService.MemberService;
import com.drinkeg.drinkeg.service.wineService.WineService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class WineWishlistServiceImpl implements WineWishlistService{
private final WineWishlistRepository wineWishlistRepository;
private final MemberRepository memberRepository;
private final WineRepository wineRepository;

@Override
public WineWishlistResponseDTO createWineWishlist(WineWishlistRequestDTO wineWishlistRequestDTO, String username) {
Member member = memberRepository.findByUsername(username)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
Wine wine = wineRepository.findById(wineWishlistRequestDTO.getWineId())
.orElseThrow(() -> new GeneralException(ErrorStatus.WINE_NOT_FOUND));

if (wineWishlistRepository.existsByMemberAndWine(member, wine))
throw new GeneralException(ErrorStatus.WINE_WISHLIST_ALREADY_EXISTS);

WineWishlist wineWishlist = wineWishlistRepository.save(WineWishlistConverter.toWineWishlist(wine, member));

return WineWishlistConverter.toWineWishlistResponseDTO(wineWishlist);
}

@Override
public List<WineWishlistResponseDTO> getAllWineWishlistByMember(String username) {
Member member = memberRepository.findByUsername(username)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

return wineWishlistRepository.findAllByMember(member).stream()
.map(WineWishlistConverter::toWineWishlistResponseDTO)
.collect(Collectors.toList());
}

@Override
public void deleteWineWishlistById(Long wineWishlistId, String username) {
Member member = memberRepository.findByUsername(username)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
WineWishlist wineWishlist = wineWishlistRepository.findById(wineWishlistId)
.orElseThrow(() -> new GeneralException(ErrorStatus.WINE_WISHLIST_NOT_FOUND));

if (!wineWishlist.getMember().getId().equals(member.getId()))
throw new GeneralException(ErrorStatus.WINE_WISHLIST_UNAUTHORIZED);

wineWishlistRepository.deleteById(wineWishlistId);
}
}

0 comments on commit e610172

Please sign in to comment.