Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

✨ 기록 조회 및 생성 API & Util 및 사용자 정의 함수 적용 #91

Merged
merged 18 commits into from
Feb 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
1ecd413
fix: Schedule Repository의 인터페이스 다중 구현으로 변경
psychology50 Jan 26, 2024
ce5f9a6
feat: #83 extendedRepository에 QueryDsl 추가
psychology50 Jan 26, 2024
1147ef4
feat: #83 JPAQuery 구성 메서드 정의
psychology50 Jan 26, 2024
46418da
refactor: #83 byildWithoutSelect 메서드 코드 정리
psychology50 Jan 26, 2024
b74486e
feat: #83 Select Query Dsl 일반화 && docs: 메서드 주석 추가
psychology50 Jan 26, 2024
c175bd7
feat: #83 docs: #83 전체 인터페이스 메서드 예시 코드 추가
psychology50 Jan 26, 2024
a8e7e3a
fix: #83 반려동물 등록 시, 루트 카테고리 등록
psychology50 Jan 26, 2024
8ec00ea
feat: #83 1차 URL 구조 설계
psychology50 Jan 27, 2024
8bbfec9
feat: #83 memo api preAuthorize 체크
psychology50 Jan 28, 2024
3c612a0
feat: #83 memo category 조회 및 sub category 저장 API
psychology50 Jan 28, 2024
d18be1b
feat: #83 사용자의 모든 메모 카테고리 리스트 조회 API
psychology50 Jan 29, 2024
aa6fdbf
fix: #90 schedule 등록 시, url에 pet_id 제거
psychology50 Jan 29, 2024
e1ae4f2
feat: #83 memo save api
psychology50 Jan 29, 2024
23af518
feat: #83 memo 단건 조회 api
psychology50 Jan 30, 2024
de5a58a
feat: #83 MySQL Full Text Search를 위한 사용자 정의 함수 정의 (자연어, 불린, 쿼리 확장 모드)
psychology50 Jan 30, 2024
b6959e8
feat: #83 memo 조회 API && QueryDslUtil 및 MySQL 방언 사용자 정의 함수 작성
psychology50 Jan 31, 2024
3dcc9e6
fix: #83 memo_image 테이블로 인한 limit 이슈 해결을 위한 Query 조정 && docs: QueryDs…
psychology50 Jan 31, 2024
2e73481
feat: #83 반려동물의 가장 최근 기록 리스트 조회
psychology50 Feb 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions src/main/java/com/kcy/fitapet/FitapetApplication.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package com.kcy.fitapet;

import com.kcy.fitapet.global.common.repository.ExtendedJpaRepositoryFactory;
import com.kcy.fitapet.global.common.repository.ExtendedRepositoryFactory;
import jakarta.annotation.PostConstruct;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import java.util.TimeZone;

