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 @@ -18,6 +18,9 @@ public interface EmployeeInfoRepository extends JpaRepository<EmployeeInfo, UUID
@EntityGraph(attributePaths = {"account", "department"})
Optional<EmployeeInfo> findById(UUID id);

@EntityGraph(attributePaths = {"account", "department"})
Optional<EmployeeInfo> findByAccount_Id(UUID id);

@Override
@EntityGraph(attributePaths = {"account", "department"})
Page<EmployeeInfo> findAll(Specification<EmployeeInfo> spec, Pageable pageable);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import com.hospital.hms.base.api.ApiResponse;
import com.hospital.hms.base.response.PaginatedResponse;
import com.hospital.hms.medical.request.MedicalRecordIdRequest;
import com.hospital.hms.medical.request.SearchMedicalRecordRequest;
import com.hospital.hms.medical.response.MedicalRecordDetailResponse;
import com.hospital.hms.medical.response.MedicalRecordResponse;
import com.hospital.hms.medical.service.GetMedicalRecordDetailService;
import com.hospital.hms.medical.service.GetMedicalRecordService;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -12,10 +15,9 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

@RestController
@RequestMapping("/medical-records")
Expand All @@ -25,6 +27,7 @@
public class MedicalRecordController {

private final GetMedicalRecordService getMedicalRecordService;
private final GetMedicalRecordDetailService getMedicalRecordDetailService;

@GetMapping
@PreAuthorize("hasAnyRole('ADMIN', 'RECEPTIONIST', 'DOCTOR')")
Expand All @@ -36,4 +39,17 @@ public ResponseEntity<ApiResponse<PaginatedResponse<MedicalRecordResponse>>> get
ApiResponse.success(data, "Get medical records successfully", HttpStatus.OK.value())
);
}

@GetMapping("/{id}")
@PreAuthorize("hasAnyRole('ADMIN', 'RECEPTIONIST', 'DOCTOR')")
public ResponseEntity<ApiResponse<MedicalRecordDetailResponse>> getMedicalRecordDetails(
@PathVariable UUID id
) {
MedicalRecordIdRequest request = new MedicalRecordIdRequest(id);

MedicalRecordDetailResponse data = getMedicalRecordDetailService.execute(request);
return ResponseEntity.status(HttpStatus.OK).body(
ApiResponse.success(data, "Get medical record detail successfully", HttpStatus.OK.value())
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.hospital.hms.medical.request;

import com.hospital.hms.base.request.BaseRequest;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.SuperBuilder;

import java.util.UUID;

@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class MedicalRecordIdRequest extends BaseRequest {
@NotNull(message = "Id are required ")
private UUID id;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.hospital.hms.medical.response;

import com.hospital.hms.common.enums.Gender;
import com.hospital.hms.employee.entity.EmployeeInfo;
import com.hospital.hms.medical.entity.MedicalRecord;
import com.hospital.hms.patient.entity.PatientInfo;

import java.time.LocalDate;

public record MedicalRecordDetailResponse(
PatientInfoResponse patient,
DoctorSummary doctor,
String description,
String doctorAdvice

) {
public record PatientInfoResponse(
String fullName,
Gender gender,
LocalDate dob,
String address,
String phone,
String email,
String bloodType,
String allergies
) {
public static PatientInfoResponse from(PatientInfo patientInfo) {
return new PatientInfoResponse(
patientInfo.getAccount().getFullName(),
patientInfo.getAccount().getGender(),
patientInfo.getAccount().getDob(),
patientInfo.getAccount().getAddress(),
patientInfo.getAccount().getPhone(),
patientInfo.getAccount().getEmail(),
patientInfo.getBloodType(),
patientInfo.getAllergies()
);
}
}

public record DoctorSummary(
String fullName,
String departmentName,
String code
) {
public static DoctorSummary from(EmployeeInfo employeeInfo) {
return new DoctorSummary(
employeeInfo.getAccount().getFullName(),
employeeInfo.getDepartment().getName(),
employeeInfo.getCode()
);
}
}

public static MedicalRecordDetailResponse from(MedicalRecord medicalRecord, EmployeeInfo employeeInfo) {
return new MedicalRecordDetailResponse(
PatientInfoResponse.from(medicalRecord.getPatient()),
DoctorSummary.from(employeeInfo),
medicalRecord.getDescription(),
medicalRecord.getDoctorAdvice()
);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.hospital.hms.medical.service;

import com.hospital.hms.base.service.BaseService;
import com.hospital.hms.employee.entity.EmployeeInfo;
import com.hospital.hms.employee.repository.EmployeeInfoRepository;
import com.hospital.hms.exception.NotFoundException;
import com.hospital.hms.medical.entity.MedicalRecord;
import com.hospital.hms.medical.repository.MedicalRecordRepository;
import com.hospital.hms.medical.request.MedicalRecordIdRequest;
import com.hospital.hms.medical.response.MedicalRecordDetailResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class GetMedicalRecordDetailService extends BaseService<MedicalRecordIdRequest, MedicalRecordDetailResponse> {

private final MedicalRecordRepository medicalRecordRepository;
private final EmployeeInfoRepository employeeInfoRepository;

@Override
@Transactional(readOnly = true)
public MedicalRecordDetailResponse execute(MedicalRecordIdRequest request) {
return super.execute(request);
}

@Override
protected MedicalRecordDetailResponse doProcess(MedicalRecordIdRequest request) {
MedicalRecord md = medicalRecordRepository.findById(request.getId()).orElseThrow(
() -> new NotFoundException("Medical record with id: " + request.getId() + " not found")
);

EmployeeInfo ei = employeeInfoRepository.findByAccount_Id(md.getDoctor().getId()).orElseThrow(
() -> new NotFoundException("Employee info with id: " + md.getDoctor().getId() + " not found")
);

if (
request.getUserContext().hasRole("DOCTOR")
&& !request.getUserContext().getUserId().equals(md.getDoctor().getId())
) {
throw new AccessDeniedException("You are not allow to view this medical record");
}


return MedicalRecordDetailResponse.from(md, ei);
}
}
4 changes: 4 additions & 0 deletions hms-api/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ spring:
application:
name: Hospital Management System API

docker:
compose:
enabled: false

# ------ MySQL (JPA/Hibernate) ------
datasource:
url: jdbc:mysql://localhost:3306/hms_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
Expand Down
Loading