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
@@ -0,0 +1,21 @@
package com.onebridge.ouch.apiPayload.code.error;

import org.springframework.http.HttpStatus;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum MedicalRecordErrorCode implements ErrorCode {

MEDICAL_RECORD_NOT_FOUND(HttpStatus.NOT_FOUND, "MEDICAL-RECORD401", "의료기록이 존재하지 않습니다."),
HOSPITAL_NOT_FOUND(HttpStatus.NOT_FOUND, "MEDICAL-RECORD402", "입력한 병원이 존재하지 않습니다."),
DEPARTMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "MEDICAL-RECORD403", "입력한 진료 과가 존재하지 않습니다."),
MEDICAL_RECORD_USER_NOT_MATCH(HttpStatus.FORBIDDEN, "MEDICAL-RECORD404", "해당 사용자의 의료기록이 아닙니다."),
;

private final HttpStatus httpStatus;
private final String code;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.onebridge.ouch.controller.medicalRecord;

import java.util.List;

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;

import com.onebridge.ouch.apiPayload.ApiResponse;
import com.onebridge.ouch.dto.medicalRecord.request.MedicalRecordCreateRequest;
import com.onebridge.ouch.dto.medicalRecord.request.MedicalRecordUpdateRequest;
import com.onebridge.ouch.dto.medicalRecord.response.DateAndHospital;
import com.onebridge.ouch.dto.medicalRecord.response.GetMedicalRecordResponse;
import com.onebridge.ouch.security.authorization.UserId;
import com.onebridge.ouch.service.medicalRecord.MedicalRecordService;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@Tag(name = "의료기록 API", description = "의료기록 API 입니다.")
@RestController
@RequestMapping("/medical-record")
@RequiredArgsConstructor
public class MedicalRecordController {

private final MedicalRecordService medicalRecordService;

// 의료기록 생성
@Operation(summary = "의료기록 생성 API", description = "의료기록을 생성 API 입니다.")
@PostMapping
public ResponseEntity<ApiResponse<Void>> createMedicalRecord(
@RequestBody @Valid MedicalRecordCreateRequest request,
@UserId Long userId
) {
medicalRecordService.createMedicalRecord(request, userId);
return ResponseEntity.ok(ApiResponse.successWithNoData());
}

// 특정 의료기록 조회
@Operation(summary = "의료기록 조회 API", description = "의료기록을 조회 API 입니다.")
@GetMapping("/{medicalRecordId}")
public ResponseEntity<ApiResponse<GetMedicalRecordResponse>> getMedicalRecord(@PathVariable Long medicalRecordId,
@UserId Long userId
) {
GetMedicalRecordResponse response = medicalRecordService.getMedicalRecord(medicalRecordId, userId);
return ResponseEntity.ok(ApiResponse.success(response));
}

// 특정 사용자의 모든 의료기록 조회 (의료기록 메인 페이지용)
@Operation(summary = "특정 사용자의 모든 의료기록 조회 API", description = "특정 사용자의 모든 의료기록 조회 API 입니다.")
@GetMapping
public ResponseEntity<ApiResponse<List<DateAndHospital>>> getUsersAllMedicalRecord(
@UserId Long userId
) {
List<DateAndHospital> list = medicalRecordService.getUsersAllMedicalRecord(userId);
return ResponseEntity.ok(ApiResponse.success(list));
}

//특정 의료기록 삭제
@Operation(summary = "의료기록 삭제 API", description = "의료기록을 삭제 API 입니다.")
@DeleteMapping("/{medicalRecordId}")
public ResponseEntity<ApiResponse<Void>> deleteMedicalRecord(@PathVariable Long medicalRecordId,
@UserId Long userId
) {
medicalRecordService.deleteMedicalRecord(medicalRecordId, userId);
return ResponseEntity.ok(ApiResponse.successWithNoData());
}

//특정 의료기록 수정
@Operation(summary = "의료기록 수정 API", description = "의료기록을 수정 API 입니다.")
@PutMapping("/{medicalRecordId}")
public ResponseEntity<ApiResponse<Void>> updateMedicalRecord(
@RequestBody @Valid MedicalRecordUpdateRequest request,
@PathVariable Long medicalRecordId,
@UserId Long userId
) {
medicalRecordService.updateMedicalRecord(request, medicalRecordId, userId);
return ResponseEntity.ok(ApiResponse.successWithNoData());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.onebridge.ouch.converter;

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

import org.springframework.stereotype.Component;

import com.onebridge.ouch.domain.Summary;
import com.onebridge.ouch.domain.User;
import com.onebridge.ouch.domain.mapping.MedicalRecord;
import com.onebridge.ouch.dto.medicalRecord.request.MedicalRecordCreateRequest;
import com.onebridge.ouch.dto.medicalRecord.request.MedicalRecordUpdateRequest;
import com.onebridge.ouch.dto.medicalRecord.response.DateAndHospital;
import com.onebridge.ouch.dto.medicalRecord.response.GetMedicalRecordResponse;

import lombok.AllArgsConstructor;

@Component
@AllArgsConstructor
public class MedicalRecordConverter {

public GetMedicalRecordResponse medicalRecordToGetMedicalRecordResponse(MedicalRecord medicalRecord) {
return new GetMedicalRecordResponse(medicalRecord.getId(), medicalRecord.getVisitDate().toString(),
medicalRecord.getHospital(),
medicalRecord.getDepartment(), medicalRecord.getSymptoms(),
medicalRecord.getSummary().getContents_summary());
}

public List<DateAndHospital> medicalRecordToGetUsersAllMedicalRecordResponse(List<MedicalRecord> medicalRecords) {
List<DateAndHospital> list = new ArrayList<>();
for (MedicalRecord record : medicalRecords) {
list.add(new DateAndHospital(record.getId(), record.getUpdatedAt().toString(),
record.getHospital()));
}
return list;
}

public MedicalRecord medicalRecordCreateRequestToMedicalRecord(MedicalRecordCreateRequest request, User user,
Summary summary) {
return MedicalRecord.builder()
.user(user)
.visitDate(request.getVisitDate())
.hospital(request.getVisitingHospital())
.department(request.getMedicalSubject())
.symptoms(request.getSymptoms())
.summary(summary)
.build();
}

public MedicalRecord medicalRecordUpdateRequestToMedicalRecord(MedicalRecord medicalRecord,
MedicalRecordUpdateRequest request, Summary summary) {
return medicalRecord.toBuilder()
.visitDate(request.getVisitDate())
.hospital(request.getVisitingHospital())
.department(request.getMedicalSubject())
.symptoms(request.getSymptoms())
.summary(summary)
.build();
}
}
22 changes: 15 additions & 7 deletions src/main/java/com/onebridge/ouch/domain/Summary.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package com.onebridge.ouch.domain;

import com.onebridge.ouch.domain.common.BaseEntity;
import com.onebridge.ouch.domain.mapping.MedicalRecord;

import jakarta.persistence.*;
import lombok.*;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@Builder
@Builder(toBuilder = true)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Summary extends BaseEntity {
Expand All @@ -17,9 +24,10 @@ public class Summary extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "medical_record_id")
private MedicalRecord medicalRecord;
//MedicalRecord → Summary 단방향으로 바꾸기로 했습니다.
// @OneToOne(fetch = FetchType.LAZY)
// @JoinColumn(name = "medical_record_id")
// private MedicalRecord medicalRecord;

@Column(columnDefinition = "TEXT")
private String contents;
Expand Down
34 changes: 26 additions & 8 deletions src/main/java/com/onebridge/ouch/domain/mapping/MedicalRecord.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
package com.onebridge.ouch.domain.mapping;

import com.onebridge.ouch.domain.Hospital;
import java.time.LocalDate;

import com.onebridge.ouch.domain.Summary;
import com.onebridge.ouch.domain.User;
import com.onebridge.ouch.domain.common.BaseEntity;

import jakarta.persistence.*;
import lombok.*;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@Builder
@Builder(toBuilder = true)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class MedicalRecord extends BaseEntity {
Expand All @@ -23,10 +36,15 @@ public class MedicalRecord extends BaseEntity {
@JoinColumn(name = "user_id")
private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "hospital_id")
private Hospital hospital;
private LocalDate visitDate;

private String hospital;

private String department;

private String symptoms;

@OneToOne(mappedBy = "medicalRecord", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "summary_id")
private Summary summary;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.onebridge.ouch.dto.medicalRecord.request;

import java.time.LocalDate;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;

@Getter
public class MedicalRecordCreateRequest {

@NotNull(message = "Visit date is required.")
private LocalDate visitDate;

@NotBlank(message = "Visiting hospital is required.")
private String visitingHospital;

@NotBlank(message = "Medical subject is required.")
private String medicalSubject;

@NotBlank(message = "Symptoms are required.")
private String symptoms;

@NotBlank(message = "Treatment summary is required.")
private String treatmentSummary;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.onebridge.ouch.dto.medicalRecord.request;

import java.time.LocalDate;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;

@Getter
public class MedicalRecordUpdateRequest {

@NotNull(message = "Visit date is required.")
private LocalDate visitDate;

@NotBlank(message = "Visiting hospital is required.")
private String visitingHospital;

@NotBlank(message = "Medical subject is required.")
private String medicalSubject;

@NotBlank(message = "Symptoms are required.")
private String symptoms;

@NotBlank(message = "Treatment summary is required.")
private String treatmentSummary;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.onebridge.ouch.dto.medicalRecord.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class DateAndHospital {

private Long id;
private String date;
private String hospital;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.onebridge.ouch.dto.medicalRecord.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class GetMedicalRecordResponse {

private Long id;
private String visitDate;
private String visitingHospital;
private String medicalSubject;
private String symptoms;
private String treatmentSummary;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.onebridge.ouch.repository.medicalRecord;

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

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.onebridge.ouch.domain.mapping.MedicalRecord;

@Repository
public interface MedicalRecordRepository extends JpaRepository<MedicalRecord, Long> {
List<MedicalRecord> findAllByUserId(Long userId);

Optional<MedicalRecord> findByIdAndUserId(Long visitHistoryId, Long userId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.onebridge.ouch.repository.summary;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.onebridge.ouch.domain.Summary;

@Repository
public interface SummaryRepository extends JpaRepository<Summary, Long> {
}
Loading