Skip to content

Commit

Permalink
#104 Feat: 와인 클래스 CRUD API 구현 (#110)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeongyun1206 authored Sep 19, 2024
2 parents 605fa54 + 28ba1d5 commit fe0b996
Show file tree
Hide file tree
Showing 9 changed files with 46 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ public class WineClassController {

@GetMapping("")
public ApiResponse<List<WineClassResponseDTO>> getAllWineClasses(@AuthenticationPrincipal PrincipalDetail principalDetail) {
List<WineClassResponseDTO> wineClassResponseDTOS = wineClassService.getAllWineClasses(principalDetail);
List<WineClassResponseDTO> wineClassResponseDTOS = wineClassService.showAllWineClasses(principalDetail);
return ApiResponse.onSuccess(wineClassResponseDTOS);
}

@GetMapping("/{wineClassId}")
public ApiResponse<WineClassResponseDTO> getWineClassById(@AuthenticationPrincipal PrincipalDetail principalDetail, @PathVariable Long wineClassId) {
WineClassResponseDTO wineClassResponseDTO = wineClassService.getWineClassById(wineClassId, principalDetail);
WineClassResponseDTO wineClassResponseDTO = wineClassService.showWineClassById(wineClassId, principalDetail);
return ApiResponse.onSuccess(wineClassResponseDTO);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
import com.drinkeg.drinkeg.dto.WineClassDTO.request.WineClassRequestDTO;
import com.drinkeg.drinkeg.dto.WineClassDTO.response.WineClassResponseDTO;

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

public class WineClassConverter {

// WineCLass를 WineClassResponseDTO로 변환
Expand All @@ -17,7 +14,7 @@ public static WineClassResponseDTO toWineClassResponseDTO(WineClass wineClass, b
.id(wineClass.getId())
.title(wineClass.getTitle())
.thumbnailUrl(wineClass.getThumbnailUrl())
.content(wineClass.getContent())
.category(wineClass.getCategory())
.isLiked(isLiked)
.build();
}
Expand All @@ -28,7 +25,7 @@ public static WineClass toWineClass(WineClassRequestDTO wineClassRequestDTO, Mem
.author(author)
.title(wineClassRequestDTO.getTitle())
.thumbnailUrl(wineClassRequestDTO.getThumbnailUrl())
.content(wineClassRequestDTO.getContent())
.category(wineClassRequestDTO.getCategory())
.build();
}
}
17 changes: 9 additions & 8 deletions src/main/java/com/drinkeg/drinkeg/domain/WineClass.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import java.util.ArrayList;
import java.util.List;

import static jakarta.persistence.FetchType.LAZY;
import static jakarta.persistence.FetchType.*;

@Entity
@Getter
Expand All @@ -22,16 +22,16 @@ public class WineClass {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "author_id", nullable = false)
private Member author;

private String title;

private String content;
private String category;

private String thumbnailUrl;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "author_id")
private Member author;

@OneToMany(mappedBy = "wineClass", cascade = CascadeType.ALL, orphanRemoval = true)
private List<WineClassBookMark> bookmarks = new ArrayList<>();

Expand All @@ -44,13 +44,14 @@ public WineClass updateThumbnail(String thumbnailUrl) {
return this;
}

public WineClass updateContent(String content) {
this.content = content;
public WineClass updateCategory(String category) {
this.category = category;
return this;
}

public WineClass updateAuthor(Member author) {
this.author = author;
return this;
}

}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.drinkeg.drinkeg.dto.WineClassDTO.request;

import com.drinkeg.drinkeg.domain.Member;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import static jakarta.persistence.FetchType.LAZY;

@Getter
@Builder
@AllArgsConstructor
Expand All @@ -15,6 +19,6 @@ public class WineClassRequestDTO {
private String title;
@NotNull(message = "썸네일은 필수입니다.")
private String thumbnailUrl;
@NotNull(message = "내용은 필수입니다.")
private String content;
@NotNull(message = "카테고리는 필수입니다.")
private String category;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ public class WineClassResponseDTO {
private Long id;
private String title;
private String thumbnailUrl;
private String content;
private String category;
private boolean isLiked;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ public interface WineClassBookMarkService {
public WineClassBookMarkResponseDTO saveWineClassBookMark(PrincipalDetail principalDetail, WineClassBookMarkRequestDTO wineClassBookMarkRequestDTO);
public List<WineClassBookMarkResponseDTO> getWineClassBookMarksByUserId(PrincipalDetail principalDetail);
public void deleteWineClassBookMarkById(PrincipalDetail principalDetail, Long wineClassBookMarkId);

public boolean isLiked(Member member, WineClass wineClass);
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,9 @@ public void deleteWineClassBookMarkById(PrincipalDetail principalDetail, Long wi

wineClassBookMarkRepository.deleteById(wineClassBookMarkId);
}

@Override
public boolean isLiked(Member member, WineClass wineClass) {
return wineClassBookMarkRepository.existsByMemberAndWineClass(member, wineClass);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,10 @@
import java.util.List;

public interface WineClassService {

public List<WineClassResponseDTO> getAllWineClasses(PrincipalDetail principalDetail);

public WineClassResponseDTO getWineClassById(Long wineClassId, PrincipalDetail principalDetail);

// WineClass CRUD
public List<WineClassResponseDTO> showAllWineClasses(PrincipalDetail principalDetail);
public WineClassResponseDTO showWineClassById(Long wineClassId, PrincipalDetail principalDetail);
public void saveWineClass(WineClassRequestDTO wineClassRequestDTO, PrincipalDetail principalDetail);

public WineClassResponseDTO updateWineClass(Long wineClassId, WineClassRequestDTO wineClassRequestDTO, PrincipalDetail principalDetail);

public void deleteWineClass(Long wineClassId, PrincipalDetail principalDetail);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.drinkeg.drinkeg.repository.MemberRepository;
import com.drinkeg.drinkeg.repository.WineClassBookMarkRepository;
import com.drinkeg.drinkeg.repository.WineClassRepository;
import com.drinkeg.drinkeg.service.memberService.MemberService;
import com.drinkeg.drinkeg.service.wineClassBookMarkService.WineClassBookMarkService;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -22,71 +24,62 @@
@RequiredArgsConstructor
public class WineClassServiceImpl implements WineClassService {
private final WineClassRepository wineClassRepository;
private final WineClassBookMarkRepository wineClassBookMarkRepository;
private final MemberRepository memberRepository;
private final WineClassBookMarkService wineClassBookMarkService;
private final MemberService memberService;

@Override
public List<WineClassResponseDTO> getAllWineClasses(PrincipalDetail principalDetail) {
Member member = memberRepository.findByUsername(principalDetail.getUsername())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
public List<WineClassResponseDTO> showAllWineClasses(PrincipalDetail principalDetail) {
Member member = memberService.loadMemberByPrincipleDetail(principalDetail);

List<WineClass> wineClasses = wineClassRepository.findAll();

return wineClasses.stream()
.map(wineClass -> {
boolean isLiked = wineClassBookMarkRepository.existsByMemberAndWineClass(member, wineClass);
return WineClassConverter.toWineClassResponseDTO(wineClass, isLiked);
})
.map(wineClass -> WineClassConverter.toWineClassResponseDTO(wineClass, wineClassBookMarkService.isLiked(member, wineClass)))
.collect(Collectors.toList());
}

@Override
public WineClassResponseDTO getWineClassById(Long wineClassId, PrincipalDetail principalDetail) {
Member member = memberRepository.findByUsername(principalDetail.getUsername())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
public WineClassResponseDTO showWineClassById(Long wineClassId, PrincipalDetail principalDetail) {
Member member = memberService.loadMemberByPrincipleDetail(principalDetail);

WineClass wineClass = wineClassRepository.findById(wineClassId)
.orElseThrow(() -> new GeneralException(ErrorStatus.WINE_CLASS_NOT_FOUND));

boolean isLiked = wineClassBookMarkRepository.existsByMemberAndWineClass(member, wineClass);

return WineClassConverter.toWineClassResponseDTO(wineClass, isLiked);
return WineClassConverter.toWineClassResponseDTO(wineClass, wineClassBookMarkService.isLiked(member, wineClass));
}

@Override
public void saveWineClass(WineClassRequestDTO wineClassRequestDTO, PrincipalDetail principalDetail) {
Member member = memberRepository.findByUsername(principalDetail.getUsername())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
Member member = memberService.loadMemberByPrincipleDetail(principalDetail);

wineClassRepository.save(WineClassConverter.toWineClass(wineClassRequestDTO, member));
}

@Override
@Transactional
public WineClassResponseDTO updateWineClass(Long wineClassId, WineClassRequestDTO wineClassRequestDTO, PrincipalDetail principalDetail) {
Member member = memberRepository.findByUsername(principalDetail.getUsername())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
Member member = memberService.loadMemberByPrincipleDetail(principalDetail);

WineClass wineClass = wineClassRepository.findById(wineClassId)
.orElseThrow(() -> new GeneralException(ErrorStatus.WINE_CLASS_NOT_FOUND));

if (!wineClass.getAuthor().equals(member))
if (!wineClass.getAuthor().equals(member) && !member.getRole().equals("ROLE_ADMIN"))
throw new GeneralException(ErrorStatus.WINE_CLASS_UNAUTHORIZED);

wineClass
.updateTitle(wineClassRequestDTO.getTitle())
.updateThumbnail(wineClassRequestDTO.getThumbnailUrl())
.updateContent(wineClassRequestDTO.getContent());
.updateCategory(wineClassRequestDTO.getCategory());

boolean isLiked = wineClassBookMarkRepository.existsByMemberAndWineClass(member, wineClass);

return WineClassConverter.toWineClassResponseDTO(wineClass, isLiked);
return WineClassConverter.toWineClassResponseDTO(wineClass, wineClassBookMarkService.isLiked(member, wineClass));
}

@Override
public void deleteWineClass(Long wineClassId, PrincipalDetail principalDetail) {
if (!wineClassRepository.existsById(wineClassId))
throw new GeneralException(ErrorStatus.WINE_CLASS_NOT_FOUND);

wineClassRepository.deleteById(wineClassId);
}
}

0 comments on commit fe0b996

Please sign in to comment.