Skip to content

Commit

Permalink
Refactor: Shared Pray (#83)
Browse files Browse the repository at this point in the history
  • Loading branch information
baebae02 authored Dec 21, 2023
2 parents 7fbacf1 + e87e5e7 commit b23d990
Show file tree
Hide file tree
Showing 8 changed files with 187 additions and 139 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.uspray.uspray.DTO.sharedpray.request;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import java.util.List;

@Getter
@NoArgsConstructor
@Schema(description = "공유 기도제목 삭제 DTO")
public class SharedPrayDeleteRequestDto {

@NotNull
private List<Long> sharedPrayIds;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,14 @@
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "기도제목 공유 요청 DTO")
public class SharedPrayRequestDto {

@NotNull
private List<Long> prayId;

@NotNull
private List<String> receiverId;
private List<Long> prayIds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.uspray.uspray.DTO.sharedpray.request;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import java.util.List;

@Getter
@NoArgsConstructor
@Schema(description = "공유 기도제목 저장 요청 DTO")
public class SharedPraySaveRequestDto {

@NotNull
private List<Long> sharedPrayIds;

@NotNull
private Long categoryId;
}

This file was deleted.

42 changes: 21 additions & 21 deletions src/main/java/com/uspray/uspray/controller/ShareController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@

import com.uspray.uspray.DTO.ApiResponseDto;
import com.uspray.uspray.DTO.pray.response.PrayResponseDto;
import com.uspray.uspray.DTO.sharedpray.request.SharedPrayDeleteRequestDto;
import com.uspray.uspray.DTO.sharedpray.request.SharedPrayRequestDto;
import com.uspray.uspray.DTO.sharedpray.response.SharedPrayListResponseDto;
import com.uspray.uspray.DTO.sharedpray.request.SharedPraySaveRequestDto;
import com.uspray.uspray.DTO.sharedpray.response.SharedPrayResponseDto;
import com.uspray.uspray.exception.SuccessStatus;
import com.uspray.uspray.service.ShareService;
import com.uspray.uspray.service.ShareFacade;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
Expand All @@ -24,7 +25,6 @@
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
Expand All @@ -34,33 +34,33 @@
@Tag(name = "Shared pray", description = "기도제목 공유 관련 API")
public class ShareController {

private final ShareService shareService;
private final ShareFacade shareFacade;

@GetMapping()
@GetMapping
@ApiResponse(
responseCode = "200",
description = "공유받은 기도제목 조회 (보관함 조회)",
content = @Content(schema = @Schema(implementation = SharedPrayListResponseDto.class))
content = @Content(schema = @Schema(implementation = SharedPrayRequestDto.class))
)
@Operation(summary = "공유받은 기도제목 조회 (보관함 조회)")
public ApiResponseDto<List<SharedPrayResponseDto>> getSharedPrayList(
@Parameter(hidden = true) @AuthenticationPrincipal User user) {
return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS,
shareService.getSharedPrayList(user.getUsername()));
shareFacade.getSharedPrayList(user.getUsername()));
}

@PostMapping()
@PostMapping("/receive")
@ApiResponse(
responseCode = "201",
description = "기도제목 공유",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class))
description = "공유받은 기도제목을 보관함에 넣습니다",
content = @Content(schema = @Schema(implementation = SharedPrayRequestDto.class))
)
@Operation(summary = "기도제목 공유")
public ApiResponseDto<?> sharePray(
@Operation(summary = "기도제목 공유받기")
public ApiResponseDto<?> receiveSharedPray(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@RequestBody SharedPrayRequestDto sharedPrayRequestDto) {
shareService.sharePray(user.getUsername(), sharedPrayRequestDto);
return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_SUCCESS);
shareFacade.receivedSharedPray(user.getUsername(), sharedPrayRequestDto);
return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_SUCCESS, SuccessStatus.SHARE_PRAY_SUCCESS.getMessage());
}

@DeleteMapping()
Expand All @@ -72,22 +72,22 @@ public ApiResponseDto<?> sharePray(
@Operation(summary = "공유받은 기도제목 삭제")
public ApiResponseDto<?> deletePray(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@RequestParam Long sharedPrayId) {
shareService.deleteSharedPray(user.getUsername(), sharedPrayId);
return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS);
@RequestBody SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto) {
shareFacade.deleteSharedPray(user.getUsername(), sharedPrayDeleteRequestDto);
return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, SuccessStatus.DELETE_PRAY_SUCCESS.getMessage());
}

