diff --git a/src/main/java/com/uspray/uspray/InitDb.java b/src/main/java/com/uspray/uspray/InitDb.java index eb755ac7..f16bb105 100644 --- a/src/main/java/com/uspray/uspray/InitDb.java +++ b/src/main/java/com/uspray/uspray/InitDb.java @@ -8,7 +8,6 @@ import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.global.enums.Authority; import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; import java.time.LocalDate; import javax.persistence.EntityManager; import lombok.RequiredArgsConstructor; @@ -20,209 +19,209 @@ @RequiredArgsConstructor public class InitDb { - private final InitService initService; + private final InitService initService; // @PostConstruct // public void init() { // initService.dbInit(); // } - @Component - @Transactional - @RequiredArgsConstructor - static class InitService { - - private final EntityManager em; - private final PasswordEncoder passwordEncoder; - - @Transactional - public void dbInit() { - Member member = Member.builder() - .userId("springtest") - .password(passwordEncoder.encode("test")) - .name("홍길동") - .phone("01012345678") - .birth("2002-02-01") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member); - - Member member2 = Member.builder() - .userId("springtest2") - .password(passwordEncoder.encode("test2")) - .name("김길동") - .phone("01012345670") - .birth("2002-02-24") - .gender("male") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member2); - - Member member_mook = Member.builder() - .userId("springwjdanr0869") - .password(passwordEncoder.encode("wjdanr0869")) - .name("김정묵") - .phone("01057770869") - .birth("2001-11-07") - .gender("male") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member_mook); - - Member member3 = Member.builder() - .userId("springtest3") - .password(passwordEncoder.encode("test3")) - .name("이수빈") - .phone("01022223333") - .birth("2001-11-07") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member3); - - Member member4 = Member.builder() - .userId("springtest4") - .password(passwordEncoder.encode("test4")) - .name("권은혜") - .phone("01022223331") - .birth("2001-11-07") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member4); - - Member member5 = Member.builder() - .userId("springtest5") - .password(passwordEncoder.encode("test5")) - .name("배서현") - .phone("01022223931") - .birth("2001-11-07") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member5); - - Group group = Group.builder() - .name("테스트 모임") - .leader(member) - .build(); - em.persist(group); - - GroupMember groupMember = GroupMember.builder() - .group(group) - .member(member) - .build(); - em.persist(groupMember); - - Category category = Category.builder() - .name("기타 카테고리") - .color("#75BD62") - .member(member) - .order(1024) - .categoryType(CategoryType.PERSONAL) - .build(); - em.persist(category); - - Category category1_by_member = Category.builder() - .name("가족") - .color("#75BD62") - .member(member) - .order(2048) - .categoryType(CategoryType.PERSONAL) - .build(); - em.persist(category1_by_member); - - Category category2_by_member2 = Category.builder() - .name("친구") - .color("#75BD62") - .member(member2) - .categoryType(CategoryType.PERSONAL) - .order(1024) - .build(); - em.persist(category2_by_member2); - - Category category3_by_member = Category.builder() - .name("공유 카테고리") - .color("#75BD62") - .member(member) - .categoryType(CategoryType.SHARED) - .order(1024) - .build(); - em.persist(category3_by_member); - - Category category4_by_member2 = Category.builder() - .name("공유 카테고리") - .color("#75BD62") - .member(member2) - .categoryType(CategoryType.SHARED) - .order(1024) - .build(); - em.persist(category4_by_member2); - - Pray pray = Pray.builder() - .content("테스트 기도") - .deadline(LocalDate.parse("2025-01-01")) - .member(member) - .category(category) - .prayType(PrayType.PERSONAL) - .startDate(LocalDate.of(2022, 12, 24)) - .build(); - em.persist(pray); - - Pray pray_1 = Pray.builder() - .content("공유 테스트 기도") - .deadline(LocalDate.parse("2025-01-01")) - .member(member2) - .category(category2_by_member2) - .prayType(PrayType.PERSONAL) - .startDate(LocalDate.of(2023, 12, 24)) - .build(); - em.persist(pray_1); - - Pray pray1 = Pray.builder() - .content("공유 테스트 기도") - .deadline(LocalDate.parse("2025-02-24")) - .member(member) - .category(category3_by_member) - .prayType(PrayType.SHARED) - .startDate(LocalDate.of(2023, 12, 24)) - .originPrayId(pray_1.getId()) - .originMemberId(member2.getId()) - .build(); - em.persist(pray1); - - Pray pray2 = Pray.builder() - .content("테스트 기도") - .deadline(LocalDate.parse("2024-02-24")) - .member(member2) - .category(category4_by_member2) - .prayType(PrayType.SHARED) - .startDate(LocalDate.of(2023, 12, 24)) - .originPrayId(pray.getId()) - .build(); - em.persist(pray2); - - Pray pray3 = Pray.builder() - .content("기도할게요") - .deadline(LocalDate.parse("2024-02-02")) - .member(member) - .category(category1_by_member) - .prayType(PrayType.PERSONAL) - .startDate(LocalDate.of(2023, 12, 24)) - .build(); - em.persist(pray3); - - History history = History.builder() - .pray(pray) - .build(); - em.persist(history); - - History history1 = History.builder() - .pray(pray1) - .build(); - em.persist(history1); - } - - } + @Component + @Transactional + @RequiredArgsConstructor + static class InitService { + + private final EntityManager em; + private final PasswordEncoder passwordEncoder; + + @Transactional + public void dbInit() { + Member member = Member.builder() + .userId("springtest") + .password(passwordEncoder.encode("test")) + .name("홍길동") + .phone("01012345678") + .birth("2002-02-01") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member); + + Member member2 = Member.builder() + .userId("springtest2") + .password(passwordEncoder.encode("test2")) + .name("김길동") + .phone("01012345670") + .birth("2002-02-24") + .gender("male") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member2); + + Member member_mook = Member.builder() + .userId("springwjdanr0869") + .password(passwordEncoder.encode("wjdanr0869")) + .name("김정묵") + .phone("01057770869") + .birth("2001-11-07") + .gender("male") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member_mook); + + Member member3 = Member.builder() + .userId("springtest3") + .password(passwordEncoder.encode("test3")) + .name("이수빈") + .phone("01022223333") + .birth("2001-11-07") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member3); + + Member member4 = Member.builder() + .userId("springtest4") + .password(passwordEncoder.encode("test4")) + .name("권은혜") + .phone("01022223331") + .birth("2001-11-07") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member4); + + Member member5 = Member.builder() + .userId("springtest5") + .password(passwordEncoder.encode("test5")) + .name("배서현") + .phone("01022223931") + .birth("2001-11-07") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member5); + + Group group = Group.builder() + .name("테스트 모임") + .leader(member) + .build(); + em.persist(group); + + GroupMember groupMember = GroupMember.builder() + .group(group) + .member(member) + .build(); + em.persist(groupMember); + + Category category = Category.builder() + .name("기타 카테고리") + .color("#75BD62") + .member(member) + .order(1024) + .categoryType(CategoryType.PERSONAL) + .build(); + em.persist(category); + + Category category1_by_member = Category.builder() + .name("가족") + .color("#75BD62") + .member(member) + .order(2048) + .categoryType(CategoryType.PERSONAL) + .build(); + em.persist(category1_by_member); + + Category category2_by_member2 = Category.builder() + .name("친구") + .color("#75BD62") + .member(member2) + .categoryType(CategoryType.PERSONAL) + .order(1024) + .build(); + em.persist(category2_by_member2); + + Category category3_by_member = Category.builder() + .name("공유 카테고리") + .color("#75BD62") + .member(member) + .categoryType(CategoryType.SHARED) + .order(1024) + .build(); + em.persist(category3_by_member); + + Category category4_by_member2 = Category.builder() + .name("공유 카테고리") + .color("#75BD62") + .member(member2) + .categoryType(CategoryType.SHARED) + .order(1024) + .build(); + em.persist(category4_by_member2); + + Pray pray = Pray.builder() + .content("테스트 기도") + .deadline(LocalDate.parse("2025-01-01")) + .member(member) + .category(category) + .categoryType(CategoryType.PERSONAL) + .startDate(LocalDate.of(2022, 12, 24)) + .build(); + em.persist(pray); + + Pray pray_1 = Pray.builder() + .content("공유 테스트 기도") + .deadline(LocalDate.parse("2025-01-01")) + .member(member2) + .category(category2_by_member2) + .categoryType(CategoryType.PERSONAL) + .startDate(LocalDate.of(2023, 12, 24)) + .build(); + em.persist(pray_1); + + Pray pray1 = Pray.builder() + .content("공유 테스트 기도") + .deadline(LocalDate.parse("2025-02-24")) + .member(member) + .category(category3_by_member) + .categoryType(CategoryType.SHARED) + .startDate(LocalDate.of(2023, 12, 24)) + .originPrayId(pray_1.getId()) + .originMemberId(member2.getId()) + .build(); + em.persist(pray1); + + Pray pray2 = Pray.builder() + .content("테스트 기도") + .deadline(LocalDate.parse("2024-02-24")) + .member(member2) + .category(category4_by_member2) + .categoryType(CategoryType.SHARED) + .startDate(LocalDate.of(2023, 12, 24)) + .originPrayId(pray.getId()) + .build(); + em.persist(pray2); + + Pray pray3 = Pray.builder() + .content("기도할게요") + .deadline(LocalDate.parse("2024-02-02")) + .member(member) + .category(category1_by_member) + .categoryType(CategoryType.PERSONAL) + .startDate(LocalDate.of(2023, 12, 24)) + .build(); + em.persist(pray3); + + History history = History.builder() + .pray(pray) + .build(); + em.persist(history); + + History history1 = History.builder() + .pray(pray1) + .build(); + em.persist(history1); + } + + } } diff --git a/src/main/java/com/uspray/uspray/UsprayApplication.java b/src/main/java/com/uspray/uspray/UsprayApplication.java index 517915de..10098ca2 100644 --- a/src/main/java/com/uspray/uspray/UsprayApplication.java +++ b/src/main/java/com/uspray/uspray/UsprayApplication.java @@ -5,11 +5,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableJpaAuditing @EnableFeignClients @EnableConfigurationProperties +@EnableScheduling public class UsprayApplication { public static void main(String[] args) { diff --git a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java index 48cb73bd..3566e607 100644 --- a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java +++ b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java @@ -5,7 +5,6 @@ public interface CategoryRepositoryCustom { - List findAllWithOrderAndType(String username, String prayType); - - List findAllWithOrderAndType(String username, String prayType, List prayIds); + List findAllWithOrderAndType(String username, String prayType, + List prayIds); } diff --git a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java index 29e56088..9bbc3ccc 100644 --- a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java @@ -1,20 +1,15 @@ package com.uspray.uspray.domain.category.repository.querydsl; import static com.uspray.uspray.domain.category.model.QCategory.category; -import static com.uspray.uspray.domain.member.model.QMember.member; import static com.uspray.uspray.domain.pray.model.QPray.pray; import com.querydsl.jpa.impl.JPAQueryFactory; import com.uspray.uspray.domain.category.model.Category; -import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.dto.pray.response.QPrayResponseDto; -import com.uspray.uspray.domain.pray.model.Pray; -import com.uspray.uspray.global.enums.PrayType; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -22,90 +17,45 @@ @RequiredArgsConstructor public class CategoryRepositoryImpl implements CategoryRepositoryCustom { - private final JPAQueryFactory queryFactory; - - @Override - public List findAllWithOrderAndType(String username, String prayType) { - // 카테고리 목록 가져오기 - List categories = queryFactory - .selectFrom(category) - .where(category.member.userId.eq(username)) - .where(category.categoryType.stringValue().likeIgnoreCase(prayType)) - .orderBy(category.order.asc()) - .fetch(); - - if (categories.isEmpty()) { - return new ArrayList<>(); - } - - // 각 카테고리 별로 PrayResponseDto 목록 가져오기 - List prayListResponseDtos = new ArrayList<>(); - for (Category cat : categories) { - List prays = queryFactory - .selectFrom(pray) - .where(pray.category.id.eq(cat.getId()) - .and(pray.member.userId.eq(username)) - .and(pray.prayType.stringValue().likeIgnoreCase(prayType))) - .orderBy(pray.createdAt.asc()) - .fetch(); - - List prayResponseDtos = prays.stream() - .map(pray_iter -> { - if (pray_iter.getPrayType().equals(PrayType.SHARED)) { - Member originMember = queryFactory - .selectFrom(member) - .where(member.id.eq(pray_iter.getOriginMemberId())) - .fetchOne(); - return PrayResponseDto.shared(pray_iter, originMember); - } else { - return PrayResponseDto.of(pray_iter); - } - }) - .collect(Collectors.toList()); - - prayListResponseDtos.add( - new PrayListResponseDto(cat.getId(), cat.getName(), cat.getColor(), - prayResponseDtos)); - } - return prayListResponseDtos; - } - - @Override - public List findAllWithOrderAndType(String username, String prayType, - List prayIds) { - List categories = queryFactory - .selectFrom(category) - .where(category.member.userId.eq(username)) - .where(category.categoryType.stringValue().likeIgnoreCase(prayType)) - .orderBy(category.order.asc()) - .fetch(); - - // 각 카테고리 별로 PrayResponseDto 목록 가져오기 - List prayListResponseDtos = new ArrayList<>(); - for (Category cat : categories) { - List prayResponseDtos = queryFactory - .select(new QPrayResponseDto( - pray.id, - pray.content, - pray.member.name, - pray.deadline, - pray.category.id, - pray.category.name, - pray.lastPrayedAt, - pray.isShared - )) - .from(pray) - .where(pray.category.id.eq(cat.getId()) - .and(pray.member.userId.eq(username)) - .and(pray.prayType.stringValue().likeIgnoreCase(prayType))) - .fetch(); - prayResponseDtos.removeIf(p -> !prayIds.contains(p.getPrayId())); - prayResponseDtos.forEach(p -> p.setInGroup(true)); - - prayListResponseDtos.add( - new PrayListResponseDto(cat.getId(), cat.getName(), cat.getColor(), - prayResponseDtos)); - } - return prayListResponseDtos; - } + private final JPAQueryFactory queryFactory; + + + @Override + public List findAllWithOrderAndType(String username, String prayType, + List prayIds) { + List categories = queryFactory + .selectFrom(category) + .where(category.member.userId.eq(username)) + .where(category.categoryType.stringValue().likeIgnoreCase(prayType)) + .orderBy(category.order.asc()) + .fetch(); + + // 각 카테고리 별로 PrayResponseDto 목록 가져오기 + List prayListResponseDtos = new ArrayList<>(); + for (Category cat : categories) { + List prayResponseDtos = queryFactory + .select(new QPrayResponseDto( + pray.id, + pray.content, + pray.member.name, + pray.deadline, + pray.category.id, + pray.category.name, + pray.lastPrayedAt, + pray.isShared + )) + .from(pray) + .where(pray.category.id.eq(cat.getId()) + .and(pray.member.userId.eq(username)) + .and(pray.categoryType.stringValue().likeIgnoreCase(prayType))) + .fetch(); + prayResponseDtos.removeIf(p -> !prayIds.contains(p.getPrayId())); + prayResponseDtos.forEach(p -> p.setInGroup(true)); + + prayListResponseDtos.add( + new PrayListResponseDto(cat.getId(), cat.getName(), cat.getColor(), + prayResponseDtos)); + } + return prayListResponseDtos; + } } diff --git a/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java b/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java index e4122c5f..f278d4b9 100644 --- a/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java +++ b/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java @@ -7,7 +7,6 @@ import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; -import com.uspray.uspray.domain.pray.repository.PrayRepository; import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; @@ -22,133 +21,135 @@ @RequiredArgsConstructor public class CategoryService { - private final MemberRepository memberRepository; - private final CategoryRepository categoryRepository; - private final PrayRepository prayRepository; -// private final PrayFacade prayFacade; - - public List getCategoryListByMemberAndCategoryType(Member member, CategoryType categoryType) { - return categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc(member, categoryType); - } - - private static int getNewOrder(int index, List categories, Category category) { - Category targetPosition = categories.get(index - 1); - - if (targetPosition.equals(category)) { // 원하는 위치가 지금 내 위치와 같으면 - return targetPosition.getOrder(); - } - - if (index == 1) { // 원하는 위치가 첫번째면 - return getFirstPositionOrder(categories); - } - - if (index == categories.size()) { // 원하는 위치가 마지막이면 - return getLastPositionOrder(targetPosition); - } - return getMiddlePositionOrder(targetPosition, category, categories, index); - } - - private static void validateIndex(int index, int size) { - if (index < 1 || index > size) { - throw new NotFoundException(ErrorStatus.INDEX_OUT_OF_BOUND_EXCEPTION); - } - } - - private static int getFirstPositionOrder(List categories) { - return categories.get(0).getOrder() / 2; - } - - private static int getLastPositionOrder(Category prevCategory) { - return prevCategory.getOrder() + 1024; - } - - private static int getMiddlePositionOrder(Category targetCategory, Category currCategory, - List categories, int index) { - // 원하는 위치가 내 위치보다 앞이면 원하는 자리와 그 앞자리 중간으로 - // 원하는 위치가 내 위치보다 뒤면 원하는 자리와 그 뒷자리 중간으로 - int prevIndex = targetCategory.getOrder() < currCategory.getOrder() ? index - 2 : index; - return (targetCategory.getOrder() + categories.get(prevIndex).getOrder()) / 2; - } - - public Category getCategoryById(Long categoryId) { - return categoryRepository.findById(categoryId).orElseThrow(() -> new CustomException(ErrorStatus.CATEGORY_NOT_FOUND_EXCEPTION)); - } - - public Category getCategoryByIdAndMemberAndType(Long categoryId, Member member, - CategoryType categoryType) { - return categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, categoryType) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - } - - public List findAllWithOrderAndType(String username, String prayType, - List prayIds) { - return categoryRepository.findAllWithOrderAndType(username, prayType, prayIds); - } - - public CategoryResponseDto createCategory(String username, - CategoryRequestDto categoryRequestDto) { - Member member = memberRepository.getMemberByUserId(username); - int maxCategoryOrder = categoryRepository.checkDuplicateAndReturnMaxOrder( - categoryRequestDto.getName(), member, - CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); - Category category = categoryRequestDto.toEntity(member, maxCategoryOrder + 1024); - categoryRepository.save(category); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto deleteCategory(Category category) { - categoryRepository.delete(category); - return CategoryResponseDto.of(category); - } - - @Transactional - public CategoryResponseDto updateCategory(String username, Long categoryId, - CategoryRequestDto categoryRequestDto) { - Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, - memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - if (categoryRequestDto.getName() != null && !categoryRequestDto.getName() - .equals(category.getName())) { - categoryRepository.checkDuplicate(categoryRequestDto.getName(), category.getMember(), - CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); - } - category.update(categoryRequestDto); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto getCategory(String username, Long categoryId) { - Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, - memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - return CategoryResponseDto.of(category); - } - - @Transactional - public CategoryResponseDto updateCategoryOrder(String username, Long categoryId, int index) { - Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, - CategoryType.PERSONAL) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( - member, category.getCategoryType()); - - validateIndex(index, categories.size()); - int newOrder = getNewOrder(index, categories, category); - - category.updateOrder(newOrder); - - categoryRepository.save(category); - - return CategoryResponseDto.of(category); - } - - public List getCategoryList(String username, String categoryType) { - Member member = memberRepository.getMemberByUserId(username); - CategoryType convertCategoryType = CategoryType.valueOf(categoryType.toUpperCase()); - List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( - member, convertCategoryType); - return categories.stream() - .map(CategoryResponseDto::of) - .collect(Collectors.toList()); - } + private final MemberRepository memberRepository; + private final CategoryRepository categoryRepository; + + private static int getNewOrder(int index, List categories, Category category) { + Category targetPosition = categories.get(index - 1); + + if (targetPosition.equals(category)) { // 원하는 위치가 지금 내 위치와 같으면 + return targetPosition.getOrder(); + } + + if (index == 1) { // 원하는 위치가 첫번째면 + return getFirstPositionOrder(categories); + } + + if (index == categories.size()) { // 원하는 위치가 마지막이면 + return getLastPositionOrder(targetPosition); + } + return getMiddlePositionOrder(targetPosition, category, categories, index); + } + + private static void validateIndex(int index, int size) { + if (index < 1 || index > size) { + throw new NotFoundException(ErrorStatus.INDEX_OUT_OF_BOUND_EXCEPTION); + } + } + + private static int getFirstPositionOrder(List categories) { + return categories.get(0).getOrder() / 2; + } + + private static int getLastPositionOrder(Category prevCategory) { + return prevCategory.getOrder() + 1024; + } + + private static int getMiddlePositionOrder(Category targetCategory, Category currCategory, + List categories, int index) { + // 원하는 위치가 내 위치보다 앞이면 원하는 자리와 그 앞자리 중간으로 + // 원하는 위치가 내 위치보다 뒤면 원하는 자리와 그 뒷자리 중간으로 + int prevIndex = targetCategory.getOrder() < currCategory.getOrder() ? index - 2 : index; + return (targetCategory.getOrder() + categories.get(prevIndex).getOrder()) / 2; + } + + public List getCategoryListByMemberAndCategoryType(Member member, + CategoryType categoryType) { + return categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc(member, + categoryType); + } + + + public Category getCategoryById(Long categoryId) { + return categoryRepository.findById(categoryId) + .orElseThrow(() -> new CustomException(ErrorStatus.CATEGORY_NOT_FOUND_EXCEPTION)); + } + + public Category getCategoryByIdAndMemberAndType(Long categoryId, Member member, + CategoryType categoryType) { + return categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, categoryType) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + } + + public List findAllWithOrderAndType(String username, String prayType, + List prayIds) { + return categoryRepository.findAllWithOrderAndType(username, prayType, prayIds); + } + + public CategoryResponseDto createCategory(String username, + CategoryRequestDto categoryRequestDto) { + Member member = memberRepository.getMemberByUserId(username); + int maxCategoryOrder = categoryRepository.checkDuplicateAndReturnMaxOrder( + categoryRequestDto.getName(), member, + CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); + Category category = categoryRequestDto.toEntity(member, maxCategoryOrder + 1024); + categoryRepository.save(category); + return CategoryResponseDto.of(category); + } + + public CategoryResponseDto deleteCategory(Category category) { + categoryRepository.delete(category); + return CategoryResponseDto.of(category); + } + + @Transactional + public CategoryResponseDto updateCategory(String username, Long categoryId, + CategoryRequestDto categoryRequestDto) { + Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, + memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + if (categoryRequestDto.getName() != null && !categoryRequestDto.getName() + .equals(category.getName())) { + categoryRepository.checkDuplicate(categoryRequestDto.getName(), category.getMember(), + CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); + } + category.update(categoryRequestDto); + return CategoryResponseDto.of(category); + } + + public CategoryResponseDto getCategory(String username, Long categoryId) { + Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, + memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + return CategoryResponseDto.of(category); + } + + @Transactional + public CategoryResponseDto updateCategoryOrder(String username, Long categoryId, int index) { + Member member = memberRepository.getMemberByUserId(username); + Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, + CategoryType.PERSONAL) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( + member, category.getCategoryType()); + + validateIndex(index, categories.size()); + int newOrder = getNewOrder(index, categories, category); + + category.updateOrder(newOrder); + + categoryRepository.save(category); + + return CategoryResponseDto.of(category); + } + + public List getCategoryList(String username, String categoryType) { + Member member = memberRepository.getMemberByUserId(username); + CategoryType convertCategoryType = CategoryType.valueOf(categoryType.toUpperCase()); + List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( + member, convertCategoryType); + return categories.stream() + .map(CategoryResponseDto::of) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java b/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java index 86caa23e..781abd02 100644 --- a/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java @@ -17,7 +17,6 @@ import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.service.PrayService; import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.push.model.NotificationLog; @@ -41,183 +40,183 @@ @RequiredArgsConstructor public class GroupPrayFacade { - private final FCMNotificationService fcmNotificationService; - private final MemberService memberService; - private final PrayService prayService; - private final GroupPrayService groupPrayService; - private final GroupMemberService groupMemberService; - private final GroupService groupService; - private final CategoryService categoryService; - private final ScrapAndHeartService scrapAndHeartService; - - @Transactional - public void prayToGroupPray(PrayToGroupPrayDto prayToGroupPrayDto, String userId) { - Member member = memberService.findMemberByUserId(userId); - Group group = groupService.getGroupById(prayToGroupPrayDto.getGroupId()); - - List existIds = group.getGroupPrayList().stream() - .map(gp -> gp.getOriginPray().getId()) - .collect(Collectors.toList()); - if (existIds.stream().anyMatch(id -> id.equals(prayToGroupPrayDto.getPrayId()))) { - throw new CustomException(ErrorStatus.ALREADY_EXIST_GROUP_PRAY_EXCEPTION); - } - - List mainPray = prayService.findAllByIdIn(prayToGroupPrayDto.getPrayId()); - List targetPray = prayService.findAllByOriginPrayIdIn( - prayToGroupPrayDto.getPrayId()); - - for (Pray p : mainPray) { - GroupPray groupPray = GroupPray.builder() - .group(group) - .author(member) - .content(new String(Base64.getDecoder().decode(p.getContent().getBytes()))) - .deadline(p.getDeadline()) - .build(); - p.setGroupPray(groupPray); - groupPrayService.saveGroupPray(groupPray); - p.setIsShared(); - - ScrapAndHeart scrapAndHeart = ScrapAndHeart.builder() - .groupPray(groupPray) - .member(member) - .build(); - scrapAndHeartService.save(scrapAndHeart); - - for (Pray TP : targetPray) { - ScrapAndHeart targetScrapAndHeart = ScrapAndHeart.builder() - .groupPray(groupPray) - .member(TP.getMember()) - .build(); - targetScrapAndHeart.scrapPray(TP); - scrapAndHeartService.save(targetScrapAndHeart); - } - } - } - - public List getPrayList(String username, String prayType, Long groupId) { - List prayIds = groupPrayService.getOriginPrayIdsByGroupId(groupId); - return categoryService.findAllWithOrderAndType(username, prayType, prayIds); - } - - - @Transactional - public void createGroupPray(GroupPrayRequestDto groupPrayRequestDto, String userId) { - Member author = memberService.findMemberByUserId(userId); - Group group = groupService.getGroupById(groupPrayRequestDto.getGroupId()); - GroupPray groupPray = GroupPray.of(group, author, groupPrayRequestDto.getDeadline(), - groupPrayRequestDto.getContent()); - - groupPrayService.saveGroupPray(groupPray); - scrapAndHeartService.save(ScrapAndHeart.createdByGroupPrayOf(groupPray, author)); - - Category category = categoryService.getCategoryByIdAndMemberAndType( - groupPrayRequestDto.getCategoryId(), author, CategoryType.PERSONAL); - - prayService.savePray(Pray.createdByGroupPrayOf(author, groupPrayRequestDto.getContent(), - groupPrayRequestDto.getDeadline(), category, PrayType.PERSONAL, groupPray, true)); - } - - @Transactional(readOnly = true) - public GroupPrayRappingDto getGroupPray(Long groupId, String userId) { - - Member member = memberService.findMemberByUserId(userId); - Group group = groupService.getGroupById(groupId); - - List groupPrays = groupPrayService.findGroupPraysByGroup(group); - Long count = scrapAndHeartService.countHeart(groupPrays); - - List groupPrayList = new ArrayList<>(); - for (GroupPray groupPray : groupPrays) { - ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( - groupPray, member).orElse(null); - groupPrayList.add(GroupPrayResponseDto.builder() - .groupPray(groupPray) - .member(member) - .scrapAndHeart(scrapAndHeart) - .build()); - } - - GroupMember groupMember = groupMemberService.getGroupMemberByGroupAndMember(group, member); - - return new GroupPrayRappingDto(count, groupMember.getNotificationAgree(), - makeSortedTreeMap(groupPrayList)); - } - - private Map> makeSortedTreeMap( - List groupPrayList) { - // 역순으로 정렬하는 트리맵 정의 - Map> sortedMap = new TreeMap<>( - Comparator.reverseOrder()); - - // 트리맵에 날짜별로 그룹화 된 기도제목 리스트 입력 - sortedMap.putAll(groupPrayList.stream() - .collect(Collectors.groupingBy(GroupPrayResponseDto::getCreatedAt))); - - // 날짜별로 그룹화 된 기도제목을 기도제목 id 순으로 정렬 - for (Map.Entry> entry : sortedMap.entrySet()) { - List value = entry.getValue(); - value.sort(Comparator.comparing(GroupPrayResponseDto::getGroupPrayId).reversed()); - } - return sortedMap; - } - - @Transactional - public void heartGroupPray(Long groupPrayId, String userId) throws IOException { - GroupPray groupPray = groupPrayService.getGroupPrayById(groupPrayId); - Member member = memberService.findMemberByUserId(userId); - - ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( - groupPray, member) - .orElse(ScrapAndHeart.builder() - .groupPray(groupPray) - .member(member) - .build()); - - scrapAndHeart.heartPray(); - scrapAndHeartService.save(scrapAndHeart); - sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), true); - } - - @Transactional - public void scrapGroupPray(ScrapRequestDto scrapRequestDto, String userId) throws IOException { - Member member = memberService.findMemberByUserId(userId); - Category category = categoryService.getCategoryByIdAndMemberAndType( - scrapRequestDto.getCategoryId(), member, CategoryType.SHARED); - GroupPray groupPray = groupPrayService.getGroupPrayById( - scrapRequestDto.getGroupPrayId()); - - Pray pray = makePray(scrapRequestDto, groupPray, member, category); - prayService.savePray(pray); - - ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( - groupPray, member).orElse(ScrapAndHeart.createdByScrapOf(groupPray, member, pray)); - - scrapAndHeart.scrapPray(pray); - scrapAndHeartService.save(scrapAndHeart); - sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), false); - } - - private Pray makePray(ScrapRequestDto scrapRequestDto, GroupPray groupPray, Member member, - Category category) { - groupPray.getOriginPray().setIsShared(); - - return Pray.createdByScrapOf(member, groupPray.getContent(), scrapRequestDto.getDeadline(), - groupPray.getAuthor().getId(), groupPray.getOriginPray().getId(), category, - PrayType.SHARED); - } - - private void sendNotificationAndSaveLog(ScrapAndHeart scrapAndHeart, GroupPray groupPray, - Member receiver, boolean isHeart) throws IOException { - String groupName = groupPray.getGroup().getName(); - String name = scrapAndHeart.getMember().getName(); - - String title = isHeart ? groupName + " 💘" : groupName + " 💌 "; - String body = isHeart ? name + "님이 당신의 기도제목을 두고 기도했어요" : name + "님이 당신의 기도제목을 저장했어요"; - - fcmNotificationService.sendMessageTo(receiver.getFirebaseToken(), title, body); - fcmNotificationService.saveNotificationLog( - NotificationLog.of(memberService.findMemberByUserId(receiver.getUserId()), - groupPray.getOriginPray(), body)); - - } + private final FCMNotificationService fcmNotificationService; + private final MemberService memberService; + private final PrayService prayService; + private final GroupPrayService groupPrayService; + private final GroupMemberService groupMemberService; + private final GroupService groupService; + private final CategoryService categoryService; + private final ScrapAndHeartService scrapAndHeartService; + + @Transactional + public void prayToGroupPray(PrayToGroupPrayDto prayToGroupPrayDto, String userId) { + Member member = memberService.findMemberByUserId(userId); + Group group = groupService.getGroupById(prayToGroupPrayDto.getGroupId()); + + List existIds = group.getGroupPrayList().stream() + .map(gp -> gp.getOriginPray().getId()) + .collect(Collectors.toList()); + if (existIds.stream().anyMatch(id -> id.equals(prayToGroupPrayDto.getPrayId()))) { + throw new CustomException(ErrorStatus.ALREADY_EXIST_GROUP_PRAY_EXCEPTION); + } + + List mainPray = prayService.findAllByIdIn(prayToGroupPrayDto.getPrayId()); + List targetPray = prayService.findAllByOriginPrayIdIn( + prayToGroupPrayDto.getPrayId()); + + for (Pray p : mainPray) { + GroupPray groupPray = GroupPray.builder() + .group(group) + .author(member) + .content(new String(Base64.getDecoder().decode(p.getContent().getBytes()))) + .deadline(p.getDeadline()) + .build(); + p.setGroupPray(groupPray); + groupPrayService.saveGroupPray(groupPray); + p.setIsShared(); + + ScrapAndHeart scrapAndHeart = ScrapAndHeart.builder() + .groupPray(groupPray) + .member(member) + .build(); + scrapAndHeartService.save(scrapAndHeart); + + for (Pray TP : targetPray) { + ScrapAndHeart targetScrapAndHeart = ScrapAndHeart.builder() + .groupPray(groupPray) + .member(TP.getMember()) + .build(); + targetScrapAndHeart.scrapPray(TP); + scrapAndHeartService.save(targetScrapAndHeart); + } + } + } + + public List getPrayList(String username, String prayType, Long groupId) { + List prayIds = groupPrayService.getOriginPrayIdsByGroupId(groupId); + return categoryService.findAllWithOrderAndType(username, prayType, prayIds); + } + + + @Transactional + public void createGroupPray(GroupPrayRequestDto groupPrayRequestDto, String userId) { + Member author = memberService.findMemberByUserId(userId); + Group group = groupService.getGroupById(groupPrayRequestDto.getGroupId()); + GroupPray groupPray = GroupPray.of(group, author, groupPrayRequestDto.getDeadline(), + groupPrayRequestDto.getContent()); + + groupPrayService.saveGroupPray(groupPray); + scrapAndHeartService.save(ScrapAndHeart.createdByGroupPrayOf(groupPray, author)); + + Category category = categoryService.getCategoryByIdAndMemberAndType( + groupPrayRequestDto.getCategoryId(), author, CategoryType.PERSONAL); + + prayService.savePray(Pray.createdByGroupPrayOf(author, groupPrayRequestDto.getContent(), + groupPrayRequestDto.getDeadline(), category, CategoryType.PERSONAL, groupPray, true)); + } + + @Transactional(readOnly = true) + public GroupPrayRappingDto getGroupPray(Long groupId, String userId) { + + Member member = memberService.findMemberByUserId(userId); + Group group = groupService.getGroupById(groupId); + + List groupPrays = groupPrayService.findGroupPraysByGroup(group); + Long count = scrapAndHeartService.countHeart(groupPrays); + + List groupPrayList = new ArrayList<>(); + for (GroupPray groupPray : groupPrays) { + ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( + groupPray, member).orElse(null); + groupPrayList.add(GroupPrayResponseDto.builder() + .groupPray(groupPray) + .member(member) + .scrapAndHeart(scrapAndHeart) + .build()); + } + + GroupMember groupMember = groupMemberService.getGroupMemberByGroupAndMember(group, member); + + return new GroupPrayRappingDto(count, groupMember.getNotificationAgree(), + makeSortedTreeMap(groupPrayList)); + } + + private Map> makeSortedTreeMap( + List groupPrayList) { + // 역순으로 정렬하는 트리맵 정의 + Map> sortedMap = new TreeMap<>( + Comparator.reverseOrder()); + + // 트리맵에 날짜별로 그룹화 된 기도제목 리스트 입력 + sortedMap.putAll(groupPrayList.stream() + .collect(Collectors.groupingBy(GroupPrayResponseDto::getCreatedAt))); + + // 날짜별로 그룹화 된 기도제목을 기도제목 id 순으로 정렬 + for (Map.Entry> entry : sortedMap.entrySet()) { + List value = entry.getValue(); + value.sort(Comparator.comparing(GroupPrayResponseDto::getGroupPrayId).reversed()); + } + return sortedMap; + } + + @Transactional + public void heartGroupPray(Long groupPrayId, String userId) throws IOException { + GroupPray groupPray = groupPrayService.getGroupPrayById(groupPrayId); + Member member = memberService.findMemberByUserId(userId); + + ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( + groupPray, member) + .orElse(ScrapAndHeart.builder() + .groupPray(groupPray) + .member(member) + .build()); + + scrapAndHeart.heartPray(); + scrapAndHeartService.save(scrapAndHeart); + sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), true); + } + + @Transactional + public void scrapGroupPray(ScrapRequestDto scrapRequestDto, String userId) throws IOException { + Member member = memberService.findMemberByUserId(userId); + Category category = categoryService.getCategoryByIdAndMemberAndType( + scrapRequestDto.getCategoryId(), member, CategoryType.SHARED); + GroupPray groupPray = groupPrayService.getGroupPrayById( + scrapRequestDto.getGroupPrayId()); + + Pray pray = makePray(scrapRequestDto, groupPray, member, category); + prayService.savePray(pray); + + ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( + groupPray, member).orElse(ScrapAndHeart.createdByScrapOf(groupPray, member, pray)); + + scrapAndHeart.scrapPray(pray); + scrapAndHeartService.save(scrapAndHeart); + sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), false); + } + + private Pray makePray(ScrapRequestDto scrapRequestDto, GroupPray groupPray, Member member, + Category category) { + groupPray.getOriginPray().setIsShared(); + + return Pray.createdByScrapOf(member, groupPray.getContent(), scrapRequestDto.getDeadline(), + groupPray.getAuthor().getId(), groupPray.getOriginPray().getId(), category, + CategoryType.SHARED); + } + + private void sendNotificationAndSaveLog(ScrapAndHeart scrapAndHeart, GroupPray groupPray, + Member receiver, boolean isHeart) throws IOException { + String groupName = groupPray.getGroup().getName(); + String name = scrapAndHeart.getMember().getName(); + + String title = isHeart ? groupName + " 💘" : groupName + " 💌 "; + String body = isHeart ? name + "님이 당신의 기도제목을 두고 기도했어요" : name + "님이 당신의 기도제목을 저장했어요"; + + fcmNotificationService.sendMessageTo(receiver.getFirebaseToken(), title, body); + fcmNotificationService.saveNotificationLog( + NotificationLog.of(memberService.findMemberByUserId(receiver.getUserId()), + groupPray.getOriginPray(), body)); + + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java index 4ddf0dde..a70d1210 100644 --- a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java +++ b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java @@ -1,8 +1,8 @@ package com.uspray.uspray.domain.history.dto.response; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.global.enums.CategoryType; import java.time.LocalDate; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,37 +13,37 @@ @AllArgsConstructor public class HistoryDetailResponseDto { - private Long historyId; + private Long historyId; - private String name; + private String name; - private String content; + private String content; - private Integer personal_count; + private Integer personal_count; - private Integer total_count; + private Integer total_count; - private LocalDate startDate; + private LocalDate startDate; - private LocalDate deadline; + private LocalDate deadline; - private Long categoryId; + private Long categoryId; - private Boolean canEdit; + private Boolean canEdit; - public static HistoryDetailResponseDto of(History history) { - return new HistoryDetailResponseDto(history.getId(), history.getMember().getName(), - history.getContent(), history.getPersonalCount(), history.getTotalCount(), - history.getStartDate(), history.getDeadline(), - history.getCategoryId(), - history.getPrayType() == PrayType.PERSONAL && !history.getIsShared()); - } + public static HistoryDetailResponseDto of(History history) { + return new HistoryDetailResponseDto(history.getId(), history.getMember().getName(), + history.getContent(), history.getPersonalCount(), history.getTotalCount(), + history.getStartDate(), history.getDeadline(), + history.getCategoryId(), + history.getCategoryType() == CategoryType.PERSONAL && !history.getIsShared()); + } - public static HistoryDetailResponseDto shared(History history, Pray originPray) { - return new HistoryDetailResponseDto(history.getId(), originPray.getMember().getName(), - history.getContent(), history.getPersonalCount(), history.getTotalCount(), - history.getStartDate(), history.getDeadline(), - history.getCategoryId(), - history.getPrayType() == PrayType.PERSONAL && !history.getIsShared()); - } + public static HistoryDetailResponseDto shared(History history, Pray originPray) { + return new HistoryDetailResponseDto(history.getId(), originPray.getMember().getName(), + history.getContent(), history.getPersonalCount(), history.getTotalCount(), + history.getStartDate(), history.getDeadline(), + history.getCategoryId(), + history.getCategoryType() == CategoryType.PERSONAL && !history.getIsShared()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java index 481651a9..409290b8 100644 --- a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java +++ b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java @@ -1,8 +1,8 @@ package com.uspray.uspray.domain.history.dto.response; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.global.enums.CategoryType; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import lombok.AllArgsConstructor; @@ -15,32 +15,34 @@ @Schema(description = "히스토리 응답 DTO") public class HistoryResponseDto { - private Long historyId; + private Long historyId; - private String userId; + private String userId; - private String name; + private String name; - private String content; + private String content; - private LocalDate createdAt; + private LocalDate createdAt; - private LocalDate deadline; + private LocalDate deadline; - private Long categoryId; + private Long categoryId; - private Boolean canEdit; + private Boolean canEdit; - public static HistoryResponseDto of(History history) { - return new HistoryResponseDto(history.getId(), history.getMember().getUserId(), - history.getMember().getName(), history.getContent(), history.getStartDate(), history.getDeadline(), history.getCategoryId(), - history.getPrayType() == PrayType.PERSONAL && !history.getIsShared()); - } + public static HistoryResponseDto of(History history) { + return new HistoryResponseDto(history.getId(), history.getMember().getUserId(), + history.getMember().getName(), history.getContent(), history.getStartDate(), + history.getDeadline(), history.getCategoryId(), + history.getCategoryType() == CategoryType.PERSONAL && !history.getIsShared()); + } - public static HistoryResponseDto shared(History history, Member originMember) { - return new HistoryResponseDto(history.getId(), originMember.getUserId(), - originMember.getName(), history.getContent(), history.getStartDate(), history.getDeadline(), - history.getCategoryId(), false); // 공유받은 기도제목은 수정 불가능, 항상 false - } + public static HistoryResponseDto shared(History history, Member originMember) { + return new HistoryResponseDto(history.getId(), originMember.getUserId(), + originMember.getName(), history.getContent(), history.getStartDate(), + history.getDeadline(), + history.getCategoryId(), false); // 공유받은 기도제목은 수정 불가능, 항상 false + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/model/History.java b/src/main/java/com/uspray/uspray/domain/history/model/History.java index c2445a14..236e5ddb 100644 --- a/src/main/java/com/uspray/uspray/domain/history/model/History.java +++ b/src/main/java/com/uspray/uspray/domain/history/model/History.java @@ -1,9 +1,9 @@ package com.uspray.uspray.domain.history.model; -import com.uspray.uspray.global.enums.PrayType; -import com.uspray.uspray.global.common.model.AuditingTimeEntity; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.global.common.model.AuditingTimeEntity; +import com.uspray.uspray.global.enums.CategoryType; import java.time.LocalDate; import java.util.Base64; import javax.persistence.Column; @@ -26,54 +26,54 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class History extends AuditingTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "history_id") - private Long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "history_id") + private Long id; - @ManyToOne - @JoinColumn(name = "member_id", nullable = false) - private Member member; + @ManyToOne + @JoinColumn(name = "member_id", nullable = false) + private Member member; - private String content; + private String content; - private Integer personalCount; + private Integer personalCount; - private Integer totalCount; + private Integer totalCount; - private LocalDate startDate; - private LocalDate deadline; + private LocalDate startDate; + private LocalDate deadline; - @Column(name = "origin_pray_id") - private Long originPrayId; + @Column(name = "origin_pray_id") + private Long originPrayId; - @Column(name = "origin_member_id") - private Long originMemberId; + @Column(name = "origin_member_id") + private Long originMemberId; - @NotNull - @Enumerated(EnumType.STRING) - private PrayType prayType; + @NotNull + @Enumerated(EnumType.STRING) + private CategoryType categoryType; - private Long categoryId; + private Long categoryId; - private Boolean isShared; + private Boolean isShared; - @Builder - public History(Pray pray, Integer totalCount) { - this.member = pray.getMember(); - this.content = pray.getContent(); - this.personalCount = pray.getCount(); - this.totalCount = (totalCount == null) ? 0 : totalCount; // totalCount에 기본값 설정 - this.startDate = LocalDate.from(pray.getStartDate()); - this.deadline = pray.getDeadline(); - this.originPrayId = pray.getOriginPrayId(); - this.originMemberId = pray.getOriginMemberId(); - this.prayType = pray.getPrayType(); - this.categoryId = pray.getCategory().getId(); - this.isShared = pray.getIsShared(); - } + @Builder + public History(Pray pray, Integer totalCount) { + this.member = pray.getMember(); + this.content = pray.getContent(); + this.personalCount = pray.getCount(); + this.totalCount = (totalCount == null) ? 0 : totalCount; // totalCount에 기본값 설정 + this.startDate = LocalDate.from(pray.getStartDate()); + this.deadline = pray.getDeadline(); + this.originPrayId = pray.getOriginPrayId(); + this.originMemberId = pray.getOriginMemberId(); + this.categoryType = pray.getCategoryType(); + this.categoryId = pray.getCategory().getId(); + this.isShared = pray.getIsShared(); + } - public String getContent() { - return new String(Base64.getDecoder().decode(content)); - } + public String getContent() { + return new String(Base64.getDecoder().decode(content)); + } } \ No newline at end of file diff --git a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java index 7e86ef50..d92c92d9 100644 --- a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java @@ -4,16 +4,16 @@ import com.uspray.uspray.domain.history.dto.response.HistoryDetailResponseDto; import com.uspray.uspray.domain.history.dto.response.HistoryListResponseDto; import com.uspray.uspray.domain.history.dto.response.HistoryResponseDto; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.history.model.History; +import com.uspray.uspray.domain.history.repository.HistoryRepository; import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.domain.pray.repository.PrayRepository; +import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.domain.history.repository.HistoryRepository; -import com.uspray.uspray.domain.member.repository.MemberRepository; -import com.uspray.uspray.domain.pray.repository.PrayRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -26,64 +26,69 @@ @RequiredArgsConstructor public class HistoryService { - private final HistoryRepository historyRepository; - private final MemberRepository memberRepository; - private final PrayRepository prayRepository; + private final HistoryRepository historyRepository; + private final MemberRepository memberRepository; + private final PrayRepository prayRepository; - @Transactional(readOnly = true) - public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { - // type은 대소문자 구분하지 않습니다 + @Transactional(readOnly = true) + public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { + // type은 대소문자 구분하지 않습니다 + Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); + Member member = memberRepository.getMemberByUserId(username); + Page historyList; - Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); - Member member = memberRepository.getMemberByUserId(username); - Page historyList; - if (PrayType.PERSONAL.name().equalsIgnoreCase(type)) { - historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) - .map(HistoryResponseDto::of); - return new HistoryListResponseDto(historyList.getContent(), - historyList.getTotalPages()); - } - if (PrayType.SHARED.name().equalsIgnoreCase(type)) { - historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( - member, pageable).map(history -> { - Member originMember = memberRepository.getMemberById(history.getOriginMemberId()); - return HistoryResponseDto.shared(history, originMember); - }); - return new HistoryListResponseDto(historyList.getContent(), - historyList.getTotalPages()); - } - throw new CustomException(ErrorStatus.INVALID_TYPE_EXCEPTION); - } + if (CategoryType.PERSONAL.name().equalsIgnoreCase(type)) { + historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) + .map(HistoryResponseDto::of); + return new HistoryListResponseDto(historyList.getContent(), + historyList.getTotalPages()); + } + if (CategoryType.SHARED.name().equalsIgnoreCase(type)) { + historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( + member, pageable).map(history -> { + Member originMember = memberRepository.getMemberById(history.getOriginMemberId()); + return HistoryResponseDto.shared(history, originMember); + }); + return new HistoryListResponseDto(historyList.getContent(), + historyList.getTotalPages()); + } + throw new CustomException(ErrorStatus.INVALID_TYPE_EXCEPTION); + } - @Transactional(readOnly = true) - public HistoryListResponseDto searchHistoryList(String username, - HistorySearchRequestDto historySearchRequestDto) { + @Transactional(readOnly = true) + public HistoryListResponseDto searchHistoryList(String username, + HistorySearchRequestDto historySearchRequestDto) { - Pageable pageable = PageRequest.of(historySearchRequestDto.getPage(), - historySearchRequestDto.getSize(), Sort.by("deadline").descending()); - Page historyList = historyRepository.findBySearchOption(username, - historySearchRequestDto, pageable) - .map(HistoryResponseDto::of); - return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); - } + Pageable pageable = PageRequest.of(historySearchRequestDto.getPage(), + historySearchRequestDto.getSize(), Sort.by("deadline").descending()); + Page historyList = historyRepository.findBySearchOption(username, + historySearchRequestDto, pageable) + .map(HistoryResponseDto::of); + return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); + } - @Transactional(readOnly = true) - public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { - Member member = memberRepository.getMemberByUserId(username); - History history = historyRepository.getHistoryById(historyId); - if (!history.getMember().getId().equals(member.getId())) { - throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION); - } - if (history.getPrayType().equals(PrayType.SHARED)) { - Pray originPray = prayRepository.getPrayById(history.getOriginPrayId()); - return HistoryDetailResponseDto.shared(history, originPray); - } - return HistoryDetailResponseDto.of(history); - } + @Transactional(readOnly = true) + public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { + Member member = memberRepository.getMemberByUserId(username); + History history = historyRepository.getHistoryById(historyId); + if (!history.getMember().getId().equals(member.getId())) { + throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION); + } + + if (history.getCategoryType() == CategoryType.SHARED) { + Pray originPray = prayRepository.getPrayById(history.getOriginPrayId()); + return HistoryDetailResponseDto.shared(history, originPray); + } + return HistoryDetailResponseDto.of(history); + } - @Transactional - public void saveHistory(History history) { - historyRepository.save(history); - } + @Transactional + public void createHistory(Pray pray, Integer totalCountOrNull) { + History history = History.builder() + .pray(pray) + .totalCount(totalCountOrNull) //sharedCount에 내 count도 포함되어 있음 + .build(); + historyRepository.save(history); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java index 1d3ee3c5..0ec4a465 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java @@ -1,6 +1,5 @@ package com.uspray.uspray.domain.pray.controller; - import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayRequestDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayUpdateRequestDto; @@ -28,79 +27,78 @@ @RequiredArgsConstructor public class PrayController implements PrayApi { - private final PrayService prayService; - private final PrayFacade prayFacade; + private final PrayService prayService; + private final PrayFacade prayFacade; - @GetMapping - public ApiResponseDto> getPrayList( - @AuthenticationPrincipal User user, - String prayType - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayFacade.getPrayList(user.getUsername(), prayType)); - } + @GetMapping + public ApiResponseDto> getPrayList( + @AuthenticationPrincipal User user, + String prayType + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayFacade.getPrayList(user.getUsername(), prayType)); + } - @GetMapping("/{prayId}") - public ApiResponseDto getPrayDetail( - @AuthenticationPrincipal User user, - Long prayId - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, - prayService.getPrayDetail(prayId, user.getUsername())); - } + @GetMapping("/{prayId}") + public ApiResponseDto getPrayDetail( + @AuthenticationPrincipal User user, + @PathVariable("prayId") Long prayId) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, + prayService.getPrayDetail(prayId, user.getUsername())); + } - @PostMapping - public ApiResponseDto createPray( - @RequestBody @Valid PrayRequestDto prayRequestDto, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, - prayFacade.createPray(prayRequestDto, user.getUsername(), null)); - } + @PostMapping + public ApiResponseDto createPray( + @RequestBody @Valid PrayRequestDto prayRequestDto, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, + prayFacade.createPray(prayRequestDto, user.getUsername(), null)); + } - @DeleteMapping("/{prayId}") - public ApiResponseDto deletePray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, - prayFacade.deletePray(prayId, user.getUsername())); - } + @DeleteMapping("/{prayId}") + public ApiResponseDto deletePray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, + prayFacade.deletePray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}") - public ApiResponseDto updatePray( - @PathVariable("prayId") Long prayId, - @RequestBody @Valid PrayUpdateRequestDto prayUpdateRequestDto, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, - prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); - } + @PutMapping("/{prayId}") + public ApiResponseDto updatePray( + @PathVariable("prayId") Long prayId, + @RequestBody @Valid PrayUpdateRequestDto prayUpdateRequestDto, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, + prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); + } - @PutMapping("/{prayId}/today") - public ApiResponseDto> todayPray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, - prayFacade.todayPray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/today") + public ApiResponseDto> todayPray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, + prayFacade.todayPray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}/complete") - public ApiResponseDto> completePray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayFacade.completePray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/complete") + public ApiResponseDto> completePray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayFacade.completePray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}/cancel") - public ApiResponseDto> cancelPray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.CANCEL_PRAY_SUCCESS, - prayFacade.cancelPray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/cancel") + public ApiResponseDto> cancelPray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.CANCEL_PRAY_SUCCESS, + prayFacade.cancelPray(prayId, user.getUsername())); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java b/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java index 3c928cbb..3c207002 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java +++ b/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java @@ -1,9 +1,9 @@ package com.uspray.uspray.domain.pray.dto.pray.request; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.category.model.Category; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.global.enums.CategoryType; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import javax.validation.constraints.NotNull; @@ -19,26 +19,26 @@ @Schema(description = "기도제목 DTO") public class PrayRequestDto { - @NotNull - @Schema(description = "기도제목 내용", example = "@@이가 $$ 할 수 있도록") - private String content; + @NotNull + @Schema(description = "기도제목 내용", example = "@@이가 $$ 할 수 있도록") + private String content; - @NotNull - @Schema(description = "기도제목 마감일", example = "2025-01-01") - private LocalDate deadline; + @NotNull + @Schema(description = "기도제목 마감일", example = "2025-01-01") + private LocalDate deadline; - @NotNull - @Schema(description = "기도제목 카테고리", example = "1") - private Long categoryId; + @NotNull + @Schema(description = "기도제목 카테고리", example = "1") + private Long categoryId; - public Pray toEntity(Member member, Category category, LocalDate startDateOrNull) { - return Pray.builder() - .content(content) - .deadline(deadline) - .member(member) - .category(category) - .prayType(PrayType.PERSONAL) - .startDate(startDateOrNull) - .build(); - } + public Pray toEntity(Member member, Category category, LocalDate startDateOrNull) { + return Pray.builder() + .content(content) + .deadline(deadline) + .member(member) + .category(category) + .categoryType(CategoryType.PERSONAL) + .startDate(startDateOrNull) + .build(); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java b/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java index 8ae42b3f..71303270 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java @@ -5,7 +5,7 @@ import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.dto.pray.request.PrayUpdateRequestDto; import com.uspray.uspray.global.common.model.AuditingTimeEntity; -import com.uspray.uspray.global.enums.PrayType; +import com.uspray.uspray.global.enums.CategoryType; import java.time.LocalDate; import java.util.ArrayList; import java.util.Base64; @@ -37,40 +37,40 @@ @Where(clause = "deleted=false") public class Pray extends AuditingTimeEntity { - private final Boolean deleted = false; - @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true) - private final List groupPray = new ArrayList<>(); - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "pray_id") - private Long id; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id", nullable = false) - private Member member; - private String content; - private Integer count; - private LocalDate deadline; - private Boolean isShared = false; - @Column(name = "origin_pray_id") - private Long originPrayId; - @Column(name = "origin_member_id") - private Long originMemberId; - @NotNull - @Enumerated(EnumType.STRING) - private PrayType prayType; - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "category_id") - private Category category; + private final Boolean deleted = false; + @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true) + private final List groupPray = new ArrayList<>(); + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "pray_id") + private Long id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + private String content; + private Integer count; + private LocalDate deadline; + private Boolean isShared = false; + @Column(name = "origin_pray_id") + private Long originPrayId; + @Column(name = "origin_member_id") + private Long originMemberId; + @NotNull + @Enumerated(EnumType.STRING) + private CategoryType categoryType; + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "category_id") + private Category category; - @NotNull - private LocalDate startDate; + @NotNull + private LocalDate startDate; - private LocalDate lastPrayedAt; + private LocalDate lastPrayedAt; @Builder public Pray(Member member, String content, LocalDate deadline, Long originPrayId, - Long originMemberId, Category category, PrayType prayType, GroupPray groupPray, + Long originMemberId, Category category, CategoryType categoryType, GroupPray groupPray, LocalDate startDate, Boolean isShared) { this.member = member; this.content = new String(Base64.getEncoder().encode(content.getBytes())); @@ -79,7 +79,7 @@ public Pray(Member member, String content, LocalDate deadline, Long originPrayId this.originPrayId = originPrayId; this.originMemberId = originMemberId; this.category = category; - this.prayType = prayType; + this.categoryType = categoryType; setGroupPray(groupPray); this.startDate = startDate; this.lastPrayedAt = LocalDate.of(2002, 2, 24); @@ -87,21 +87,21 @@ public Pray(Member member, String content, LocalDate deadline, Long originPrayId } public static Pray createdByGroupPrayOf(Member author, String content, LocalDate deadline, - Category category, PrayType prayType, GroupPray groupPray, Boolean isShared) { + Category category, CategoryType categoryType, GroupPray groupPray, Boolean isShared) { return Pray.builder() .member(author) .content(content) .deadline(deadline) .category(category) .startDate(LocalDate.now()) - .prayType(prayType) + .categoryType(categoryType) .groupPray(groupPray) .isShared(isShared) .build(); } public static Pray createdByScrapOf(Member member, String content, LocalDate deadline, - Long originMemberId, Long originPrayId, Category category, PrayType prayType) { + Long originMemberId, Long originPrayId, Category category, CategoryType categoryType) { return Pray.builder() .member(member) .content(content) @@ -109,42 +109,42 @@ public static Pray createdByScrapOf(Member member, String content, LocalDate dea .originMemberId(originMemberId) .originPrayId(originPrayId) .category(category) - .prayType(prayType) + .categoryType(categoryType) .build(); } - public void setGroupPray(GroupPray groupPray) { - if (groupPray != null) { - this.groupPray.add(groupPray); - groupPray.setOriginPray(this); - } - } + public void setGroupPray(GroupPray groupPray) { + if (groupPray != null) { + this.groupPray.add(groupPray); + groupPray.setOriginPray(this); + } + } - public Pray update(PrayUpdateRequestDto prayUpdateRequestDto, Category category) { - if (prayUpdateRequestDto.getContent() != null) { - this.content = new String( - Base64.getEncoder().encode(prayUpdateRequestDto.getContent().getBytes())); - } - this.deadline = prayUpdateRequestDto.getDeadline(); - this.category = category; - return this; - } + public Pray update(PrayUpdateRequestDto prayUpdateRequestDto, Category category) { + if (prayUpdateRequestDto.getContent() != null) { + this.content = new String( + Base64.getEncoder().encode(prayUpdateRequestDto.getContent().getBytes())); + } + this.deadline = prayUpdateRequestDto.getDeadline(); + this.category = category; + return this; + } - public void countUp() { - this.count++; - this.lastPrayedAt = LocalDate.now(); - } + public void countUp() { + this.count++; + this.lastPrayedAt = LocalDate.now(); + } - public void complete() { - this.deadline = LocalDate.now(); - } + public void complete() { + this.deadline = LocalDate.now(); + } - public void deleteLastPrayedAt() { - this.lastPrayedAt = LocalDate.now().minusDays(1); - this.count--; - } + public void deleteLastPrayedAt() { + this.lastPrayedAt = LocalDate.now().minusDays(1); + this.count--; + } - public void setIsShared() { - this.isShared = true; - } + public void setIsShared() { + this.isShared = true; + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java index 0d0c3aee..4a7ca3f0 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java @@ -9,5 +9,5 @@ public interface PrayRepositoryCustom { List findAllWithOrderAndType(String username, String prayType); @Nullable - Integer getSharedCountByOriginPrayId(Long prayId); + Integer getSharedCountByIdAndOriginPrayId(Long prayId, Long originPrayId); } diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java index ccf00ec4..4c970f72 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java @@ -3,6 +3,7 @@ import static com.uspray.uspray.domain.category.model.QCategory.category; import static com.uspray.uspray.domain.pray.model.QPray.pray; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import com.uspray.uspray.domain.pray.model.Pray; import java.util.List; @@ -13,36 +14,35 @@ @RequiredArgsConstructor public class PrayRepositoryImpl implements PrayRepositoryCustom { - private final JPAQueryFactory queryFactory; + private final JPAQueryFactory queryFactory; - @Override - public List findAllWithOrderAndType(String username, String prayType) { - return queryFactory - .select(pray) - .from(pray) - .join(pray.category, category) - .where(category.member.userId.eq(username)) - .where(pray.prayType.stringValue().likeIgnoreCase(prayType)) - .orderBy(pray.createdAt.asc()) - .orderBy(pray.category.order.asc()) - .fetch(); - } + @Override + public List findAllWithOrderAndType(String username, String prayType) { + return queryFactory + .select(pray) + .from(pray) + .join(pray.category, category) + .where(category.member.userId.eq(username)) + .where(pray.categoryType.stringValue().likeIgnoreCase(prayType)) + .orderBy(pray.createdAt.asc()) + .orderBy(pray.category.order.asc()) + .fetch(); + } @Override - // prayId로 originPrayId를 넘겨줌 - public Integer getSharedCountByOriginPrayId(Long prayId) { - Integer result = queryFactory - .select(pray.count.sum()) - .from(pray) - .where(pray.originPrayId.eq(prayId)) - .groupBy(pray.id) - .fetchOne(); - Integer result_for_owner = queryFactory + public Integer getSharedCountByIdAndOriginPrayId(Long prayId, Long originPrayId) { + return queryFactory .select(pray.count.sum()) .from(pray) - .where(pray.id.eq(prayId)) + .where(eqPrayIdOrOriginPrayId(prayId, originPrayId)) .fetchOne(); - return result != null ? result + result_for_owner : result_for_owner; + } + + private BooleanExpression eqPrayIdOrOriginPrayId(Long prayId, Long originPrayId){ + if(originPrayId == null){ + return pray.id.eq(prayId); + } + return pray.originPrayId.eq(originPrayId).or(pray.id.eq(originPrayId)); } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 4065eddd..7ba3cb33 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -4,7 +4,6 @@ import com.uspray.uspray.domain.category.model.Category; import com.uspray.uspray.domain.category.service.CategoryService; import com.uspray.uspray.domain.group.service.ScrapAndHeartService; -import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.history.service.HistoryService; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.member.service.MemberService; @@ -14,12 +13,8 @@ import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; -import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.global.push.model.NotificationLog; -import com.uspray.uspray.global.push.service.FCMNotificationService; import com.uspray.uspray.global.push.service.NotificationLogService; import java.time.LocalDate; import java.util.Collections; @@ -27,212 +22,200 @@ import java.util.stream.Collectors; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor -@Slf4j public class PrayFacade { - private final HistoryService historyService; - private final NotificationLogService notificationLogService; - private final FCMNotificationService fcmNotificationService; - private final ScrapAndHeartService scrapAndHeartService; - private final ShareService shareService; - private final PrayService prayService; - private final MemberService memberService; - private final CategoryService categoryService; - - @Transactional - public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, - LocalDate startDateOrNull) { - Member member = memberService.findMemberByUserId(username); - Category category = categoryService.getCategoryByIdAndMemberAndType(prayRequestDto.getCategoryId(), - member, CategoryType.PERSONAL); - return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); - } - - @Transactional - public PrayResponseDto updatePray(Long prayId, String username, - PrayUpdateRequestDto prayUpdateRequestDto) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - - // 이 기도 제목을 공유한 적 없거나, 공유 받은 사람이 없으면 전부 수정 가능 - // 이 기도 제목을 공유한 적 있고, 누구라도 공유 받은 사람이 있으면 기도제목 내용 수정 불가능 - Pray sharedPray = prayService.getSharedPray(prayId); - Category category = categoryService.getCategoryByIdAndMemberAndType( - prayUpdateRequestDto.getCategoryId(), - pray.getMember(), - CategoryType.PERSONAL); - // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 - if (!pray.getPrayType().toString().equals(category.getCategoryType().toString())) { - throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); - } - - // 공유 됐을 때 content가 있는 경우 - if ((sharedPray != null || pray.getPrayType() == PrayType.SHARED) && prayUpdateRequestDto.getContent() != null) { - throw new CustomException(ErrorStatus.ALREADY_SHARED_EXCEPTION); - } - - return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); - } - - @Transactional - public void convertPrayToHistory() { - List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); - for (Pray pray : prayList) { - pray.complete(); - Integer sharedCount = prayService.getSharedCountByOriginPrayId( - pray.getOriginPrayId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) //sharedCount에 내 count도 포함되어 있음 - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); - } - } - - @Transactional - public void convertPrayToHistory(Pray pray) { - pray.complete(); - History history = History.builder() - .pray(pray) - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); - } - - @Transactional - public CategoryResponseDto deleteCategory(Long categoryId) { - Category category = categoryService.getCategoryById(categoryId); - - prayService.getPrayListByCategory(category).forEach(this::convertPrayToHistory); - - return categoryService.deleteCategory(category); - } - - - @Transactional - public List todayPray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - handlePrayedToday(pray); - return getPrayList(username, pray.getPrayType().stringValue()); - } - - private void sendNotification(Member member) { - try { - fcmNotificationService.sendMessageTo( - member.getFirebaseToken(), - "💘", - "누군가가 당신의 기도제목을 두고 기도했어요"); - } catch (Exception e) { - log.error(e.getMessage()); - - } - log.error( - "send notification to " + member - ); - } - - private void saveNotificationLog(Pray pray, Member member) { - NotificationLog notificationLog = NotificationLog.builder() - .pray(pray) - .member(member) - .title("누군가가 당신의 기도제목을 두고 기도했어요") - .build(); - - notificationLogService.saveNotificationLog(notificationLog); - } - - private void handlePrayedToday(Pray pray) { - if (pray.getLastPrayedAt().equals(LocalDate.now())) { - throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); - } - pray.countUp(); - - if (pray.getPrayType() == PrayType.SHARED) { - Member originMember = memberService.findMemberById(pray.getOriginMemberId()); - if (originMember.getSecondNotiAgree()) { - sendNotification(originMember); - saveNotificationLog(pray, originMember); - } - } - } - - @Transactional - public PrayResponseDto deletePray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - Member member = memberService.findMemberByUserId(username); - - scrapAndHeartService.deleteScrapAndHeart(member, pray); - shareService.deleteByOriginPray(pray); - prayService.deletePray(pray); - return PrayResponseDto.of(pray); - } - - @Transactional - public List getPrayList(String username, String prayType) { - // 사용자 정보와 카테고리 타입을 가져옴 - Member member = memberService.findMemberByUserId(username); - CategoryType categoryType = CategoryType.valueOf(prayType); - List categoryList = categoryService.getCategoryListByMemberAndCategoryType(member, categoryType); - - // 카테고리 리스트가 비어있을 경우 빈 리스트 반환 - if (categoryList.isEmpty()) { - return Collections.emptyList(); - } - - // PrayListResponseDto 생성 및 반환 - return categoryList.stream() - .map(category -> createPrayListResponseDto(member, category)) - .collect(Collectors.toList()); - } - - private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { - // 기도 리스트 변환 - List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, category).stream() - .map(this::convertToPrayResponseDto) - .collect(Collectors.toList()); - - // PrayListResponseDto 생성 - return new PrayListResponseDto(category.getId(), category.getName(), category.getColor(), prayResponseDtos); - } - - private PrayResponseDto convertToPrayResponseDto(Pray pray) { - // 기도의 타입에 따라 적절한 PrayResponseDto 생성 - if (pray.getPrayType().equals(PrayType.SHARED)) { - Member originMember = memberService.findMemberById(pray.getOriginMemberId()); - return PrayResponseDto.shared(pray, originMember); - } else { - return PrayResponseDto.of(pray); - } - } - - - @Transactional - public List completePray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - pray.complete(); - - createHistory(pray); - prayService.deletePray(pray); - - return getPrayList(username, pray.getPrayType().stringValue()); - } - - private void createHistory(Pray pray) { - Integer sharedCount = prayService.getSharedCountByOriginPrayId(pray.getId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) - .build(); - historyService.saveHistory(history); - } - - @Transactional - public List cancelPray(Long prayId, String username) { - return getPrayList(username, - prayService.cancelPray(prayId, username).getPrayType().stringValue()); - } + + private final HistoryService historyService; + private final NotificationLogService notificationLogService; + private final ScrapAndHeartService scrapAndHeartService; + private final ShareService shareService; + private final PrayService prayService; + private final MemberService memberService; + private final CategoryService categoryService; + + + private boolean isSameCategory(Pray pray, Category category) { + return pray.getCategoryType() == category.getCategoryType(); + } + + private boolean isSharedPray(Pray pray) { + return prayService.isSharedPray(pray) || pray.getCategoryType() == CategoryType.SHARED; + } + + private void checkSharedPrayValidation(PrayUpdateRequestDto prayUpdateRequestDto, + Pray pray) { + if (isPrayUpdatable(pray, prayUpdateRequestDto.getContent())) { + throw new CustomException(ErrorStatus.SHARED_PRAY_UPDATE_EXCEPTION); + } + } + + private Boolean isPrayUpdatable(Pray pray, String content) { + return isSharedPray(pray) && content != null; + } + + @Transactional + public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, + LocalDate startDateOrNull) { + Member member = memberService.findMemberByUserId(username); + Category category = categoryService.getCategoryByIdAndMemberAndType( + prayRequestDto.getCategoryId(), + member, CategoryType.PERSONAL); + + return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); + } + + @Transactional + public PrayResponseDto updatePray(Long prayId, String username, + PrayUpdateRequestDto prayUpdateRequestDto) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + + checkSharedPrayValidation(prayUpdateRequestDto, pray); + + Category category = getCategory(prayUpdateRequestDto, pray); + + return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); + } + + @NotNull + private Category getCategory(PrayUpdateRequestDto prayUpdateRequestDto, Pray pray) { + Category category = categoryService.getCategoryByIdAndMemberAndType( + prayUpdateRequestDto.getCategoryId(), + pray.getMember(), + CategoryType.PERSONAL); + + // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 + if (!isSameCategory(pray, category)) { + throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); + } + return category; + } + + @Transactional + public void moveExpiredPrayersToHistory() { + List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); + for (Pray pray : prayList) { + convertPrayToHistory(pray); + } + } + + private void convertPrayToHistory(Pray pray) { + Integer sharedCount = prayService.getSharedCountByIdAndOriginPrayId(pray.getId(), + pray.getOriginPrayId()); + + historyService.createHistory(pray, sharedCount); + prayService.deletePray(pray); + } + + @Transactional + + public CategoryResponseDto deleteCategory(Long categoryId) { + Category category = categoryService.getCategoryById(categoryId); + + prayService.getPrayListByCategory(category).forEach(this::convertPrayToHistory); + + return categoryService.deleteCategory(category); + } + + @Transactional + public List todayPray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + handlePrayedToday(pray); + + return getPrayList(username, pray.getCategoryType().stringValue()); + } + + + private void handlePrayedToday(Pray pray) { + prayService.checkIsAlreadyPrayed(pray); + pray.countUp(); + + if (pray.getCategoryType() == CategoryType.SHARED) { + Member originMember = memberService.findMemberById(pray.getOriginMemberId()); + if (originMember.getSecondNotiAgree()) { + notificationLogService.sendNotification(originMember); + notificationLogService.saveNotificationLog(pray, originMember); + } + } + } + + @Transactional + public PrayResponseDto deletePray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + Member member = memberService.findMemberByUserId(username); + + scrapAndHeartService.deleteScrapAndHeart(member, pray); + shareService.deleteByOriginPray(pray); + prayService.deletePray(pray); + return PrayResponseDto.of(pray); + } + + @Transactional + public List getPrayList(String username, String prayType) { + Member member = memberService.findMemberByUserId(username); + List categoryList = getCategories( + prayType, member); + + if (categoryList.isEmpty()) { + return Collections.emptyList(); + } + + return convertPrayListResponseDtoListByCategory(categoryList, member); + } + + @NotNull + private List convertPrayListResponseDtoListByCategory( + List categoryList, Member member) { + return categoryList.stream() + .map(category -> createPrayListResponseDto(member, category)) + .collect(Collectors.toList()); + } + + private List getCategories(String prayType, Member member) { + CategoryType categoryType = CategoryType.valueOf(prayType); + return categoryService.getCategoryListByMemberAndCategoryType(member, + categoryType); + } + + private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { + // 기도 리스트 변환 + List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, + category).stream() + .map(this::convertToPrayResponseDto) + .collect(Collectors.toList()); + + // PrayListResponseDto 생성 + return new PrayListResponseDto(category.getId(), category.getName(), category.getColor(), + prayResponseDtos); + } + + private PrayResponseDto convertToPrayResponseDto(Pray pray) { + // 기도의 타입에 따라 적절한 PrayResponseDto 생성 + + if (pray.getCategoryType() == CategoryType.SHARED) { + Member originMember = memberService.findMemberById(pray.getOriginMemberId()); + return PrayResponseDto.shared(pray, originMember); + } else { + return PrayResponseDto.of(pray); + } + } + + + @Transactional + public List completePray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + convertPrayToHistory(pray); + + return getPrayList(username, pray.getCategoryType().stringValue()); + } + + + @Transactional + public List cancelPray(Long prayId, String username) { + return getPrayList(username, + prayService.cancelPray(prayId, username).getCategoryType().stringValue()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java index 67996b2e..fa4b2216 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java @@ -5,8 +5,10 @@ import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.repository.PrayRepository; -import java.util.List; +import com.uspray.uspray.global.exception.ErrorStatus; +import com.uspray.uspray.global.exception.model.NotFoundException; import java.time.LocalDate; +import java.util.List; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,59 +17,69 @@ @RequiredArgsConstructor public class PrayService { - private final PrayRepository prayRepository; + private final PrayRepository prayRepository; + + @Transactional + public PrayResponseDto getPrayDetail(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + return PrayResponseDto.of(pray); + } + + public PrayResponseDto savePray(Pray pray) { + return PrayResponseDto.of(prayRepository.save(pray)); + } - @Transactional - public PrayResponseDto getPrayDetail(Long prayId, String username) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - return PrayResponseDto.of(pray); - } + public Pray findPrayById(Long prayId) { + return prayRepository.getPrayById(prayId); + } - public PrayResponseDto savePray(Pray pray) { - return PrayResponseDto.of(prayRepository.save(pray)); - } + public List findAllByIdIn(List prayIds) { + return prayRepository.findAllByIdIn(prayIds); + } - public Pray findPrayById(Long prayId) { - return prayRepository.getPrayById(prayId); - } + public List findAllByOriginPrayIdIn(List prayIds) { + return prayRepository.findAllByOriginPrayIdIn(prayIds); + } - public List findAllByIdIn(List prayIds) { - return prayRepository.findAllByIdIn(prayIds); - } + public List getPrayListByCategory(Category category) { + return prayRepository.findAllByCategory(category); + } - public List findAllByOriginPrayIdIn(List prayIds) { - return prayRepository.findAllByOriginPrayIdIn(prayIds); - } + public List getPrayListByMemberAndCategory(Member member, Category category) { + return prayRepository.findAllByMemberAndCategoryOrderByCreatedAtAsc(member, category); + } - public List getPrayListByCategory(Category category) { - return prayRepository.findAllByCategory(category); - } + public Pray getPrayByIdAndMemberId(Long prayId, String username) { + return prayRepository.getPrayByIdAndMemberId(prayId, username); + } - public List getPrayListByMemberAndCategory(Member member, Category category) { - return prayRepository.findAllByMemberAndCategoryOrderByCreatedAtAsc(member, category); - } + private Pray getSharedPray(Long prayId) { + return prayRepository.getPrayByOriginPrayId(prayId); + } - public Pray getPrayByIdAndMemberId(Long prayId, String username) { - return prayRepository.getPrayByIdAndMemberId(prayId, username); - } + public List getPrayListDeadlineBefore(LocalDate currentDate) { + return prayRepository.findAllByDeadlineBefore(currentDate); + } - public Pray getSharedPray(Long prayId) { - return prayRepository.getPrayByOriginPrayId(prayId); - } + public Integer getSharedCountByIdAndOriginPrayId(Long prayId, Long originPrayId) { + return prayRepository.getSharedCountByIdAndOriginPrayId(prayId, originPrayId); + } - public List getPrayListDeadlineBefore(LocalDate currentDate) { - return prayRepository.findAllByDeadlineBefore(currentDate); - } + public void deletePray(Pray pray) { + prayRepository.delete(pray); + } - public Integer getSharedCountByOriginPrayId(Long originPrayId) { - return prayRepository.getSharedCountByOriginPrayId(originPrayId); - } + public Pray cancelPray(Long prayId, String username) { + return prayRepository.cancelPray(prayId, username); + } - public void deletePray(Pray pray) { - prayRepository.delete(pray); - } + public Boolean isSharedPray(Pray pray) { + return getSharedPray(pray.getId()) == null; + } - public Pray cancelPray(Long prayId, String username) { - return prayRepository.cancelPray(prayId, username); - } + public void checkIsAlreadyPrayed(Pray pray) { + if (pray.getLastPrayedAt().equals(LocalDate.now())) { + throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); + } + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java index f77893ff..4b93f987 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java @@ -1,24 +1,23 @@ package com.uspray.uspray.domain.pray.service; +import com.uspray.uspray.domain.category.model.Category; +import com.uspray.uspray.domain.category.repository.CategoryRepository; +import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayDeleteRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPraySaveRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.response.SharedPrayResponseDto; -import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; -import com.uspray.uspray.domain.category.model.Category; -import com.uspray.uspray.domain.member.model.Member; -import com.uspray.uspray.global.push.model.NotificationLog; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.model.SharedPray; +import com.uspray.uspray.domain.pray.repository.PrayRepository; +import com.uspray.uspray.domain.pray.repository.SharedPrayRepository; +import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.domain.category.repository.CategoryRepository; -import com.uspray.uspray.domain.member.repository.MemberRepository; +import com.uspray.uspray.global.push.model.NotificationLog; import com.uspray.uspray.global.push.repository.NotificationLogRepository; -import com.uspray.uspray.domain.pray.repository.PrayRepository; -import com.uspray.uspray.domain.pray.repository.SharedPrayRepository; import com.uspray.uspray.global.push.service.FCMNotificationService; import java.time.LocalDate; import java.util.ArrayList; @@ -34,156 +33,156 @@ @RequiredArgsConstructor public class ShareFacade { - private final SharedPrayRepository sharedPrayRepository; - private final MemberRepository memberRepository; - private final PrayRepository prayRepository; - private final CategoryRepository categoryRepository; - private final NotificationLogRepository notificationLogRepository; - private final FCMNotificationService fcmNotificationService; - - @Transactional(readOnly = true) - public List getSharedPrayList(String username) { - - Member member = memberRepository.getMemberByUserId(username); - List sharedPrayList = sharedPrayRepository.findAllByMemberOrderByCreatedAtDesc( - member); - - List result = new ArrayList<>(); - - for (SharedPray sharedPray : sharedPrayList) { - Pray pray = prayRepository.getPrayByIdIgnoreDelete( - sharedPray.getPray().getId()); - result.add(SharedPrayResponseDto.of(sharedPray, pray)); - } - - return result; - } - - @Transactional - public Long receivedSharedPray(String username, SharedPrayRequestDto sharedPrayRequestDto) { - - Member member = memberRepository.getMemberByUserId(username); - List prayList = prayRepository.findAllByIdIn(sharedPrayRequestDto.getPrayIds()); - long total = 0L; - - if (prayList.size() != sharedPrayRequestDto.getPrayIds().size()) { - throw new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION); - } - for (Pray pray : prayList) { - if (!receiveCheck(member, pray)) { - continue; - } - SharedPray sharedPray = SharedPray.builder() - .member(member) - .pray(pray) - .build(); - sharedPrayRepository.save(sharedPray); - // 기도제목을 보관함에 담으면 원래 기도제목의 isShared를 true로 변경 - pray.setIsShared(); - prayRepository.save(pray); - total++; - } - - if (total == 0L) { - throw new CustomException(ErrorStatus.CANNOT_RECEIVE_SHARED_PRAY_EXCEPTION); - } - return total; - } - - private boolean receiveCheck(Member member, Pray pray) { - if (pray.getMember().equals(member)) { - // 자기 자신의 기도제목은 보관함에 넣을 수 없음 - return false; - } - // 이미 저장된 기도제목의 경우 다시 보관함에 담기지 않도록 처리 - if (prayRepository.existsByMemberAndOriginPrayId(member, pray.getId())) { - return false; - } - // 이미 보관함에 있는 기도제목은 보관함에 넣을 수 없음 - return !sharedPrayRepository.existsByMemberAndPray(member, pray); - } - - @Transactional - public void saveSharedPray(String username, SharedPraySaveRequestDto sharedPraySaveRequestDto) { - - Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.getCategoryById( - sharedPraySaveRequestDto.getCategoryId()); - if (!category.getCategoryType().equals(CategoryType.SHARED)) { - throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); - } - List sharedPrayIds = sharedPraySaveRequestDto.getSharedPrayIds(); - - for (Long id : sharedPrayIds) { - save(member, id, category, sharedPraySaveRequestDto.getDeadline()); - } - } - - private void save(Member member, Long sharedPrayId, Category category, LocalDate deadline) { - - SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId); - - if (sharedPray.getPray().getDeleted()) { - sharedPrayRepository.deleteById(sharedPrayId); - throw new CustomException(ErrorStatus.PRAY_ALREADY_DELETED_EXCEPTION); - } - Pray pray = Pray.builder() - .member(member) - .content(new String(Base64.getDecoder().decode(sharedPray.getPray().getContent()))) - .deadline(deadline) - .originPrayId(sharedPray.getPray().getId()) - .originMemberId(sharedPray.getPray().getMember().getId()) // 원래 기도제목의 원자자가 되어야 함 - .category(category) - .prayType(PrayType.SHARED) - .startDate(LocalDate.now()) - .build(); - prayRepository.save(pray); - Pray originPray = prayRepository.getPrayById(pray.getOriginPrayId()); - if (originPray.getMember().getThirdNotiAgree()) { - sendNotificationAndSaveLog(originPray, originPray.getMember()); - } - sharedPrayRepository.deleteById(sharedPrayId); - } - - public void sendNotificationAndSaveLog(Pray pray, Member member) { - try { - fcmNotificationService.sendMessageTo( - member.getFirebaseToken(), - "💌", - "누군가가 당신의 기도제목을 저장했어요"); - } catch (Exception e) { - log.error(e.getMessage()); - } - log.error( - "send notification to " + memberRepository.getMemberByUserId(member.getUserId()) - ); - NotificationLog notificationLog = NotificationLog.builder() - .pray(pray) - .member(memberRepository.getMemberByUserId(member.getUserId())) - .title("누군가가 당신의 기도제목을 저장했어요") - .build(); - notificationLogRepository.save(notificationLog); - } - - @Transactional - public void deleteSharedPray(String username, - SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto) { - - Member member = memberRepository.getMemberByUserId(username); - List 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); - } - sharedPrayRepository.deleteById(sharedPrayId); - } + private final SharedPrayRepository sharedPrayRepository; + private final MemberRepository memberRepository; + private final PrayRepository prayRepository; + private final CategoryRepository categoryRepository; + private final NotificationLogRepository notificationLogRepository; + private final FCMNotificationService fcmNotificationService; + + @Transactional(readOnly = true) + public List getSharedPrayList(String username) { + + Member member = memberRepository.getMemberByUserId(username); + List sharedPrayList = sharedPrayRepository.findAllByMemberOrderByCreatedAtDesc( + member); + + List result = new ArrayList<>(); + + for (SharedPray sharedPray : sharedPrayList) { + Pray pray = prayRepository.getPrayByIdIgnoreDelete( + sharedPray.getPray().getId()); + result.add(SharedPrayResponseDto.of(sharedPray, pray)); + } + + return result; + } + + @Transactional + public Long receivedSharedPray(String username, SharedPrayRequestDto sharedPrayRequestDto) { + + Member member = memberRepository.getMemberByUserId(username); + List prayList = prayRepository.findAllByIdIn(sharedPrayRequestDto.getPrayIds()); + long total = 0L; + + if (prayList.size() != sharedPrayRequestDto.getPrayIds().size()) { + throw new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION); + } + for (Pray pray : prayList) { + if (!receiveCheck(member, pray)) { + continue; + } + SharedPray sharedPray = SharedPray.builder() + .member(member) + .pray(pray) + .build(); + sharedPrayRepository.save(sharedPray); + // 기도제목을 보관함에 담으면 원래 기도제목의 isShared를 true로 변경 + pray.setIsShared(); + prayRepository.save(pray); + total++; + } + + if (total == 0L) { + throw new CustomException(ErrorStatus.CANNOT_RECEIVE_SHARED_PRAY_EXCEPTION); + } + return total; + } + + private boolean receiveCheck(Member member, Pray pray) { + if (pray.getMember().equals(member)) { + // 자기 자신의 기도제목은 보관함에 넣을 수 없음 + return false; + } + // 이미 저장된 기도제목의 경우 다시 보관함에 담기지 않도록 처리 + if (prayRepository.existsByMemberAndOriginPrayId(member, pray.getId())) { + return false; + } + // 이미 보관함에 있는 기도제목은 보관함에 넣을 수 없음 + return !sharedPrayRepository.existsByMemberAndPray(member, pray); + } + + @Transactional + public void saveSharedPray(String username, SharedPraySaveRequestDto sharedPraySaveRequestDto) { + + Member member = memberRepository.getMemberByUserId(username); + Category category = categoryRepository.getCategoryById( + sharedPraySaveRequestDto.getCategoryId()); + if (!category.getCategoryType().equals(CategoryType.SHARED)) { + throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); + } + List sharedPrayIds = sharedPraySaveRequestDto.getSharedPrayIds(); + + for (Long id : sharedPrayIds) { + save(member, id, category, sharedPraySaveRequestDto.getDeadline()); + } + } + + private void save(Member member, Long sharedPrayId, Category category, LocalDate deadline) { + + SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId); + + if (sharedPray.getPray().getDeleted()) { + sharedPrayRepository.deleteById(sharedPrayId); + throw new CustomException(ErrorStatus.PRAY_ALREADY_DELETED_EXCEPTION); + } + Pray pray = Pray.builder() + .member(member) + .content(new String(Base64.getDecoder().decode(sharedPray.getPray().getContent()))) + .deadline(deadline) + .originPrayId(sharedPray.getPray().getId()) + .originMemberId(sharedPray.getPray().getMember().getId()) // 원래 기도제목의 원자자가 되어야 함 + .category(category) + .categoryType(CategoryType.SHARED) + .startDate(LocalDate.now()) + .build(); + prayRepository.save(pray); + Pray originPray = prayRepository.getPrayById(pray.getOriginPrayId()); + if (originPray.getMember().getThirdNotiAgree()) { + sendNotificationAndSaveLog(originPray, originPray.getMember()); + } + sharedPrayRepository.deleteById(sharedPrayId); + } + + public void sendNotificationAndSaveLog(Pray pray, Member member) { + try { + fcmNotificationService.sendMessageTo( + member.getFirebaseToken(), + "💌", + "누군가가 당신의 기도제목을 저장했어요"); + } catch (Exception e) { + log.error(e.getMessage()); + } + log.error( + "send notification to " + memberRepository.getMemberByUserId(member.getUserId()) + ); + NotificationLog notificationLog = NotificationLog.builder() + .pray(pray) + .member(memberRepository.getMemberByUserId(member.getUserId())) + .title("누군가가 당신의 기도제목을 저장했어요") + .build(); + notificationLogRepository.save(notificationLog); + } + + @Transactional + public void deleteSharedPray(String username, + SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto) { + + Member member = memberRepository.getMemberByUserId(username); + List 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); + } + sharedPrayRepository.deleteById(sharedPrayId); + } } diff --git a/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java b/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java index 99948d1a..233beab8 100644 --- a/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java +++ b/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java @@ -39,6 +39,6 @@ public void cleanSharedPray() { @Scheduled(cron = "0 0 0 * * ?") public void convertPrayToHistory() { - prayFacadeService.convertPrayToHistory(); + prayFacadeService.moveExpiredPrayersToHistory(); } } diff --git a/src/main/java/com/uspray/uspray/global/enums/PrayType.java b/src/main/java/com/uspray/uspray/global/enums/PrayType.java deleted file mode 100644 index 62a578ea..00000000 --- a/src/main/java/com/uspray/uspray/global/enums/PrayType.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.uspray.uspray.global.enums; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) -public enum PrayType { - SHARED("공유 기도"), - PERSONAL("개인 기도") - ; - private final String title; - - public String stringValue() { - return this.name(); - } -} diff --git a/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java index 87a2777f..bdef782f 100644 --- a/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java @@ -23,6 +23,7 @@ public enum ErrorStatus { ALREADY_EXIST_GROUP_MEMBER_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 회원입니다."), LEADER_CANNOT_LEAVE_GROUP_EXCEPTION(HttpStatus.BAD_REQUEST, "모임장은 모임을 떠날 수 없습니다."), ALREADY_SHARED_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 공유된 기도제목입니다."), + SHARED_PRAY_UPDATE_EXCEPTION(HttpStatus.BAD_REQUEST, "공유되어진 기도제목이나 공유해온 기도제목의 내용을 수정할 수 없습니다."), ALREADY_EXIST_GROUP_NAME_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 이름입니다."), ALREADY_CANCEL_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 취소된 기도제목입니다."), WRONG_LOGIN_INFO_EXCEPTION(HttpStatus.BAD_REQUEST, "아이디 또는 비밀번호가 틀렸습니다."), diff --git a/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java b/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java index 47db618e..aaf30761 100644 --- a/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java +++ b/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java @@ -1,17 +1,45 @@ package com.uspray.uspray.global.push.service; +import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.global.push.model.NotificationLog; import com.uspray.uspray.global.push.repository.NotificationLogRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor +@Slf4j public class NotificationLogService { + private final NotificationLogRepository notificationLogRepository; + private final FCMNotificationService fcmNotificationService; + + public void sendNotification(Member member) { + try { + fcmNotificationService.sendMessageTo( + member.getFirebaseToken(), + "💘", + "누군가가 당신의 기도제목을 두고 기도했어요"); + } catch (Exception e) { + log.error(e.getMessage()); + + } + log.error( + "send notification to " + member + ); + } + @Transactional - public void saveNotificationLog(NotificationLog notificationLog) { + public void saveNotificationLog(Pray pray, Member member) { + NotificationLog notificationLog = NotificationLog.builder() + .pray(pray) + .member(member) + .title("누군가가 당신의 기도제목을 두고 기도했어요") + .build(); + notificationLogRepository.save(notificationLog); }