Skip to content
New issue

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

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

Already on GitHub? # to your account

[TSK-51] refactor: 입학타입 상세 #88

Merged
merged 14 commits into from
Oct 31, 2024
Merged
13 changes: 5 additions & 8 deletions src/main/java/mju/iphak/maru_egg/MaruEggApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,11 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.servers.Server;

@OpenAPIDefinition(
servers = {
@Server(url = "https://marueggserver.com", description = "Default Server url")
}
)
// @OpenAPIDefinition(
// servers = {
// @Server(url = "https://marueggserver.com", description = "Default Server url")
// }
// )
@SpringBootApplication
@EnableJpaAuditing
public class MaruEggApplication {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package mju.iphak.maru_egg.admission.api;

import org.springframework.web.bind.annotation.DeleteMapping;
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;

import lombok.RequiredArgsConstructor;
import mju.iphak.maru_egg.admission.api.swagger.AdminAdmissionTypeDetailControllerDocs;
import mju.iphak.maru_egg.admission.application.AdmissionTypeDetailService;
import mju.iphak.maru_egg.admission.dto.request.CreateAdmissionTypeDetailRequest;

@RestController
@RequestMapping("/api/admin/admissions")
@RequiredArgsConstructor
public class AdminAdmissionTypeDetailController implements AdminAdmissionTypeDetailControllerDocs {

private final AdmissionTypeDetailService admissionTypeDetailService;

@PostMapping("/detail")
public void create(@RequestBody CreateAdmissionTypeDetailRequest request) {
admissionTypeDetailService.create(request.detail(), request.type());
}

@PutMapping("/{id}")
public void update(@PathVariable("id") Long admissionTypeDetailId, @RequestBody String name) {
admissionTypeDetailService.update(admissionTypeDetailId, name);
}

@DeleteMapping("/{id}")
public void delete(@PathVariable("id") Long id) {
admissionTypeDetailService.delete(id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package mju.iphak.maru_egg.admission.api;

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;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import mju.iphak.maru_egg.admission.api.swagger.AdminAdmissionTypeStatusControllerDocs;
import mju.iphak.maru_egg.admission.application.AdmissionTypeStatusService;
import mju.iphak.maru_egg.admission.dto.request.UpdateAdmissionTypeStatusRequest;

@RequiredArgsConstructor
@RestController
@RequestMapping("/api/admin/questions/status")
public class AdminAdmissionTypeStatusController implements AdminAdmissionTypeStatusControllerDocs {

private final AdmissionTypeStatusService admissionTypeStatusService;

@PostMapping("/init")
public void initializeQuestionTypeStatus() {
admissionTypeStatusService.initializeAdmissionTypeStatus();
}

@PutMapping()
public void updateQuestionTypeStatus(@Valid @RequestBody UpdateAdmissionTypeStatusRequest request) {
admissionTypeStatusService.updateStatus(request.type());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package mju.iphak.maru_egg.admission.api;

import java.util.List;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import mju.iphak.maru_egg.admission.api.swagger.AdmissionTypeDetailControllerDocs;
import mju.iphak.maru_egg.admission.application.AdmissionTypeDetailService;
import mju.iphak.maru_egg.admission.domain.AdmissionType;
import mju.iphak.maru_egg.admission.dto.response.AdmissionTypeDetailResponse;

@RestController
@RequestMapping("/api/admissions")
@RequiredArgsConstructor
public class AdmissionTypeDetailController implements AdmissionTypeDetailControllerDocs {

private final AdmissionTypeDetailService admissionTypeDetailService;

@GetMapping("/details")
public List<AdmissionTypeDetailResponse> getAll() {
return admissionTypeDetailService.findAll();
}

@GetMapping("/details/{type}")
public List<AdmissionTypeDetailResponse> getAllByType(@PathVariable("type") AdmissionType type) {
return admissionTypeDetailService.findAllByAdmissionType(type);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package mju.iphak.maru_egg.question.api;
package mju.iphak.maru_egg.admission.api;

import java.util.List;

Expand All @@ -7,24 +7,24 @@
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import mju.iphak.maru_egg.admission.api.swagger.AdmissionTypeStatusControllerDocs;
import mju.iphak.maru_egg.admission.application.AdmissionTypeStatusService;
import mju.iphak.maru_egg.admission.dto.response.AdmissionTypeStatusResponse;
import mju.iphak.maru_egg.common.meta.CustomApiResponse;
import mju.iphak.maru_egg.common.meta.CustomApiResponses;
import mju.iphak.maru_egg.question.application.QuestionTypeStatusService;
import mju.iphak.maru_egg.question.docs.QuestionTypeStatusControllerDocs;
import mju.iphak.maru_egg.question.dto.response.QuestionTypeStatusResponse;

@RequiredArgsConstructor
@RestController
@RequestMapping("/api/questions/status")
public class QuestionTypeStatusController implements QuestionTypeStatusControllerDocs {
@RequestMapping("/api/admissions/status")
public class AdmissionTypeStatusController implements AdmissionTypeStatusControllerDocs {

private final QuestionTypeStatusService questionTypeStatusService;
private final AdmissionTypeStatusService admissionTypeStatusService;

@CustomApiResponses({
@CustomApiResponse(error = "InternalServerError", status = 500, message = "내부 서버 오류가 발생했습니다.", description = "내부 서버 오류")
})
@GetMapping()
public List<QuestionTypeStatusResponse> getQuestionTypeStatus() {
return questionTypeStatusService.getQuestionTypeStatus();
public List<AdmissionTypeStatusResponse> getQuestionTypeStatus() {
return admissionTypeStatusService.getAdmissionTypeStatus();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package mju.iphak.maru_egg.admission.api.swagger;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import mju.iphak.maru_egg.admission.dto.request.CreateAdmissionTypeDetailRequest;

@Tag(name = "Admin AdmissionTypeDetail API", description = "어드민 입학타입 상세 관련 API 입니다.")
public interface AdminAdmissionTypeDetailControllerDocs {

@Operation(summary = "입학타입 상세 생성", description = "새로운 입학타입 상세를 생성합니다.", responses = {
@ApiResponse(responseCode = "200", description = "입학타입 상세 생성 성공")
})
void create(@Valid @RequestBody CreateAdmissionTypeDetailRequest request);

@Operation(summary = "입학타입 상세 업데이트", description = "특정 입학타입 상세를 업데이트합니다.", responses = {
@ApiResponse(responseCode = "200", description = "입학타입 상세 업데이트 성공")
})
void update(@PathVariable("id") Long admissionTypeDetailId, @RequestBody String name);

@Operation(summary = "입학타입 상세 삭제", description = "특정 입학타입 상세를 삭제합니다.", responses = {
@ApiResponse(responseCode = "200", description = "입학타입 상세 삭제 성공")
})
void delete(@PathVariable("id") Long id);
}
Original file line number Diff line number Diff line change
@@ -1,41 +1,33 @@
package mju.iphak.maru_egg.question.api;
package mju.iphak.maru_egg.admission.api.swagger;

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;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import mju.iphak.maru_egg.admission.dto.request.UpdateAdmissionTypeStatusRequest;
import mju.iphak.maru_egg.common.meta.CustomApiResponse;
import mju.iphak.maru_egg.common.meta.CustomApiResponses;
import mju.iphak.maru_egg.question.application.QuestionTypeStatusService;
import mju.iphak.maru_egg.question.docs.AdminQuestionTypeStatusControllerDocs;
import mju.iphak.maru_egg.question.dto.request.UpdateQuestionTypeStatusRequest;

@RequiredArgsConstructor
@RestController
@RequestMapping("/api/admin/questions/status")
public class AdminQuestionTypeStatusController implements AdminQuestionTypeStatusControllerDocs {

private final QuestionTypeStatusService questionTypeStatusService;
@Tag(name = "Admin AdmissionTypeStatus API", description = "어드민 입학타입 상태 관련 API 입니다.")
public interface AdminAdmissionTypeStatusControllerDocs {

@Operation(summary = "질문타입 초기화", description = "현재 제공 중인 질문 타입에 대해 DB에 초기화합니다.", responses = {
@ApiResponse(responseCode = "200", description = "질문타입 초기화 성공")
})
@CustomApiResponses({
@CustomApiResponse(error = "InternalServerError", status = 500, message = "내부 서버 오류가 발생했습니다.", description = "내부 서버 오류")
})
@PostMapping("/init")
public void initializeQuestionTypeStatus() {
questionTypeStatusService.initializeQuestionTypeStatus();
}
void initializeQuestionTypeStatus();

@Operation(summary = "질문타입 상태 변경", description = "질문타입의 상태를 변경합니다. (true <-> false)", responses = {
@ApiResponse(responseCode = "200", description = "질문타입 상태 변경 성공")
})
@CustomApiResponses({
@CustomApiResponse(error = "HttpMessageNotReadableException", status = 400, message = "\"Invalid input format: JSON parse error: Cannot deserialize value of type `java.lang.Long` from String \\\"잘못된 형식의 질문 ID\\\": not a valid `java.lang.Long` value\"", description = "json 형식 및 타입에 맞지 않은 요청을 할 경우"),
@CustomApiResponse(error = "EntityNotFoundException", status = 404, message = "질문 타입이 수시인 질문 상태를 찾을 수 없습니다", description = "해당 타입을 찾을 수 없는 경우"),
@CustomApiResponse(error = "InternalServerError", status = 500, message = "내부 서버 오류가 발생했습니다.", description = "내부 서버 오류")
})
@PutMapping()
public void updateQuestionTypeStatus(@Valid @RequestBody UpdateQuestionTypeStatusRequest request) {
questionTypeStatusService.updateStatus(request.type());
}
void updateQuestionTypeStatus(@Valid @RequestBody UpdateAdmissionTypeStatusRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package mju.iphak.maru_egg.admission.api.swagger;

import java.util.List;

import org.springframework.web.bind.annotation.PathVariable;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import mju.iphak.maru_egg.admission.domain.AdmissionType;
import mju.iphak.maru_egg.admission.dto.response.AdmissionTypeDetailResponse;

@Tag(name = "AdmissionTypeDetail API", description = "입학타입 상세 관련 API 입니다.")
public interface AdmissionTypeDetailControllerDocs {
@Operation(summary = "모든 입학타입 상세 조회", description = "모든 입학타입 상세 리스트를 조회합니다.", responses = {
@ApiResponse(responseCode = "200", description = "모든 입학타입 상세 조회 성공")
})
List<AdmissionTypeDetailResponse> getAll();

@Operation(summary = "입학타입별 상세 조회", description = "특정 입학타입에 따라 입학타입 상세 리스트를 조회합니다.", responses = {
@ApiResponse(responseCode = "200", description = "입학타입별 상세 조회 성공")
})
List<AdmissionTypeDetailResponse> getAllByType(@PathVariable("type") AdmissionType type);

}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package mju.iphak.maru_egg.question.docs;
package mju.iphak.maru_egg.admission.api.swagger;

import java.util.List;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import mju.iphak.maru_egg.question.dto.response.QuestionTypeStatusResponse;
import mju.iphak.maru_egg.admission.dto.response.AdmissionTypeStatusResponse;

@Tag(name = "QuestionTypeStatus API", description = "질문타입 상태 관련 API 입니다.")
public interface QuestionTypeStatusControllerDocs {
public interface AdmissionTypeStatusControllerDocs {

@Operation(summary = "전체 질문타입과 상태 조회", description = "전체 질문타입과 상태를 조회합니다.", responses = {
@ApiResponse(responseCode = "200", description = "전체 질문타입과 상태 조회 성공")
})
List<QuestionTypeStatusResponse> getQuestionTypeStatus();
List<AdmissionTypeStatusResponse> getQuestionTypeStatus();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package mju.iphak.maru_egg.admission.application;

import static mju.iphak.maru_egg.common.exception.ErrorCode.*;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import mju.iphak.maru_egg.admission.domain.AdmissionType;
import mju.iphak.maru_egg.admission.domain.AdmissionTypeDetail;
import mju.iphak.maru_egg.admission.domain.AdmissionTypeStatus;
import mju.iphak.maru_egg.admission.dto.response.AdmissionTypeDetailResponse;
import mju.iphak.maru_egg.admission.repository.AdmissionTypeDetailRepository;

@Service
@Transactional
@RequiredArgsConstructor
public class AdmissionTypeDetailService {

private final AdmissionTypeStatusService admissionTypeStatusService;
private final AdmissionTypeDetailRepository admissionTypeDetailRepository;

public void create(String detail, AdmissionType type) {
AdmissionTypeStatus admissionTypeStatus = admissionTypeStatusService.findByAdmissionType(type);
AdmissionTypeDetail admissionTypeDetail = AdmissionTypeDetail.of(detail, admissionTypeStatus);
admissionTypeDetailRepository.save(admissionTypeDetail);
}

public List<AdmissionTypeDetailResponse> findAllByAdmissionType(AdmissionType admissionType) {
List<AdmissionTypeDetail> admissionTypeDetails = admissionTypeDetailRepository.findAllByAdmissionType(
admissionType);
return admissionTypeDetails.stream()
.map(AdmissionTypeDetailResponse::from)
.toList();
}

public List<AdmissionTypeDetailResponse> findAll() {
List<AdmissionTypeDetail> admissionTypeDetails = admissionTypeDetailRepository.findAll();
return admissionTypeDetails.stream()
.map(AdmissionTypeDetailResponse::from)
.toList();
}

public AdmissionTypeDetailResponse findOne(Long id) {
AdmissionTypeDetail admissionTypeDetail = admissionTypeDetailRepository.findById(id)
.orElseThrow(
() -> new EntityNotFoundException(String.format(NOT_FOUND_ADMISSION_TYPE_DETAILS.getMessage(), id)));
return AdmissionTypeDetailResponse.from(admissionTypeDetail);
}

public void update(Long admissionTypeDetailId, String name) {
AdmissionTypeDetail admissionTypeDetail = admissionTypeDetailRepository.findById(admissionTypeDetailId)
.orElseThrow(
() -> new EntityNotFoundException(
String.format(NOT_FOUND_ADMISSION_TYPE_DETAILS.getMessage(), admissionTypeDetailId)));
admissionTypeDetail.updateDetailName(name);
}

public void delete(Long id) {
AdmissionTypeDetail admissionTypeDetail = admissionTypeDetailRepository.findById(id)
.orElseThrow(
() -> new EntityNotFoundException(String.format(NOT_FOUND_ADMISSION_TYPE_DETAILS.getMessage(), id)));
admissionTypeDetailRepository.delete(admissionTypeDetail);
}
}
Loading
Loading