Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

입덕포인트 생성, 존재 유무 구현 #74 #109

Merged
merged 16 commits into from
Nov 19, 2023
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -1498,3 +1498,53 @@ include::{snippets}/starRating/patchScore/success/http-response.adoc[]
==== 실패시
.http-response
include::{snippets}/starRating/patchScore/failure/http-response.adoc[]


== AttractionPoint
=== POST api/v1/attraction-points
.curl-request
include::{snippets}/postAttractionPoint/success/curl-request.adoc[]

.http-request
include::{snippets}/postAttractionPoint/success/http-request.adoc[]

.request-header
include::{snippets}/postAttractionPoint/success/request-headers.adoc[]

.request-body
include::{snippets}/postAttractionPoint/success/request-body.adoc[]

.request-fields
include::{snippets}/postAttractionPoint/success/request-fields.adoc[]

==== 저장 성공시
.http-response
include::{snippets}/likes/shortReview/save/success/http-response.adoc[]

==== 삭제 성공시
.http-response
include::{snippets}/likes/shortReview/delete/success/http-response.adoc[]

== 입덕포인트 존재 여부
=== GET api/v1/attraction-points/:animeId
.curl-request
include::{snippets}/checkAttractionPoint/isCheck/curl-request.adoc[]

.http-request
include::{snippets}/checkAttractionPoint/isCheck/http-request.adoc[]

.path-parameters
include::{snippets}/checkAttractionPoint/isCheck/path-parameters.adoc[]

.request-header
include::{snippets}/checkAttractionPoint/isCheck/request-headers.adoc[]

=== 짧은 리뷰 좋아요 존재 여부
.http-response
include::{snippets}/checkAttractionPoint/isCheck/http-response.adoc[]

.response-body
include::{snippets}/checkAttractionPoint/isCheck/response-body.adoc[]

.response-fields
include::{snippets}/checkAttractionPoint/isCheck/response-fields.adoc[]
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.oduck.api.domain.attractionPoint.controller;

import io.oduck.api.domain.attractionPoint.dto.AttractionPointReqDto.*;
import io.oduck.api.domain.attractionPoint.service.AttractionPointService;
import io.oduck.api.global.security.auth.dto.AuthUser;
import io.oduck.api.global.security.auth.dto.LoginUser;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping("/attraction-points")
@Slf4j
public class AttractionPointController {

final AttractionPointService attractionPointService;

@PostMapping
public ResponseEntity<?> postAttractionPoint(
@LoginUser AuthUser user,
@RequestBody @Valid AttractionPointReq req){
//TODO: 입덕포인트 작성
attractionPointService.save(user.getId(), req);
return ResponseEntity.ok().build();
}

@GetMapping("/{animeId}")
public ResponseEntity<?> getAttractionPoint(
@LoginUser AuthUser user,
@PathVariable("animeId") Long animeId){
return ResponseEntity.ok(attractionPointService.checkAttractionPoint(user.getId(), animeId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.oduck.api.domain.attractionPoint.dto;

import io.oduck.api.domain.attractionPoint.entity.AttractionElement;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

public class AttractionPointReqDto {

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class AttractionPointReq{
private Long animeId;
@NotNull(message = "입덕포인트를 선택하세요.")
List<AttractionElement> attractionElements;
}


}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package io.oduck.api.domain.attractionPoint.dto;

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

@Getter
@Builder
Expand All @@ -16,4 +18,11 @@ public static class IsAttractionPoint{
private boolean voiceActor;
}

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class CheckAttractionPoint{
private Boolean isAttractionPoint;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public void relateAnime(Anime anime){
}

public void updateElement(AttractionElement attractionElement){
this.attractionElement = attractionElement;
if(!this.attractionElement.equals(attractionElement)){
this.attractionElement = attractionElement;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
package io.oduck.api.domain.attractionPoint.service;

import io.oduck.api.domain.attractionPoint.dto.AttractionPointResDto.IsAttractionPoint;

import io.oduck.api.domain.attractionPoint.dto.AttractionPointReqDto.*;
import io.oduck.api.domain.attractionPoint.dto.AttractionPointResDto.*;
import org.springframework.stereotype.Service;

@Service
public interface AttractionPointService {

//입덕 포인트 추가
void save(Long memberId, AttractionPointReq req);

//입덕 포인트 평가 여부
CheckAttractionPoint checkAttractionPoint(Long memberId, Long animeId);

//입덕포인트 조회(true/false)
IsAttractionPoint isAttractionPoint(Long memberId, Long animeId);
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,32 @@
package io.oduck.api.domain.attractionPoint.service;

import io.oduck.api.domain.attractionPoint.dto.AttractionPointResDto.IsAttractionPoint;
import io.oduck.api.domain.anime.entity.Anime;
import io.oduck.api.domain.anime.repository.AnimeRepository;
import io.oduck.api.domain.attractionPoint.dto.AttractionPointReqDto.*;
import io.oduck.api.domain.attractionPoint.dto.AttractionPointResDto.*;
import io.oduck.api.domain.attractionPoint.entity.AttractionPoint;
import io.oduck.api.domain.attractionPoint.repository.AttractionPointRepository;
import java.util.List;
import java.util.Optional;

import io.oduck.api.domain.member.entity.Member;
import io.oduck.api.domain.member.repository.MemberRepository;
import io.oduck.api.global.exception.BadRequestException;
import io.oduck.api.global.exception.NotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Slf4j
@Service
@RequiredArgsConstructor
public class AttractionPointServiceImpl implements AttractionPointService {

private final AttractionPointRepository attractionPointRepository;
private final MemberRepository memberRepository;
private final AnimeRepository animeRepository;

@Override
public IsAttractionPoint isAttractionPoint(Long memberId, Long animeId) {
boolean drawing = false;
Expand Down Expand Up @@ -41,4 +54,38 @@ public IsAttractionPoint isAttractionPoint(Long memberId, Long animeId) {
.voiceActor(voiceActor)
.build();
}

@Override
@Transactional
public void save(Long memberId, AttractionPointReq req) {
if(checkAttractionPoint(memberId, req.getAnimeId()).getIsAttractionPoint()){
throw new BadRequestException("AttractionPoint is already exists.");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

중복 -> 충돌 -> 409 ConflictException 쓰시면 됩니다~

}

Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new NotFoundException("Member"));

Anime anime = animeRepository.findById(req.getAnimeId())
.orElseThrow(() -> new NotFoundException("Anime"));


for(int i = 0; i < req.getAttractionElements().size(); i++){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

steam으로 쓰실 수 있으면 더 좋습니다

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

감사합니다 수정했습니다!

AttractionPoint attractionPoint = AttractionPoint
.builder()
.member(member)
.anime(anime)
.attractionElement(req.getAttractionElements().get(i))
.build();
attractionPointRepository.save(attractionPoint);
}
}

@Override
public CheckAttractionPoint checkAttractionPoint(Long memberId, Long animeId) {
List<AttractionPoint> findPoint = attractionPointRepository.findAllByAnimeIdAndMemberId(memberId, animeId);
return CheckAttractionPoint
.builder()
.isAttractionPoint(!findPoint.isEmpty())
.build();
}
}
Loading