Skip to content
Merged
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
Expand Up @@ -29,6 +29,10 @@ public enum CommonErrorCode implements ErrorCode {
// For test
TEMP_EXCEPTION(HttpStatus.BAD_REQUEST, "TEMP4001", "이거는 테스트"),

//자가진단 알고리즘
SYSTEM_SYMPTOM_NOT_FOUND(HttpStatus.NOT_FOUND, "DIAG404", "해당 system/symptom 조합이 존재하지 않습니다."),
CONDITION_NOT_AVAILABLE(HttpStatus.NOT_FOUND, "DIAG404", "해당 조합은 condition 단계가 없는 two-step 항목입니다."),

//회원가입
LANGUAGE_NOT_FOUND(HttpStatus.NOT_FOUND, "COMMON404", "관련된 언어 데이터가 없습니다."),
NATION_NOT_FOUND(HttpStatus.NOT_FOUND, "COMMON404", "관련된 국가 데이터가 없습니다.");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.onebridge.ouch.controller.guide;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import com.onebridge.ouch.dto.guide.MedicalVisitGuideStep;
import com.onebridge.ouch.service.guide.MedicalVisitGuideService;

@Tag(name = "통역 상황 속 진료 가이드 API", description = "통역 도중 사용하는 Json 형식의 진료 가이드 API 입니다. 전체 조희 기반으로 필요한 항목만 매핑해서 사용하는 식으로 사용하시면 됩니다."
+ " 현재 한국어와 영어를 제공하며, 추후 다국어 지원 예정입니다.")
@RestController
@RequestMapping("/guide/visit")
@RequiredArgsConstructor
public class MedicalVisitGuideController {

private final MedicalVisitGuideService guideService;

@Operation(summary = "통역 상황 속 진료 가이드 전체 조회 API", description = "진료 가이드 내용 전체를 Json 형식으로 조회합니다.")
@GetMapping
public List<MedicalVisitGuideStep> getAllSteps() {
return guideService.getAllSteps();
}

@Operation(summary = "통역 상황 속 진료 가이드 스탭 별(step=1~5) 제공 API", description = "진료 가이드를 스탭(1~5) 별로 조회합니다.")
@GetMapping("/{step}")
public ResponseEntity<MedicalVisitGuideStep> getStep(@PathVariable int step) {
MedicalVisitGuideStep result = guideService.getStepByNumber(step);
return result != null ? ResponseEntity.ok(result) : ResponseEntity.notFound().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.onebridge.ouch.controller.guide;

import com.onebridge.ouch.dto.guide.OuchGuideEntry;
import com.onebridge.ouch.service.guide.OuchGuideService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "Ouch Guide API", description = "홈 화면에서 접근하는 Ouch Guide API입니다. 한국 의료 시스템이나 Ouch 서비스에 대해 자주 묻는 질문과 답변을 제공합니다. 카테고리별 필터링도 가능하며, 현재 한국어와 영어를 지원합니다.")
@RestController
@RequestMapping("/guide/ouch")
@RequiredArgsConstructor
public class OuchGuideController {

private final OuchGuideService guideService;

@Operation(summary = "전체 참고 질문/답변 조회", description = "진료 중 자주 묻는 질문 및 답변 전체를 JSON 형태로 조회합니다.")
@GetMapping
public List<OuchGuideEntry> getAll() {
return guideService.getAll();
}

@Operation(summary = "카테고리별 참고 질문/답변 조회", description = "카테고리명(한글 또는 영어)과 언어 코드(ko/en)를 기반으로 해당 항목을 필터링하여 조회합니다.")
@GetMapping("/filter")
public ResponseEntity<List<OuchGuideEntry>> getByCategory(
@Parameter(description = "카테고리 이름 (예: 보험 및 비용 / Insurance & Costs", example = "Insurance & Costs")
@RequestParam String category,

@Parameter(description = "언어 코드 (ko 또는 en)", example = "en")
@RequestParam String languageCode
) {
List<OuchGuideEntry> result = guideService.getByCategory(category, languageCode);
return result.isEmpty() ? ResponseEntity.notFound().build() : ResponseEntity.ok(result);
}

@Operation(summary = "카테고리 목록 조회", description = "언어(ko/en) 기준으로 카테고리 이름 목록을 조회합니다.")
@GetMapping("/categories")
public ResponseEntity<List<String>> getCategories(
@RequestParam(name = "languageCode", defaultValue = "en") String languageCode
) {
return ResponseEntity.ok(guideService.getAllCategories(languageCode));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.onebridge.ouch.controller.selfDiagnosis;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import com.onebridge.ouch.dto.selfDiagnosis.request.DiagnosisAlgorithmRequest;
import com.onebridge.ouch.dto.selfDiagnosis.response.DiagnosisAlgorithmMapping;
import com.onebridge.ouch.service.selfDiagnosis.DiagnosisAlgorithmService;

@Tag(name = "자가진단 알고리즘 API", description = "JSON 기반의 자가진단 알고리즘 API입니다. 단계별 선택지(1차 system, 2차 symptom, 3차 condition)를 활용하여 진료과를 추천받을 수 있습니다. "
+ "현재 한국어(ko)와 영어(en)를 지원합니다.")
@RestController
@RequestMapping("/diagnosis-algorithm")
@RequiredArgsConstructor
public class DiagnosisAlgorithmController {

private final DiagnosisAlgorithmService diagnosisService;

@Operation(summary = "전체 알고리즘 데이터 조회", description = "모든 자가진단 알고리즘 항목을 JSON 배열로 조회합니다.")
@GetMapping
public List<DiagnosisAlgorithmMapping> getAllMappings() {
return diagnosisService.getAll();
}

@Operation(summary = "증상 기반 진료과 추천", description = "1차 System, 2차 Symptom, 3차 Condition을 기반으로 관련 진료과를 추천합니다. Condition은 'type = three-step'일 경우에만 입력합니다.")
@PostMapping
public ResponseEntity<DiagnosisAlgorithmMapping> getDiagnosis(@RequestBody DiagnosisAlgorithmRequest request) {
return diagnosisService.findMatch(
request.getLanguage(),
request.getSystem(),
request.getSymptom(),
request.getCondition())
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}

@Operation(summary = "1차 시스템 목록 조회", description = "자가진단 알고리즘에서 사용 가능한 'system' 리스트를 언어 코드 기준으로 조회합니다.")
@GetMapping("/systems")
public ResponseEntity<List<String>> getSystems(
@Parameter(description = "언어 코드 (ko 또는 en)", example = "en")
@RequestParam(defaultValue = "en") String languageCode) {
return ResponseEntity.ok(diagnosisService.getUniqueSystems(languageCode));
}

@Operation(summary = "2차 증상 목록 조회", description = "선택한 'system'에 해당하는 'symptom' 리스트를 조회합니다.")
@GetMapping("/symptoms")
public ResponseEntity<List<String>> getSymptoms(
@Parameter(description = "언어 코드 (ko 또는 en)", example = "en")
@RequestParam(defaultValue = "en") String languageCode,

@Parameter(description = "1차 시스템 이름", example = "Digestive")
@RequestParam String system
) {
return ResponseEntity.ok(diagnosisService.getSymptomsBySystem(system, languageCode));
}

@Operation(summary = "3차 조건 목록 조회", description = "'system'과 'symptom' 조합에 해당하는 'condition' 리스트를 조회합니다. 'three-step' 항목일 경우에만 존재합니다.")
@GetMapping("/conditions")
public ResponseEntity<List<String>> getConditions(
@Parameter(description = "언어 코드 (ko 또는 en)", example = "en")
@RequestParam(defaultValue = "en") String languageCode,

@Parameter(description = "1차 시스템 이름", example = "Digestive")
@RequestParam String system,

@Parameter(description = "2차 증상 이름", example = "Heartburn")
@RequestParam String symptom
) {
return ResponseEntity.ok(diagnosisService.getConditionsBySystemAndSymptom(system, symptom, languageCode));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,9 @@
import org.springframework.web.bind.annotation.RestController;

import com.onebridge.ouch.apiPayload.ApiResponse;
import com.onebridge.ouch.dto.selfDiagnosis.request.AddSymptomsToDiagnosisRequest;
import com.onebridge.ouch.dto.selfDiagnosis.request.DiagnosisCreateRequest;
import com.onebridge.ouch.dto.selfDiagnosis.request.DiagnosisUpdateRequest;
import com.onebridge.ouch.dto.selfDiagnosis.request.SelfDiagnosisRequest;
import com.onebridge.ouch.dto.selfDiagnosis.response.GetDiagnosisByUserIdResponse;
import com.onebridge.ouch.dto.selfDiagnosis.response.GetDiagnosisResponse;
import com.onebridge.ouch.dto.selfDiagnosis.response.GetSymptomsOfDiagnosisResponse;
import com.onebridge.ouch.security.authorization.UserId;
import com.onebridge.ouch.service.selfDiagnosis.SelfDiagnosisService;

Expand All @@ -39,7 +36,7 @@ public class SelfDiagnosisController {
@Operation(summary = "자가진단표 생성 API", description = "자가진단표 생성 API 입니다.")
@PostMapping
public ResponseEntity<ApiResponse<Void>> createDiagnosis( //request dto 에 userid 지우기
@RequestBody @Valid DiagnosisCreateRequest request,
@RequestBody @Valid SelfDiagnosisRequest request,
@UserId Long userId
) {
selfDiagnosisService.createDiagnosis(request, userId);
Expand Down Expand Up @@ -78,35 +75,35 @@ public ResponseEntity<ApiResponse<Void>> deleteDiagnosis(@PathVariable Long diag
}

//특정 자가진단표의 증상 목록 조회
@Operation(summary = "특정 자가진단표의 증상 목록 조회 API", description = "특정 자가진단표의 증상 목록 조회 API 입니다.")
@GetMapping("/{diagnosisId}/symptoms")
public ResponseEntity<ApiResponse<GetSymptomsOfDiagnosisResponse>> getSymptomsOfDiagnosis(
@PathVariable Long diagnosisId,
@UserId Long userId
) {
GetSymptomsOfDiagnosisResponse response = selfDiagnosisService.getSymptomsOfDiagnosis(diagnosisId, userId);
return ResponseEntity.ok(ApiResponse.success(response));
}
// @Operation(summary = "특정 자가진단표의 증상 목록 조회 API", description = "특정 자가진단표의 증상 목록 조회 API 입니다.")
// @GetMapping("/{diagnosisId}/symptoms")
// public ResponseEntity<ApiResponse<GetSymptomsOfDiagnosisResponse>> getSymptomsOfDiagnosis(
// @PathVariable Long diagnosisId,
// @UserId Long userId
// ) {
// GetSymptomsOfDiagnosisResponse response = selfDiagnosisService.getSymptomsOfDiagnosis(diagnosisId, userId);
// return ResponseEntity.ok(ApiResponse.success(response));
// }

//자가진단표 수정
@Operation(summary = "자가진단표 수정 API", description = "자가진단표 수정 API 입니다.")
@PutMapping("/{diagnosisId}")
public ResponseEntity<ApiResponse<Void>> updateDiagnosis(@PathVariable Long diagnosisId,
@RequestBody @Valid DiagnosisUpdateRequest request,
@RequestBody @Valid SelfDiagnosisRequest request,
@UserId Long userId
) {
selfDiagnosisService.updateDiagnosis(diagnosisId, userId, request);
return ResponseEntity.ok(ApiResponse.successWithNoData());
}

//자가진단표에 증상 추가
@Operation(summary = "특정 자가진단표에 증상 추가 API", description = "특정 자가진단표에 증상 추가 API 입니다.")
@PostMapping("/{diagnosisId}/symptoms")
public ResponseEntity<ApiResponse<Void>> addSymptomsToSelfDiagnosis(@PathVariable Long diagnosisId,
@RequestBody @Valid AddSymptomsToDiagnosisRequest request,
@UserId Long userId
) {
selfDiagnosisService.addSymptomsToSelfDiagnosis(diagnosisId, request, userId);
return ResponseEntity.ok(ApiResponse.successWithNoData());
}
// @Operation(summary = "특정 자가진단표에 증상 추가 API", description = "특정 자가진단표에 증상 추가 API 입니다.")
// @PostMapping("/{diagnosisId}/symptoms")
// public ResponseEntity<ApiResponse<Void>> addSymptomsToSelfDiagnosis(@PathVariable Long diagnosisId,
// @RequestBody @Valid AddSymptomsToDiagnosisRequest request,
// @UserId Long userId
// ) {
// selfDiagnosisService.addSymptomsToSelfDiagnosis(diagnosisId, request, userId);
// return ResponseEntity.ok(ApiResponse.successWithNoData());
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;

@Tag(name = "증상 API", description = "증상 API 입니다.")
@RestController
@RequestMapping("/symptoms")
// @Tag(name = "증상 API", description = "증상 API 입니다.")
// @RestController
// @RequestMapping("/symptoms")
@RequiredArgsConstructor
public class SymptomController {

private final SymptomService symptomService;

//증상 목록 조회
@Operation(summary = "증상 목록 조회 API", description = "증상 목록 조회 API 입니다.")
@GetMapping
public ResponseEntity<ApiResponse<List<GetSymptomResponse>>> getSymptomsList() {
List<GetSymptomResponse> list = symptomService.getSymptomsList();
return ResponseEntity.ok(ApiResponse.success(list));
}
// @Operation(summary = "증상 목록 조회 API", description = "증상 목록 조회 API 입니다.")
// @GetMapping
// public ResponseEntity<ApiResponse<List<GetSymptomResponse>>> getSymptomsList() {
// List<GetSymptomResponse> list = symptomService.getSymptomsList();
// return ResponseEntity.ok(ApiResponse.success(list));
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
import com.onebridge.ouch.domain.Symptom;
import com.onebridge.ouch.domain.User;
import com.onebridge.ouch.domain.mapping.DiagnosisSymptom;
import com.onebridge.ouch.dto.selfDiagnosis.request.DiagnosisCreateRequest;
import com.onebridge.ouch.dto.selfDiagnosis.request.DiagnosisUpdateRequest;
import com.onebridge.ouch.dto.selfDiagnosis.request.SelfDiagnosisRequest;
import com.onebridge.ouch.dto.selfDiagnosis.response.GetDiagnosisByUserIdResponse;
import com.onebridge.ouch.dto.selfDiagnosis.response.GetDiagnosisResponse;
import com.onebridge.ouch.dto.selfDiagnosis.response.GetSymptomsOfDiagnosisResponse;
Expand All @@ -19,58 +18,58 @@
public class SelfDiagnosisConverter {

public GetDiagnosisResponse diagnosisToGetDiagnosisResponse(SelfDiagnosis diagnosis) {
List<String> symptoms = symptomListForResponseDto(diagnosis);
return new GetDiagnosisResponse(diagnosis.getUser().getId(), diagnosis.getVisitType(), symptoms,
//List<String> symptoms = symptomListForResponseDto(diagnosis);
return new GetDiagnosisResponse(diagnosis.getUser().getId(), diagnosis.getVisitType(), diagnosis.getSymptom(),
diagnosis.getDuration(),
diagnosis.getPainSeverity(), diagnosis.getAdditionalNote(), diagnosis.getCreatedAt().toString());
}

public GetDiagnosisByUserIdResponse diagnosisToGetDiagnosisByUserIdResponse(SelfDiagnosis diagnosis) {
List<String> symptoms = symptomListForResponseDto(diagnosis);
return new GetDiagnosisByUserIdResponse(diagnosis.getId(), diagnosis.getVisitType(), symptoms,
//List<String> symptoms = symptomListForResponseDto(diagnosis);
return new GetDiagnosisByUserIdResponse(diagnosis.getId(), diagnosis.getVisitType(), diagnosis.getSymptom(),
diagnosis.getDuration(), diagnosis.getPainSeverity(), diagnosis.getAdditionalNote(),
diagnosis.getCreatedAt().toString());
}

public GetSymptomsOfDiagnosisResponse diagnosisToGetSymptomsOfDiagnosisResponse(SelfDiagnosis diagnosis) {
List<String> symptoms = symptomListForResponseDto(diagnosis);
return new GetSymptomsOfDiagnosisResponse(symptoms);
}
// public GetSymptomsOfDiagnosisResponse diagnosisToGetSymptomsOfDiagnosisResponse(SelfDiagnosis diagnosis) {
// List<String> symptoms = symptomListForResponseDto(diagnosis);
// return new GetSymptomsOfDiagnosisResponse(symptoms);
// }

public SelfDiagnosis diagnosisCreateRequestToSelfDiagnosis(DiagnosisCreateRequest request, User user) {
public SelfDiagnosis diagnosisCreateRequestToSelfDiagnosis(SelfDiagnosisRequest request, User user) {
return SelfDiagnosis.builder()
.user(user)
.visitType(request.getVisitType())
.diagnosisSymptomList(new ArrayList<>())
.symptom(request.getSymptom())
.duration(request.getDuration())
.painSeverity(request.getPainSeverity())
.additionalNote(request.getAdditionalNote())
.build();
}

public DiagnosisSymptom buildDiagnosisSymptom(SelfDiagnosis selfDiagnosis, Symptom foundSymptom) {
return DiagnosisSymptom.builder()
.selfDiagnosis(selfDiagnosis)
.symptom(foundSymptom)
.build();
}
// public DiagnosisSymptom buildDiagnosisSymptom(SelfDiagnosis selfDiagnosis, Symptom foundSymptom) {
// return DiagnosisSymptom.builder()
// .selfDiagnosis(selfDiagnosis)
// .symptom(foundSymptom)
// .build();
// }

public SelfDiagnosis diagnosisUpdateRequestToSelfDiagnosis(SelfDiagnosis diagnosis, User user,
DiagnosisUpdateRequest request) {
SelfDiagnosisRequest request) {
return diagnosis.toBuilder()
.visitType(request.getVisitType())
.diagnosisSymptomList(new ArrayList<>())
.symptom(request.getSymptom())
.duration(request.getDuration())
.painSeverity(request.getPainSeverity())
.additionalNote(request.getAdditionalNote())
.build();
}

public List<String> symptomListForResponseDto(SelfDiagnosis selfDiagnosis) {
List<String> symptoms = new ArrayList<>();
for (DiagnosisSymptom symptom : selfDiagnosis.getDiagnosisSymptomList()) {
symptoms.add(symptom.getSymptom().getName());
}
return symptoms;
}
//
// public List<String> symptomListForResponseDto(SelfDiagnosis selfDiagnosis) {
// List<String> symptoms = new ArrayList<>();
// for (DiagnosisSymptom symptom : selfDiagnosis.getDiagnosisSymptomList()) {
// symptoms.add(symptom.getSymptom().getName());
// }
// return symptoms;
// }
}
10 changes: 6 additions & 4 deletions src/main/java/com/onebridge/ouch/domain/SelfDiagnosis.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ public class SelfDiagnosis extends BaseEntity {
@JoinColumn(name = "user_id")
private User user;

@Column(columnDefinition = "TEXT")
private String contents;
// @Column(columnDefinition = "TEXT")
// private String contents;

// @OneToMany(mappedBy = "selfDiagnosis", cascade = CascadeType.ALL, orphanRemoval = true)
// private List<DiagnosisSymptom> diagnosisSymptomList = new ArrayList<>();

@OneToMany(mappedBy = "selfDiagnosis", cascade = CascadeType.ALL, orphanRemoval = true)
private List<DiagnosisSymptom> diagnosisSymptomList = new ArrayList<>();
private String symptom;

private VisitType visitType;

Expand Down
Loading