@PostMapping("/save")
@ApiResponse(
responseCode = "201",
description = "공유받은 기도제목 저장",
description = "보관함에 있는 공유받은 기도제목을 개인 기도제목으로 저장합니다",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class))
)
@Operation(summary = "공유받은 기도제목 저장")
public ApiResponseDto<?> savePray(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@RequestParam Long sharedPrayId) {
shareService.saveSharedPray(user.getUsername(), sharedPrayId);
return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_AGREE_SUCCESS);
@RequestBody SharedPraySaveRequestDto sharedPraySaveRequestDto) {
shareFacade.saveSharedPray(user.getUsername(), sharedPraySaveRequestDto);
return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_AGREE_SUCCESS, SuccessStatus.SHARE_PRAY_AGREE_SUCCESS.getMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
import com.uspray.uspray.domain.SharedPray;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

import com.uspray.uspray.exception.ErrorStatus;
import com.uspray.uspray.exception.model.NotFoundException;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
Expand All @@ -16,4 +20,10 @@ public interface SharedPrayRepository extends JpaRepository<SharedPray, Long> {
List<SharedPray> findAllByMemberOrderByCreatedAtDesc(Member member);

List<SharedPray> findAllByCreatedAtBefore(LocalDate threshold);

default SharedPray getSharedPrayById(Long id) {
return this.findById(id).orElseThrow(
() -> new NotFoundException(ErrorStatus.NOT_FOUND_SHARED_PRAY_EXCEPTION,
ErrorStatus.NOT_FOUND_SHARED_PRAY_EXCEPTION.getMessage()));
}
}
116 changes: 116 additions & 0 deletions src/main/java/com/uspray/uspray/service/ShareFacade.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.uspray.uspray.service;

import com.uspray.uspray.DTO.sharedpray.request.SharedPrayDeleteRequestDto;
import com.uspray.uspray.DTO.sharedpray.request.SharedPrayRequestDto;
import com.uspray.uspray.DTO.sharedpray.request.SharedPraySaveRequestDto;
import com.uspray.uspray.DTO.sharedpray.response.SharedPrayResponseDto;
import com.uspray.uspray.Enums.PrayType;
import com.uspray.uspray.domain.Category;
import com.uspray.uspray.domain.Member;
import com.uspray.uspray.domain.Pray;
import com.uspray.uspray.domain.SharedPray;
import com.uspray.uspray.exception.ErrorStatus;
import com.uspray.uspray.exception.model.CustomException;
import com.uspray.uspray.exception.model.NotFoundException;
import com.uspray.uspray.infrastructure.CategoryRepository;
import com.uspray.uspray.infrastructure.MemberRepository;
import com.uspray.uspray.infrastructure.PrayRepository;
import com.uspray.uspray.infrastructure.SharedPrayRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

@Service
@RequiredArgsConstructor
public class ShareFacade {

private final SharedPrayRepository sharedPrayRepository;
private final MemberRepository memberRepository;
private final PrayRepository prayRepository;
private final CategoryRepository categoryRepository;

@Transactional(readOnly = true)
public List<SharedPrayResponseDto> getSharedPrayList(String username) {

Member member = memberRepository.getMemberByUserId(username);
List<SharedPray> sharedPrayList = sharedPrayRepository.findAllByMemberOrderByCreatedAtDesc(member);

return sharedPrayList.stream()
.map(SharedPrayResponseDto::of)
.collect(Collectors.toList());
}

@Transactional
public void receivedSharedPray(String username, SharedPrayRequestDto sharedPrayRequestDto) {

Member member = memberRepository.getMemberByUserId(username);
List<Pray> prayList = prayRepository.findAllByIdIn(sharedPrayRequestDto.getPrayIds());

if (prayList.size() != sharedPrayRequestDto.getPrayIds().size()) {
throw new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION, ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage());
}
for (Pray pray : prayList) {
SharedPray sharedPray = SharedPray.builder()
.member(member)
.pray(pray)
.build();
sharedPrayRepository.save(sharedPray);
}
}

@Transactional
public void saveSharedPray(String username, SharedPraySaveRequestDto sharedPraySaveRequestDto) {

Member member = memberRepository.getMemberByUserId(username);
Category category = categoryRepository.getCategoryById(sharedPraySaveRequestDto.getCategoryId());
List<Long> sharedPrayIds = sharedPraySaveRequestDto.getSharedPrayIds();

for (Long id : sharedPrayIds) {
save(member, id, category);
}
}

private void save(Member member, Long sharedPrayId, Category category) {

SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId);

if (sharedPray.getPray().getDeleted()) {
sharedPrayRepository.deleteById(sharedPrayId);
throw new CustomException(ErrorStatus.PRAY_ALREADY_DELETED_EXCEPTION, ErrorStatus.PRAY_ALREADY_DELETED_EXCEPTION.getMessage());
}
Pray pray = Pray.builder()
.member(member)
.content(sharedPray.getPray().getContent())
.deadline(sharedPray.getPray().getDeadline())
.originPrayId(sharedPray.getPray().getId())
.category(category)
.prayType(PrayType.SHARED)
.build();
prayRepository.save(pray);
sharedPrayRepository.deleteById(sharedPrayId);
}

@Transactional
public void deleteSharedPray(String username, SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto) {

Member member = memberRepository.getMemberByUserId(username);
List<Long> sharedPrayIds = sharedPrayDeleteRequestDto.getSharedPrayIds();

for (Long id : sharedPrayIds) {
delete(member, id);
}
}

private void delete(Member member, Long sharedPrayId) {

SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId);

if (!sharedPray.getMember().equals(member)) {
throw new CustomException(ErrorStatus.DELETE_NOT_AUTHORIZED_EXCEPTION, ErrorStatus.DELETE_NOT_AUTHORIZED_EXCEPTION.getMessage());
}
sharedPrayRepository.deleteById(sharedPrayId);
}
}
Loading

0 comments on commit b23d990

Please sign in to comment.