Skip to content
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
4c35674
feat: 대학교 상세조회 관련 통합테스트 코드 추가
Gyuhyeok99 Jan 11, 2025
7f45bbc
feat: 대학 통합테스트를 위한 데이터 셋업 추가
Gyuhyeok99 Jan 12, 2025
2b64031
refactor: 셋업된 데이터로 대학 조회 테스트하도록 변경
Gyuhyeok99 Jan 12, 2025
28017c0
feat: 대학교 검색 관련 통합테스트 코드 추가
Gyuhyeok99 Jan 12, 2025
ae37f44
feat: 대학교 좋아요하기 관련 통합테스트 코드 추가
Gyuhyeok99 Jan 12, 2025
40bae3d
refactor: 존재하지 않는 대학 상세정보 조회 시 id 변수명 수정
Gyuhyeok99 Jan 12, 2025
030c112
refactor: *에서 구체적인 import 문으로 변경
Gyuhyeok99 Jan 12, 2025
fd8fdc7
feat: 대학교 추천 관련 통합테스트 코드 추가
Gyuhyeok99 Jan 12, 2025
3beac40
refactor: 대학교 추천 서비스에 DisplayName 추가
Gyuhyeok99 Jan 12, 2025
d2cef6d
chore: 개행 컨벤션에 맞게 수정
Gyuhyeok99 Jan 15, 2025
e28e226
test: univseritySerivice에서 존재하지 않는 사용자에 대한 예외 검증 삭제
Gyuhyeok99 Jan 15, 2025
4118d8b
refactor: UniversityService를 조회/좋아요 관련된 기능으로 분리
Gyuhyeok99 Jan 15, 2025
e2a8355
test: 조회 및 좋아요 기능 테스트 코드 분리
Gyuhyeok99 Jan 15, 2025
4c5bd9d
test: 대학교 조회 캐시 적용 테스트 개선
Gyuhyeok99 Jan 15, 2025
c53f49a
test: 예외처리 검증 테스트 한줄로 검증
Gyuhyeok99 Jan 15, 2025
f6f7932
refactor: 좋아요 관련 응답 import *에서 구체적인 import 문으로 변경
Gyuhyeok99 Jan 15, 2025
d2f0a6f
refactor: 대학 관련 서비스 dto *에서 구체적인 import 문으로 변경
Gyuhyeok99 Jan 17, 2025
ca05427
refactor: BDD Mockito 형식으로 변경
Gyuhyeok99 Jan 17, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
import com.example.solidconnection.university.dto.UniversityDetailResponse;
import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponse;
import com.example.solidconnection.university.dto.UniversityRecommendsResponse;
import com.example.solidconnection.university.service.UniversityLikeService;
import com.example.solidconnection.university.service.UniversityQueryService;
import com.example.solidconnection.university.service.UniversityRecommendService;
import com.example.solidconnection.university.service.UniversityService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -26,7 +27,8 @@
@RestController
public class UniversityController {

private final UniversityService universityService;
private final UniversityQueryService universityQueryService;
private final UniversityLikeService universityLikeService;
private final UniversityRecommendService universityRecommendService;
private final SiteUserService siteUserService;

Expand All @@ -52,23 +54,23 @@ public ResponseEntity<List<UniversityInfoForApplyPreviewResponse>> getMyWishUniv
public ResponseEntity<IsLikeResponse> getIsLiked(
Principal principal,
@PathVariable Long universityInfoForApplyId) {
IsLikeResponse isLiked = universityService.getIsLiked(principal.getName(), universityInfoForApplyId);
IsLikeResponse isLiked = universityLikeService.getIsLiked(principal.getName(), universityInfoForApplyId);
return ResponseEntity.ok(isLiked);
}

@PostMapping("/{universityInfoForApplyId}/like")
public ResponseEntity<LikeResultResponse> addWishUniversity(
Principal principal,
@PathVariable Long universityInfoForApplyId) {
LikeResultResponse likeResultResponse = universityService.likeUniversity(principal.getName(), universityInfoForApplyId);
LikeResultResponse likeResultResponse = universityLikeService.likeUniversity(principal.getName(), universityInfoForApplyId);
return ResponseEntity
.ok(likeResultResponse);
}

@GetMapping("/detail/{universityInfoForApplyId}")
public ResponseEntity<UniversityDetailResponse> getUniversityDetails(
@PathVariable Long universityInfoForApplyId) {
UniversityDetailResponse universityDetailResponse = universityService.getUniversityDetail(universityInfoForApplyId);
UniversityDetailResponse universityDetailResponse = universityQueryService.getUniversityDetail(universityInfoForApplyId);
return ResponseEntity.ok(universityDetailResponse);
}

Expand All @@ -80,7 +82,7 @@ public ResponseEntity<List<UniversityInfoForApplyPreviewResponse>> searchUnivers
@RequestParam(required = false, defaultValue = "") LanguageTestType testType,
@RequestParam(required = false, defaultValue = "") String testScore) {
List<UniversityInfoForApplyPreviewResponse> universityInfoForApplyPreviewResponse
= universityService.searchUniversity(region, keyword, testType, testScore).universityInfoForApplyPreviewResponses();
= universityQueryService.searchUniversity(region, keyword, testType, testScore).universityInfoForApplyPreviewResponses();
return ResponseEntity.ok(universityInfoForApplyPreviewResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.example.solidconnection.university.service;

import com.example.solidconnection.siteuser.domain.SiteUser;
import com.example.solidconnection.siteuser.repository.LikedUniversityRepository;
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
import com.example.solidconnection.university.domain.LikedUniversity;
import com.example.solidconnection.university.domain.UniversityInfoForApply;
import com.example.solidconnection.university.dto.IsLikeResponse;
import com.example.solidconnection.university.dto.LikeResultResponse;
import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@RequiredArgsConstructor
@Service
public class UniversityLikeService {

public static final String LIKE_SUCCESS_MESSAGE = "LIKE_SUCCESS";
public static final String LIKE_CANCELED_MESSAGE = "LIKE_CANCELED";

private final UniversityInfoForApplyRepository universityInfoForApplyRepository;
private final LikedUniversityRepository likedUniversityRepository;
private final SiteUserRepository siteUserRepository;

@Value("${university.term}")
public String term;

/*
* 대학교를 '좋아요' 한다.
* - 이미 좋아요가 눌러져있다면, 좋아요를 취소한다.
* */
@Transactional
public LikeResultResponse likeUniversity(String email, Long universityInfoForApplyId) {
SiteUser siteUser = siteUserRepository.getByEmail(email);
UniversityInfoForApply universityInfoForApply = universityInfoForApplyRepository.getUniversityInfoForApplyById(universityInfoForApplyId);

Optional<LikedUniversity> alreadyLikedUniversity = likedUniversityRepository.findBySiteUserAndUniversityInfoForApply(siteUser, universityInfoForApply);
if (alreadyLikedUniversity.isPresent()) {
likedUniversityRepository.delete(alreadyLikedUniversity.get());
return new LikeResultResponse(LIKE_CANCELED_MESSAGE);
}

LikedUniversity likedUniversity = LikedUniversity.builder()
.universityInfoForApply(universityInfoForApply)
.siteUser(siteUser)
.build();
likedUniversityRepository.save(likedUniversity);
return new LikeResultResponse(LIKE_SUCCESS_MESSAGE);
}

/*
* '좋아요'한 대학교인지 확인한다.
* */
@Transactional(readOnly = true)
public IsLikeResponse getIsLiked(String email, Long universityInfoForApplyId) {
SiteUser siteUser = siteUserRepository.getByEmail(email);
UniversityInfoForApply universityInfoForApply = universityInfoForApplyRepository.getUniversityInfoForApplyById(universityInfoForApplyId);
boolean isLike = likedUniversityRepository.findBySiteUserAndUniversityInfoForApply(siteUser, universityInfoForApply).isPresent();
return new IsLikeResponse(isLike);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
package com.example.solidconnection.university.service;

import com.example.solidconnection.cache.annotation.ThunderingHerdCaching;
import com.example.solidconnection.siteuser.domain.SiteUser;
import com.example.solidconnection.siteuser.repository.LikedUniversityRepository;
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
import com.example.solidconnection.type.LanguageTestType;
import com.example.solidconnection.university.domain.LikedUniversity;
import com.example.solidconnection.university.domain.University;
import com.example.solidconnection.university.domain.UniversityInfoForApply;
import com.example.solidconnection.university.dto.IsLikeResponse;
import com.example.solidconnection.university.dto.LikeResultResponse;
import com.example.solidconnection.university.dto.UniversityDetailResponse;
import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponse;
import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponses;
Expand All @@ -21,19 +15,13 @@
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

@RequiredArgsConstructor
@Service
public class UniversityService {

public static final String LIKE_SUCCESS_MESSAGE = "LIKE_SUCCESS";
public static final String LIKE_CANCELED_MESSAGE = "LIKE_CANCELED";
public class UniversityQueryService {

private final UniversityInfoForApplyRepository universityInfoForApplyRepository;
private final LikedUniversityRepository likedUniversityRepository;
private final UniversityFilterRepositoryImpl universityFilterRepository;
private final SiteUserRepository siteUserRepository;

@Value("${university.term}")
public String term;
Expand Down Expand Up @@ -70,38 +58,4 @@ public UniversityInfoForApplyPreviewResponses searchUniversity(
.map(UniversityInfoForApplyPreviewResponse::from)
.toList());
}

/*
* 대학교를 '좋아요' 한다.
* - 이미 좋아요가 눌러져있다면, 좋아요를 취소한다.
* */
@Transactional
public LikeResultResponse likeUniversity(String email, Long universityInfoForApplyId) {
SiteUser siteUser = siteUserRepository.getByEmail(email);
UniversityInfoForApply universityInfoForApply = universityInfoForApplyRepository.getUniversityInfoForApplyById(universityInfoForApplyId);

Optional<LikedUniversity> alreadyLikedUniversity = likedUniversityRepository.findBySiteUserAndUniversityInfoForApply(siteUser, universityInfoForApply);
if (alreadyLikedUniversity.isPresent()) {
likedUniversityRepository.delete(alreadyLikedUniversity.get());
return new LikeResultResponse(LIKE_CANCELED_MESSAGE);
}

LikedUniversity likedUniversity = LikedUniversity.builder()
.universityInfoForApply(universityInfoForApply)
.siteUser(siteUser)
.build();
likedUniversityRepository.save(likedUniversity);
return new LikeResultResponse(LIKE_SUCCESS_MESSAGE);
}

/*
* '좋아요'한 대학교인지 확인한다.
* */
@Transactional(readOnly = true)
public IsLikeResponse getIsLiked(String email, Long universityInfoForApplyId) {
SiteUser siteUser = siteUserRepository.getByEmail(email);
UniversityInfoForApply universityInfoForApply = universityInfoForApplyRepository.getUniversityInfoForApplyById(universityInfoForApplyId);
boolean isLike = likedUniversityRepository.findBySiteUserAndUniversityInfoForApply(siteUser, universityInfoForApply).isPresent();
return new IsLikeResponse(isLike);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
import static com.example.solidconnection.e2e.DynamicFixture.createLikedUniversity;
import static com.example.solidconnection.e2e.DynamicFixture.createSiteUserByEmail;
import static com.example.solidconnection.e2e.DynamicFixture.createUniversityForApply;
import static com.example.solidconnection.university.service.UniversityService.LIKE_CANCELED_MESSAGE;
import static com.example.solidconnection.university.service.UniversityService.LIKE_SUCCESS_MESSAGE;
import static com.example.solidconnection.university.service.UniversityLikeService.LIKE_CANCELED_MESSAGE;
import static com.example.solidconnection.university.service.UniversityLikeService.LIKE_SUCCESS_MESSAGE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

Expand Down
Loading