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
4 changes: 0 additions & 4 deletions .env.template

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ public CaseDTO toDTO(CaseEntity entity) {
entity.getStatus(),
entity.getTitle(),
entity.getDescription(),
entity.getCreatedAt()
entity.getCreatedAt(),
entity.getPatient() != null ? entity.getPatient().getId() : null
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

import org.example.projektarendehantering.infrastructure.persistence.CaseEntity;
import org.example.projektarendehantering.infrastructure.persistence.CaseRepository;
import org.example.projektarendehantering.infrastructure.persistence.PatientEntity;
import org.example.projektarendehantering.infrastructure.persistence.PatientRepository;
import org.example.projektarendehantering.presentation.dto.CaseDTO;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;

import java.time.Instant;
import java.util.List;
Expand All @@ -17,15 +21,23 @@ public class CaseService {

private final CaseRepository caseRepository;
private final CaseMapper caseMapper;
private final PatientRepository patientRepository;

public CaseService(CaseRepository caseRepository, CaseMapper caseMapper) {
public CaseService(CaseRepository caseRepository, CaseMapper caseMapper, PatientRepository patientRepository) {
this.caseRepository = caseRepository;
this.caseMapper = caseMapper;
this.patientRepository = patientRepository;
}

@Transactional
public CaseDTO createCase(CaseDTO caseDTO) {
if (caseDTO.getPatientId() == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "patientId is required");
}
CaseEntity entity = caseMapper.toEntity(caseDTO);
PatientEntity patient = patientRepository.findById(caseDTO.getPatientId())
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Patient not found"));
entity.setPatient(patient);
if (entity.getStatus() == null) {
entity.setStatus("OPEN");
}
Expand All @@ -47,4 +59,11 @@ public List<CaseDTO> getAllCases() {
.map(caseMapper::toDTO)
.collect(Collectors.toList());
}

@Transactional(readOnly = true)
public List<CaseDTO> getCasesForPatient(UUID patientId) {
return caseRepository.findAllByPatient_Id(patientId).stream()
.map(caseMapper::toDTO)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.example.projektarendehantering.application.service;

import org.example.projektarendehantering.infrastructure.persistence.PatientEntity;
import org.example.projektarendehantering.presentation.dto.PatientCreateDTO;
import org.example.projektarendehantering.presentation.dto.PatientDTO;
import org.springframework.stereotype.Component;

@Component
public class PatientMapper {

public PatientDTO toDTO(PatientEntity entity) {
if (entity == null) return null;
return new PatientDTO(
entity.getId(),
entity.getFirstName(),
entity.getLastName(),
entity.getCreatedAt()
);
}

public PatientEntity toEntity(PatientCreateDTO dto) {
if (dto == null) return null;
PatientEntity entity = new PatientEntity();
entity.setFirstName(dto.getFirstName());
entity.setLastName(dto.getLastName());
entity.setPersonalIdentityNumber(dto.getPersonalIdentityNumber());
return entity;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.example.projektarendehantering.application.service;

import org.example.projektarendehantering.infrastructure.persistence.PatientEntity;
import org.example.projektarendehantering.infrastructure.persistence.PatientRepository;
import org.example.projektarendehantering.presentation.dto.PatientCreateDTO;
import org.example.projektarendehantering.presentation.dto.PatientDTO;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;

import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
public class PatientService {

private final PatientRepository patientRepository;
private final PatientMapper patientMapper;

public PatientService(PatientRepository patientRepository, PatientMapper patientMapper) {
this.patientRepository = patientRepository;
this.patientMapper = patientMapper;
}

@Transactional
public PatientDTO createPatient(PatientCreateDTO patientDTO) {
PatientEntity entity = patientMapper.toEntity(patientDTO);
entity.setId(UUID.randomUUID());
entity.setCreatedAt(Instant.now());
if (entity.getPersonalIdentityNumber() != null && !entity.getPersonalIdentityNumber().isBlank()) {
patientRepository.findByPersonalIdentityNumber(entity.getPersonalIdentityNumber())
.ifPresent(existing -> {
throw new ResponseStatusException(HttpStatus.CONFLICT, "Patient with personalIdentityNumber already exists");
});
}
return patientMapper.toDTO(patientRepository.save(entity));
}

@Transactional(readOnly = true)
public Optional<PatientDTO> getPatient(UUID id) {
return patientRepository.findById(id).map(patientMapper::toDTO);
}

@Transactional(readOnly = true)
public List<PatientDTO> getAllPatients() {
return patientRepository.findAll().stream()
.map(patientMapper::toDTO)
.collect(Collectors.toList());
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@
import java.util.UUID;

public record Actor(UUID userId, Role role) {


}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.example.projektarendehantering.infrastructure.persistence;

import jakarta.persistence.*;

import java.time.Instant;
import java.util.UUID;

Expand All @@ -18,15 +17,20 @@ public class CaseEntity {
private String description;
private Instant createdAt;

@ManyToOne(optional = false)
@JoinColumn(name = "patient_id", nullable = false)
private PatientEntity patient;

public CaseEntity() {}

public CaseEntity(UUID id, String status, UUID ownerId, String title, String description, Instant createdAt) {
public CaseEntity(UUID id, String status, UUID ownerId, String title, String description, Instant createdAt, PatientEntity patient) {
this.id = id;
this.status = status;
this.ownerId = ownerId;
this.title = title;
this.description = description;
this.createdAt = createdAt;
this.patient = patient;
}

public UUID getId() { return id; }
Expand All @@ -46,4 +50,7 @@ public CaseEntity(UUID id, String status, UUID ownerId, String title, String des

public Instant getCreatedAt() { return createdAt; }
public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; }

public PatientEntity getPatient() { return patient; }
public void setPatient(PatientEntity patient) { this.patient = patient; }
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package org.example.projektarendehantering.infrastructure.persistence;

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

import java.util.List;
import java.util.UUID;

public interface CaseRepository extends JpaRepository<CaseEntity, UUID> {
List<CaseEntity> findAllByPatient_Id(UUID patientId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.example.projektarendehantering.infrastructure.persistence;

import jakarta.persistence.*;

import java.time.Instant;
import java.util.UUID;

@Entity
@Table(name = "patients")
public class PatientEntity {

@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;

private String firstName;
private String lastName;

@Column(unique = true)
private String personalIdentityNumber;

private Instant createdAt;

public PatientEntity() {}

public PatientEntity(UUID id, String firstName, String lastName, String personalIdentityNumber, Instant createdAt) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.personalIdentityNumber = personalIdentityNumber;
this.createdAt = createdAt;
}

public UUID getId() { return id; }
public void setId(UUID id) { this.id = id; }

public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }

public String getPersonalIdentityNumber() { return personalIdentityNumber; }
public void setPersonalIdentityNumber(String personalIdentityNumber) { this.personalIdentityNumber = personalIdentityNumber; }

public Instant getCreatedAt() { return createdAt; }
public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; }
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.example.projektarendehantering.infrastructure.persistence;

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

import java.util.Optional;
import java.util.UUID;

public interface PatientRepository extends JpaRepository<PatientEntity, UUID> {
Optional<PatientEntity> findByPersonalIdentityNumber(String personalIdentityNumber);
}

Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.example.projektarendehantering.presentation.dto;

import jakarta.validation.constraints.NotNull;

import java.time.Instant;
import java.util.UUID;

Expand All @@ -11,14 +13,18 @@ public class CaseDTO {
private String description;
private Instant createdAt;

@NotNull
private UUID patientId;

public CaseDTO() {}

public CaseDTO(UUID id, String status, String title, String description, Instant createdAt) {
public CaseDTO(UUID id, String status, String title, String description, Instant createdAt, UUID patientId) {
this.id = id;
this.status = status;
this.title = title;
this.description = description;
this.createdAt = createdAt;
this.patientId = patientId;
}

public UUID getId() { return id; }
Expand All @@ -35,4 +41,7 @@ public CaseDTO(UUID id, String status, String title, String description, Instant

public Instant getCreatedAt() { return createdAt; }
public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; }

public UUID getPatientId() { return patientId; }
public void setPatientId(UUID patientId) { this.patientId = patientId; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.example.projektarendehantering.presentation.dto;

import jakarta.validation.constraints.NotBlank;

public class PatientCreateDTO {

@NotBlank
private String firstName;

@NotBlank
private String lastName;

private String personalIdentityNumber;

public PatientCreateDTO() {}

public PatientCreateDTO(String firstName, String lastName, String personalIdentityNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.personalIdentityNumber = personalIdentityNumber;
}

public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }

public String getPersonalIdentityNumber() { return personalIdentityNumber; }
public void setPersonalIdentityNumber(String personalIdentityNumber) { this.personalIdentityNumber = personalIdentityNumber; }
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.example.projektarendehantering.presentation.dto;

import jakarta.validation.constraints.NotBlank;

import java.time.Instant;
import java.util.UUID;

public class PatientDTO {

private UUID id;

@NotBlank
private String firstName;

@NotBlank
private String lastName;

private Instant createdAt;

public PatientDTO() {}

public PatientDTO(UUID id, String firstName, String lastName, Instant createdAt) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.createdAt = createdAt;
}

public UUID getId() { return id; }
public void setId(UUID id) { this.id = id; }

public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }

public Instant getCreatedAt() { return createdAt; }
public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; }
}

Loading