Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.example.solidconnection.admin.university.controller;

import com.example.solidconnection.admin.university.dto.AdminHomeUniversityCreateRequest;
import com.example.solidconnection.admin.university.dto.AdminHomeUniversityResponse;
import com.example.solidconnection.admin.university.dto.AdminHomeUniversityUpdateRequest;
import com.example.solidconnection.admin.university.service.AdminHomeUniversityService;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RequestMapping("/admin/home-universities")
@RestController
public class AdminHomeUniversityController {

private final AdminHomeUniversityService adminHomeUniversityService;

@GetMapping
public ResponseEntity<List<AdminHomeUniversityResponse>> getHomeUniversities() {
return ResponseEntity.ok(adminHomeUniversityService.getAllHomeUniversities());
}

@GetMapping("/{home-university-id}")
public ResponseEntity<AdminHomeUniversityResponse> getHomeUniversity(
@PathVariable("home-university-id") Long homeUniversityId
) {
return ResponseEntity.ok(adminHomeUniversityService.getHomeUniversity(homeUniversityId));
}

@PostMapping
public ResponseEntity<AdminHomeUniversityResponse> createHomeUniversity(
@Valid @RequestBody AdminHomeUniversityCreateRequest request
) {
return ResponseEntity.ok(adminHomeUniversityService.createHomeUniversity(request));
}

@PutMapping("/{home-university-id}")
public ResponseEntity<AdminHomeUniversityResponse> updateHomeUniversity(
@PathVariable("home-university-id") Long homeUniversityId,
@Valid @RequestBody AdminHomeUniversityUpdateRequest request
) {
return ResponseEntity.ok(adminHomeUniversityService.updateHomeUniversity(homeUniversityId, request));
}

@DeleteMapping("/{home-university-id}")
public ResponseEntity<Void> deleteHomeUniversity(
@PathVariable("home-university-id") Long homeUniversityId
) {
adminHomeUniversityService.deleteHomeUniversity(homeUniversityId);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.solidconnection.admin.university.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public record AdminHomeUniversityCreateRequest(
@NotBlank(message = "협정 대학명은 필수입니다")
@Size(max = 100, message = "협정 대학명은 100자 이하여야 합니다")
String name
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.solidconnection.admin.university.dto;

import com.example.solidconnection.university.domain.HomeUniversity;

public record AdminHomeUniversityResponse(
Long id,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

이런 건 null이될 수 없으니 long이 낫지 않나요? 머쓱하지만 오랜만에 pr봅니다..

String name
) {

public static AdminHomeUniversityResponse from(HomeUniversity homeUniversity) {
return new AdminHomeUniversityResponse(
homeUniversity.getId(),
homeUniversity.getName()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.solidconnection.admin.university.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public record AdminHomeUniversityUpdateRequest(
@NotBlank(message = "협정 대학명은 필수입니다")
@Size(max = 100, message = "협정 대학명은 100자 이하여야 합니다")
String name
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.example.solidconnection.admin.university.service;

import static com.example.solidconnection.common.exception.ErrorCode.HOME_UNIVERSITY_ALREADY_EXISTS;
import static com.example.solidconnection.common.exception.ErrorCode.HOME_UNIVERSITY_HAS_REFERENCES;
import static com.example.solidconnection.common.exception.ErrorCode.HOME_UNIVERSITY_NOT_FOUND;

import com.example.solidconnection.admin.university.dto.AdminHomeUniversityCreateRequest;
import com.example.solidconnection.admin.university.dto.AdminHomeUniversityResponse;
import com.example.solidconnection.admin.university.dto.AdminHomeUniversityUpdateRequest;
import com.example.solidconnection.cache.annotation.DefaultCacheOut;
import com.example.solidconnection.common.exception.CustomException;
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
import com.example.solidconnection.university.domain.HomeUniversity;
import com.example.solidconnection.university.repository.HomeUniversityRepository;
import com.example.solidconnection.university.repository.UnivApplyInfoRepository;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class AdminHomeUniversityService {

private final HomeUniversityRepository homeUniversityRepository;
private final UnivApplyInfoRepository univApplyInfoRepository;
private final SiteUserRepository siteUserRepository;

@Transactional(readOnly = true)
public List<AdminHomeUniversityResponse> getAllHomeUniversities() {
return homeUniversityRepository.findAll().stream()
.map(AdminHomeUniversityResponse::from)
.toList();
}

@Transactional(readOnly = true)
public AdminHomeUniversityResponse getHomeUniversity(Long id) {
HomeUniversity homeUniversity = homeUniversityRepository.findById(id)
.orElseThrow(() -> new CustomException(HOME_UNIVERSITY_NOT_FOUND));
return AdminHomeUniversityResponse.from(homeUniversity);
}

@Transactional
@DefaultCacheOut(
key = {"univApplyInfoTextSearch", "university:recommend:general"},
cacheManager = "customCacheManager",
prefix = true
)
public AdminHomeUniversityResponse createHomeUniversity(AdminHomeUniversityCreateRequest request) {
validateNameNotExists(request.name());
HomeUniversity homeUniversity = new HomeUniversity(null, request.name());
return AdminHomeUniversityResponse.from(homeUniversityRepository.save(homeUniversity));
}

@Transactional
@DefaultCacheOut(
key = {"univApplyInfoTextSearch", "university:recommend:general"},
cacheManager = "customCacheManager",
prefix = true
)
public AdminHomeUniversityResponse updateHomeUniversity(Long id, AdminHomeUniversityUpdateRequest request) {
HomeUniversity homeUniversity = homeUniversityRepository.findById(id)
.orElseThrow(() -> new CustomException(HOME_UNIVERSITY_NOT_FOUND));
validateNameNotDuplicated(request.name(), id);
homeUniversity.update(request.name());
return AdminHomeUniversityResponse.from(homeUniversity);
}

@Transactional
@DefaultCacheOut(
key = {"univApplyInfoTextSearch", "university:recommend:general"},
cacheManager = "customCacheManager",
prefix = true
)
public void deleteHomeUniversity(Long id) {
HomeUniversity homeUniversity = homeUniversityRepository.findById(id)
.orElseThrow(() -> new CustomException(HOME_UNIVERSITY_NOT_FOUND));
validateNoReferences(id);
homeUniversityRepository.delete(homeUniversity);
}

private void validateNameNotExists(String name) {
homeUniversityRepository.findByName(name)
.ifPresent(existing -> {
throw new CustomException(HOME_UNIVERSITY_ALREADY_EXISTS);
});
}
Comment on lines +82 to +87
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

이제 private 함수는 맨 밑으로 보내게 바뀌었나보군요!


private void validateNameNotDuplicated(String name, Long excludeId) {
homeUniversityRepository.findByName(name)
.ifPresent(existing -> {
if (!existing.getId().equals(excludeId)) {
throw new CustomException(HOME_UNIVERSITY_ALREADY_EXISTS);
}
});
}

private void validateNoReferences(Long id) {
if (univApplyInfoRepository.existsByHomeUniversityId(id)
|| siteUserRepository.existsByHomeUniversityId(id)) {
throw new CustomException(HOME_UNIVERSITY_HAS_REFERENCES);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ public enum ErrorCode {
COUNTRY_ALREADY_EXISTS(HttpStatus.CONFLICT.value(), "이미 존재하는 국가입니다."),
HOST_UNIVERSITY_ALREADY_EXISTS(HttpStatus.CONFLICT.value(), "이미 존재하는 파견 대학입니다."),
HOST_UNIVERSITY_HAS_REFERENCES(HttpStatus.CONFLICT.value(), "해당 파견 대학을 참조하는 대학 지원 정보가 존재합니다."),
HOME_UNIVERSITY_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "협정 대학교를 찾을 수 없습니다."),
HOME_UNIVERSITY_ALREADY_EXISTS(HttpStatus.CONFLICT.value(), "이미 존재하는 협정 대학입니다."),
HOME_UNIVERSITY_HAS_REFERENCES(HttpStatus.CONFLICT.value(), "해당 협정 대학을 참조하는 데이터가 존재합니다."),
COUNTRY_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "국가를 찾을 수 없습니다."),
COUNTRY_NOT_FOUND_BY_KOREAN_NAME(HttpStatus.NOT_FOUND.value(), "이름에 해당하는 국가를 찾을 수 없습니다."),
GPA_SCORE_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "존재하지 않는 학점입니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public interface SiteUserRepository extends JpaRepository<SiteUser, Long>, SiteU

List<SiteUser> findAllByIdIn(List<Long> ids);

boolean existsByHomeUniversityId(Long homeUniversityId);

@Modifying
@Query("UPDATE SiteUser u SET u.userStatus = :status WHERE u.id IN :userIds")
void bulkUpdateUserStatus(@Param("userIds") List<Long> userIds, @Param("status") UserStatus status);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,8 @@ public class HomeUniversity extends BaseEntity {

@Column(name = "name", nullable = false, unique = true, length = 100)
private String name;

public void update(String name) {
this.name = name;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ default UnivApplyInfo getUnivApplyInfoById(Long id) {

boolean existsByUniversityId(Long universityId);

boolean existsByHomeUniversityId(Long homeUniversityId);

@Query("""
SELECT uai.id
FROM UnivApplyInfo uai
Expand Down
Loading
Loading