@SpringBootApplication
@EnableJpaRepositories(repositoryFactoryBeanClass = ExtendedJpaRepositoryFactory.class)
@EnableJpaRepositories(repositoryFactoryBeanClass = ExtendedRepositoryFactory.class)
public class FitapetApplication {
public static void main(String[] args) {
SpringApplication.run(FitapetApplication.class, args);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.kcy.fitapet.domain.care.dao;

import com.kcy.fitapet.domain.care.domain.CareCategory;
import com.kcy.fitapet.global.common.repository.ExtendedRepository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.kcy.fitapet.global.common.repository.ExtendedJpaRepository;

import java.util.List;

public interface CareCategoryRepository extends ExtendedRepository<CareCategory, Long> {
public interface CareCategoryRepository extends ExtendedJpaRepository<CareCategory, Long> {
List<CareCategory> findAllByPet_Id(Long petId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

import com.kcy.fitapet.domain.care.domain.CareDate;
import com.kcy.fitapet.domain.care.type.WeekType;
import com.kcy.fitapet.global.common.repository.ExtendedRepository;
import com.kcy.fitapet.global.common.repository.ExtendedJpaRepository;

import java.util.List;

public interface CareDateRepository extends ExtendedRepository<CareDate, Long> {
public interface CareDateRepository extends ExtendedJpaRepository<CareDate, Long> {
List<CareDate> findAllByCare_IdAndWeek(Long careId, WeekType week);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.kcy.fitapet.domain.care.dao;

import com.kcy.fitapet.domain.care.domain.Care;
import com.kcy.fitapet.global.common.repository.ExtendedRepository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.kcy.fitapet.global.common.repository.ExtendedJpaRepository;

public interface CareRepository extends ExtendedRepository<Care, Long> {
public interface CareRepository extends ExtendedJpaRepository<Care, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,9 @@ public CareInfoRes findCaresByPetId(Long petId) {
List<CareInfoRes.CareDto> careDtos = new ArrayList<>();
for (Care care : cares) {
WeekType todayWeek = WeekType.fromLegacyType(LocalDateTime.now().getDayOfWeek().toString());
log.info("todayWeek: {}", todayWeek);
List<CareDate> careDates = careSearchService.findCareDatesCareIdAndWeek(care.getId(), todayWeek);
for (CareDate careDate : careDates) {
LocalDateTime today = LocalDateTime.now();
log.info("today: {}", today);

boolean isClear = careLogSearchService.existsByCareDateIdOnLogDate(careDate.getId(), today);
log.info("isClear: {}", isClear);
Expand Down
28 changes: 26 additions & 2 deletions src/main/java/com/kcy/fitapet/domain/member/api/AccountApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

Expand All @@ -46,8 +48,8 @@ public ResponseEntity<?> getProfile(@PathVariable("id") Long id) {
}

@Operation(summary = "닉네임 존재 확인")
@GetMapping("/exists")
@Parameter(name = "uid", description = "확인할 유저 닉네임", in = ParameterIn.QUERY, required = true)
@GetMapping("/exists")
@PreAuthorize("isAnonymous()")
public ResponseEntity<?> getExistsUid(@RequestParam("uid") @NotBlank String uid) {
boolean exists = memberAccountService.existsUid(uid);
Expand All @@ -73,11 +75,11 @@ public ResponseEntity<?> putProfile(
}

@Operation(summary = "ID/PW 찾기")
@PostMapping("/search")
@Parameters({
@Parameter(name = "type", description = "찾을 타입", example = "uid/password", in = ParameterIn.QUERY, required = true),
@Parameter(name = "code", description = "인증번호", in = ParameterIn.QUERY, required = true),
})
@PostMapping("/search")
@PreAuthorize("isAnonymous()")
public ResponseEntity<?> postSearchIdOrPassword(
@RequestParam("type") @NotBlank SmsPrefix type,
Expand Down Expand Up @@ -107,4 +109,26 @@ public ResponseEntity<?> putNotify(
memberAccountService.updateNotification(id, user.getUserId(), type);
return ResponseEntity.ok(SuccessResponse.noContent());
}

@Operation(summary = "관리 중인 반려동물 날짜별 스케줄 전체 조회")
@GetMapping("/{user_id}/schedules")
@PreAuthorize("isAuthenticated() and #userId == principal.userId")
public ResponseEntity<?> getCalendarSchedules(
@PathVariable("user_id") Long userId,
@RequestParam(value = "year") Integer year,
@RequestParam(value = "month") Integer month,
@RequestParam(value = "day") Integer day
) {
LocalDateTime date = LocalDate.of(year, month, day).atStartOfDay();
log.info("date: {}", date);
return ResponseEntity.ok(SuccessResponse.from("schedules", memberAccountService.findPetSchedules(userId, date).getSchedules()));
}

@Operation(summary = "관리 중인 반려동물의 모든 메모 카테고리 조회")
@Parameter(name = "id", description = "조회할 프로필 ID", in = ParameterIn.PATH, required = true)
@GetMapping("/{id}/memo-categories")
@PreAuthorize("isAuthenticated() and #id == principal.userId")
public ResponseEntity<?> getMemoCategories(@PathVariable("id") Long id) {
return ResponseEntity.ok(SuccessResponse.from("rootMemoCategories", memberAccountService.getMemoCategories(id)));
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.kcy.fitapet.domain.member.dao;

import com.kcy.fitapet.domain.member.domain.Manager;
import com.kcy.fitapet.global.common.repository.ExtendedRepository;
import org.springframework.data.jpa.repository.Query;
import com.kcy.fitapet.global.common.repository.ExtendedJpaRepository;

import java.util.List;

public interface ManagerRepository extends ExtendedRepository<Manager, Long> {
public interface ManagerRepository extends ExtendedJpaRepository<Manager, Long> {
boolean existsByMember_IdAndPet_Id(Long memberId, Long petId);
List<Manager> findAllByMember_Id(Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.kcy.fitapet.domain.member.dao;

import java.util.List;

public interface MemberQueryDslRepository {
List<Long> findMyPetIds(Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.kcy.fitapet.domain.member.dao;

import com.kcy.fitapet.domain.member.domain.QManager;
import com.kcy.fitapet.domain.member.domain.QMember;
import com.kcy.fitapet.domain.pet.domain.QPet;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class MemberQueryDslRepositoryImpl implements MemberQueryDslRepository {
private final JPAQueryFactory queryFactory;
private final QMember member = QMember.member;
private final QManager manager = QManager.manager;
private final QPet pet = QPet.pet;

@Override
public List<Long> findMyPetIds(Long memberId) {
return queryFactory.select(pet.id)
.from(member)
.leftJoin(manager).on(manager.member.id.eq(member.id))
.leftJoin(pet).on(pet.id.eq(manager.pet.id))
.where(member.id.eq(memberId))
.fetch();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import java.util.Optional;

public interface MemberRepository extends ExtendedRepository<Member, Long> {
public interface MemberRepository extends ExtendedRepository<Member, Long>, MemberQueryDslRepository {
Optional<Member> findByUid(String uid);
Optional<Member> findByPhone(String phone);
boolean existsByUidOrPhone(String uid, String phone);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@
import com.kcy.fitapet.domain.member.exception.SmsErrorCode;
import com.kcy.fitapet.domain.member.service.module.MemberSearchService;
import com.kcy.fitapet.domain.member.type.MemberAttrType;
import com.kcy.fitapet.domain.memo.dto.MemoCategoryInfoDto;
import com.kcy.fitapet.domain.memo.service.module.MemoSearchService;
import com.kcy.fitapet.domain.notification.type.NotificationType;
import com.kcy.fitapet.domain.pet.domain.Pet;
import com.kcy.fitapet.domain.pet.dto.PetInfoRes;
import com.kcy.fitapet.domain.pet.service.module.PetSearchService;
import com.kcy.fitapet.domain.schedule.dto.ScheduleInfoDto;
import com.kcy.fitapet.domain.schedule.service.module.ScheduleSearchService;
import com.kcy.fitapet.global.common.redis.sms.SmsRedisHelper;
import com.kcy.fitapet.global.common.redis.sms.type.SmsPrefix;
import com.kcy.fitapet.global.common.response.code.StatusCode;
Expand All @@ -25,6 +29,8 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Service
Expand All @@ -33,6 +39,9 @@
public class MemberAccountService {
private final MemberSearchService memberSearchService;

private final ScheduleSearchService scheduleSearchService;
private final MemoSearchService memoSearchService;

private final SmsRedisHelper smsRedisHelper;

private final PasswordEncoder bCryptPasswordEncoder;
Expand Down Expand Up @@ -91,6 +100,31 @@ public void updateNotification(Long requestId, Long userId, NotificationType typ
member.updateNotificationFromType(type);
}

@Transactional(readOnly = true)
public ScheduleInfoDto findPetSchedules(Long userId, LocalDateTime date) {
List<Pet> pets = memberSearchService.findAllManagerByMemberId(userId)
.stream().map(Manager::getPet).toList();
List<Long> petIds = pets.stream().map(Pet::getId).toList();

List<ScheduleInfoDto.ScheduleInfo> scheduleInfo = scheduleSearchService.findSchedulesByCalender(date, petIds);
return ScheduleInfoDto.of(scheduleInfo);
}

@Transactional(readOnly = true)
public List<MemoCategoryInfoDto.MemoCategoryInfo> getMemoCategories(Long userId) {
List<Long> petIds = memberSearchService.findMyPetIds(userId);
log.info("userId: {}, petIds: {}", userId, petIds);

List<Long> rootMemoCategoryIds = memoSearchService.findRootMemoCategoriesIdByPetIds(petIds);
List<MemoCategoryInfoDto.MemoCategoryInfo> rootMemoCategories = new ArrayList<>();

for (Long rootMemoCategoryId : rootMemoCategoryIds) {
rootMemoCategories.add(memoSearchService.findMemoCategoryWithMemoCount(rootMemoCategoryId));
}

return rootMemoCategories;
}

/**
* 사용자 입력 닉네임과 기존 닉네임이 일치하는지 확인하고 변경 사항이 없으면 예외 <br/>
* @param member Member : 사용자 정보
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
Expand Down Expand Up @@ -43,6 +42,11 @@ public List<Manager> findAllManagerByMemberId(Long memberId) {
return managerRepository.findAllByMember_Id(memberId);
}

@Transactional(readOnly = true)
public List<Long> findMyPetIds(Long memberId) {
return memberRepository.findMyPetIds(memberId);
}

@Transactional(readOnly = true)
public boolean isExistByUidOrPhone(String uid, String phone) {
return memberRepository.existsByUidOrPhone(uid, phone);
Expand Down
Loading
Loading