diff --git a/src/main/java/org/example/projektarendehantering/application/service/CaseService.java b/src/main/java/org/example/projektarendehantering/application/service/CaseService.java index 503e045..37f428b 100644 --- a/src/main/java/org/example/projektarendehantering/application/service/CaseService.java +++ b/src/main/java/org/example/projektarendehantering/application/service/CaseService.java @@ -1,9 +1,15 @@ package org.example.projektarendehantering.application.service; +import org.example.projektarendehantering.common.Actor; +import org.example.projektarendehantering.common.NotAuthorizedException; +import org.example.projektarendehantering.common.Role; import org.example.projektarendehantering.infrastructure.persistence.CaseEntity; import org.example.projektarendehantering.infrastructure.persistence.CaseRepository; +import org.example.projektarendehantering.infrastructure.persistence.EmployeeEntity; +import org.example.projektarendehantering.infrastructure.persistence.EmployeeRepository; import org.example.projektarendehantering.infrastructure.persistence.PatientEntity; import org.example.projektarendehantering.infrastructure.persistence.PatientRepository; +import org.example.projektarendehantering.presentation.dto.CaseAssignmentDTO; import org.example.projektarendehantering.presentation.dto.CaseDTO; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -13,6 +19,7 @@ import java.time.Instant; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -22,15 +29,25 @@ public class CaseService { private final CaseRepository caseRepository; private final CaseMapper caseMapper; private final PatientRepository patientRepository; + private final EmployeeRepository employeeRepository; - public CaseService(CaseRepository caseRepository, CaseMapper caseMapper, PatientRepository patientRepository) { + public CaseService( + CaseRepository caseRepository, + CaseMapper caseMapper, + PatientRepository patientRepository, + EmployeeRepository employeeRepository + ) { this.caseRepository = caseRepository; this.caseMapper = caseMapper; this.patientRepository = patientRepository; + this.employeeRepository = employeeRepository; } @Transactional - public CaseDTO createCase(CaseDTO caseDTO) { + public CaseDTO createCase(Actor actor, CaseDTO caseDTO) { + if (!canCreate(actor)) { + throw new NotAuthorizedException("Not allowed to create cases"); + } if (caseDTO.getPatientId() == null) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "patientId is required"); } @@ -38,6 +55,9 @@ public CaseDTO createCase(CaseDTO caseDTO) { PatientEntity patient = patientRepository.findById(caseDTO.getPatientId()) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Patient not found")); entity.setPatient(patient); + if (isDoctor(actor) || isManager(actor)) { + entity.setOwnerId(actor.userId()); + } if (entity.getStatus() == null) { entity.setStatus("OPEN"); } @@ -49,21 +69,130 @@ public CaseDTO createCase(CaseDTO caseDTO) { } @Transactional(readOnly = true) - public Optional getCase(UUID id) { - return caseRepository.findById(id).map(caseMapper::toDTO); + public Optional getCase(Actor actor, UUID id) { + return caseRepository.findById(id) + .map(entity -> { + requireCanRead(actor, entity); + return caseMapper.toDTO(entity); + }); } @Transactional(readOnly = true) - public List getAllCases() { - return caseRepository.findAll().stream() - .map(caseMapper::toDTO) - .collect(Collectors.toList()); + public List getAllCases(Actor actor) { + if (isManager(actor)) { + return caseRepository.findAll().stream() + .map(caseMapper::toDTO) + .collect(Collectors.toList()); + } + if (isDoctor(actor)) { + return caseRepository.findAllByOwnerId(actor.userId()).stream() + .map(caseMapper::toDTO) + .collect(Collectors.toList()); + } + if (isNurse(actor)) { + return caseRepository.findAllByHandlerId(actor.userId()).stream() + .map(caseMapper::toDTO) + .collect(Collectors.toList()); + } + if (isPatient(actor)) { + return caseRepository.findAllByPatient_Id(actor.userId()).stream() + .map(caseMapper::toDTO) + .collect(Collectors.toList()); + } + if (isOther(actor)) { + return caseRepository.findAllByOtherId(actor.userId()).stream() + .map(caseMapper::toDTO) + .collect(Collectors.toList()); + } + throw new NotAuthorizedException("Not allowed to list cases"); } @Transactional(readOnly = true) - public List getCasesForPatient(UUID patientId) { + public List getCasesForPatient(Actor actor, UUID patientId) { return caseRepository.findAllByPatient_Id(patientId).stream() + .peek(entity -> requireCanRead(actor, entity)) .map(caseMapper::toDTO) .collect(Collectors.toList()); } + + @Transactional + public CaseDTO assignUsers(Actor actor, UUID caseId, CaseAssignmentDTO dto) { + if (!isManager(actor) && !isDoctor(actor)) { + throw new NotAuthorizedException("Not allowed to assign users to case"); + } + CaseEntity entity = caseRepository.findById(caseId) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Case not found")); + if (isDoctor(actor)) { + if (entity.getOwnerId() == null || !entity.getOwnerId().equals(actor.userId())) { + throw new NotAuthorizedException("Not allowed to modify assignments for this case"); + } + if (dto.getOwnerId() != null) { + throw new NotAuthorizedException("Not allowed to change owner for this case"); + } + } + + if (isManager(actor) && dto.getOwnerId() != null) { + UUID ownerId = requireEmployeeWithRole(dto.getOwnerId(), Set.of(Role.DOCTOR, Role.CASE_OWNER), "ownerId"); + entity.setOwnerId(ownerId); + } + if (dto.getHandlerId() != null) { + UUID handlerId = requireEmployeeWithRole(dto.getHandlerId(), Set.of(Role.NURSE, Role.HANDLER), "handlerId"); + entity.setHandlerId(handlerId); + } + if (dto.getOtherId() != null) { + UUID otherId = requireEmployeeWithRole(dto.getOtherId(), Set.of(Role.OTHER), "otherId"); + entity.setOtherId(otherId); + } + return caseMapper.toDTO(caseRepository.save(entity)); + } + + private UUID requireEmployeeWithRole(UUID id, Set allowedRoles, String fieldName) { + EmployeeEntity employee = employeeRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.BAD_REQUEST, + fieldName + " refers to a non-existent employee: " + id + )); + if (employee.getRole() == null || !allowedRoles.contains(employee.getRole())) { + throw new ResponseStatusException( + HttpStatus.BAD_REQUEST, + fieldName + " must refer to an employee with role " + allowedRoles + " (was " + employee.getRole() + "): " + id + ); + } + return id; + } + + private void requireCanRead(Actor actor, CaseEntity entity) { + if (isManager(actor)) return; + if (isDoctor(actor) && actor.userId().equals(entity.getOwnerId())) return; + if (isNurse(actor) && actor.userId().equals(entity.getHandlerId())) return; + if (isPatient(actor) + && entity.getPatient() != null + && actor.userId().equals(entity.getPatient().getId())) return; + if (isOther(actor) && actor.userId().equals(entity.getOtherId())) return; + throw new NotAuthorizedException("Not allowed to read this case"); + } + + private boolean canCreate(Actor actor) { + return isManager(actor) || isDoctor(actor); + } + + private boolean isManager(Actor actor) { + return actor.role() == Role.MANAGER || actor.role() == Role.ADMIN; + } + + private boolean isDoctor(Actor actor) { + return actor.role() == Role.DOCTOR || actor.role() == Role.CASE_OWNER; + } + + private boolean isNurse(Actor actor) { + return actor.role() == Role.NURSE || actor.role() == Role.HANDLER; + } + + private boolean isPatient(Actor actor) { + return actor.role() == Role.PATIENT; + } + + private boolean isOther(Actor actor) { + return actor.role() == Role.OTHER; + } } diff --git a/src/main/java/org/example/projektarendehantering/application/service/EmployeeMapper.java b/src/main/java/org/example/projektarendehantering/application/service/EmployeeMapper.java new file mode 100644 index 0000000..5e43087 --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/application/service/EmployeeMapper.java @@ -0,0 +1,29 @@ +package org.example.projektarendehantering.application.service; + +import org.example.projektarendehantering.infrastructure.persistence.EmployeeEntity; +import org.example.projektarendehantering.presentation.dto.EmployeeCreateDTO; +import org.example.projektarendehantering.presentation.dto.EmployeeDTO; +import org.springframework.stereotype.Component; + +@Component +public class EmployeeMapper { + + public EmployeeDTO toDTO(EmployeeEntity entity) { + if (entity == null) return null; + return new EmployeeDTO( + entity.getId(), + entity.getDisplayName(), + entity.getRole(), + entity.getCreatedAt() + ); + } + + public EmployeeEntity toEntity(EmployeeCreateDTO dto) { + if (dto == null) return null; + EmployeeEntity entity = new EmployeeEntity(); + entity.setDisplayName(dto.getDisplayName()); + entity.setRole(dto.getRole()); + return entity; + } +} + diff --git a/src/main/java/org/example/projektarendehantering/application/service/EmployeeService.java b/src/main/java/org/example/projektarendehantering/application/service/EmployeeService.java new file mode 100644 index 0000000..c47e1ab --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/application/service/EmployeeService.java @@ -0,0 +1,63 @@ +package org.example.projektarendehantering.application.service; + +import org.example.projektarendehantering.common.Actor; +import org.example.projektarendehantering.common.NotAuthorizedException; +import org.example.projektarendehantering.common.Role; +import org.example.projektarendehantering.infrastructure.persistence.EmployeeEntity; +import org.example.projektarendehantering.infrastructure.persistence.EmployeeRepository; +import org.example.projektarendehantering.presentation.dto.EmployeeCreateDTO; +import org.example.projektarendehantering.presentation.dto.EmployeeDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +@Service +public class EmployeeService { + + private final EmployeeRepository employeeRepository; + private final EmployeeMapper employeeMapper; + + public EmployeeService(EmployeeRepository employeeRepository, EmployeeMapper employeeMapper) { + this.employeeRepository = employeeRepository; + this.employeeMapper = employeeMapper; + } + + @Transactional + public EmployeeDTO createEmployee(Actor actor, EmployeeCreateDTO dto) { + requireCanManageEmployees(actor); + EmployeeEntity entity = employeeMapper.toEntity(dto); + entity.setId(UUID.randomUUID()); + entity.setCreatedAt(Instant.now()); + return employeeMapper.toDTO(employeeRepository.save(entity)); + } + + @Transactional(readOnly = true) + public Optional getEmployee(Actor actor, UUID id) { + requireCanManageEmployees(actor); + return employeeRepository.findById(id).map(employeeMapper::toDTO); + } + + @Transactional(readOnly = true) + public List getAllEmployees(Actor actor) { + requireCanManageEmployees(actor); + return employeeRepository.findAll().stream() + .map(employeeMapper::toDTO) + .collect(Collectors.toList()); + } + + private void requireCanManageEmployees(Actor actor) { + if (actor == null) { + throw new NotAuthorizedException("Missing actor"); + } + if (actor.role() == Role.MANAGER || actor.role() == Role.ADMIN) { + return; + } + throw new NotAuthorizedException("Not allowed to access employees"); + } +} + diff --git a/src/main/java/org/example/projektarendehantering/common/Role.java b/src/main/java/org/example/projektarendehantering/common/Role.java index 1ef641b..16fa202 100644 --- a/src/main/java/org/example/projektarendehantering/common/Role.java +++ b/src/main/java/org/example/projektarendehantering/common/Role.java @@ -6,6 +6,17 @@ * Note: enum constant names are intended to be stable because infrastructure may parse them from headers. */ public enum Role { + /** + * New naming (preferred). + */ + MANAGER, + DOCTOR, + NURSE, + PATIENT, + + /** + * Legacy naming (kept for backward compatibility with header parsing). + */ CASE_OWNER, HANDLER, ADMIN, diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseEntity.java b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseEntity.java index 7561731..d90cab0 100644 --- a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseEntity.java +++ b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseEntity.java @@ -16,6 +16,8 @@ public class CaseEntity { private String title; private String description; private Instant createdAt; + private UUID handlerId; + private UUID otherId; @ManyToOne(optional = true) @JoinColumn(name = "patient_id", nullable = true) // Optional because the patient can be null @@ -42,6 +44,12 @@ public CaseEntity(UUID id, String status, UUID ownerId, String title, String des public UUID getOwnerId() { return ownerId; } public void setOwnerId(UUID ownerId) { this.ownerId = ownerId; } + public UUID getHandlerId() { return handlerId; } + public void setHandlerId(UUID handlerId) { this.handlerId = handlerId; } + + public UUID getOtherId() { return otherId; } + public void setOtherId(UUID otherId) { this.otherId = otherId; } + public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseRepository.java b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseRepository.java index 7d40d5d..a6ba1a0 100644 --- a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseRepository.java +++ b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/CaseRepository.java @@ -7,4 +7,7 @@ public interface CaseRepository extends JpaRepository { List findAllByPatient_Id(UUID patientId); + List findAllByOwnerId(UUID ownerId); + List findAllByHandlerId(UUID handlerId); + List findAllByOtherId(UUID otherId); } diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/EmployeeEntity.java b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/EmployeeEntity.java new file mode 100644 index 0000000..2c87e48 --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/EmployeeEntity.java @@ -0,0 +1,48 @@ +package org.example.projektarendehantering.infrastructure.persistence; + +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import org.example.projektarendehantering.common.Role; + +import java.time.Instant; +import java.util.UUID; + +@Entity +@Table(name = "employees") +public class EmployeeEntity { + + @Id + private UUID id; + + private String displayName; + + @Enumerated(EnumType.STRING) + private Role role; + + private Instant createdAt; + + public EmployeeEntity() {} + + public EmployeeEntity(UUID id, String displayName, Role role, Instant createdAt) { + this.id = id; + this.displayName = displayName; + this.role = role; + this.createdAt = createdAt; + } + + public UUID getId() { return id; } + public void setId(UUID id) { this.id = id; } + + public String getDisplayName() { return displayName; } + public void setDisplayName(String displayName) { this.displayName = displayName; } + + public Role getRole() { return role; } + public void setRole(Role role) { this.role = role; } + + public Instant getCreatedAt() { return createdAt; } + public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; } +} + diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/EmployeeRepository.java b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/EmployeeRepository.java new file mode 100644 index 0000000..3e23e9d --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/EmployeeRepository.java @@ -0,0 +1,9 @@ +package org.example.projektarendehantering.infrastructure.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface EmployeeRepository extends JpaRepository { +} + diff --git a/src/main/java/org/example/projektarendehantering/presentation/dto/CaseAssignmentDTO.java b/src/main/java/org/example/projektarendehantering/presentation/dto/CaseAssignmentDTO.java new file mode 100644 index 0000000..cbc472e --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/presentation/dto/CaseAssignmentDTO.java @@ -0,0 +1,28 @@ +package org.example.projektarendehantering.presentation.dto; + +import java.util.UUID; + +public class CaseAssignmentDTO { + + private UUID ownerId; + private UUID handlerId; + private UUID otherId; + + public CaseAssignmentDTO() {} + + public CaseAssignmentDTO(UUID ownerId, UUID handlerId, UUID otherId) { + this.ownerId = ownerId; + this.handlerId = handlerId; + this.otherId = otherId; + } + + public UUID getOwnerId() { return ownerId; } + public void setOwnerId(UUID ownerId) { this.ownerId = ownerId; } + + public UUID getHandlerId() { return handlerId; } + public void setHandlerId(UUID handlerId) { this.handlerId = handlerId; } + + public UUID getOtherId() { return otherId; } + public void setOtherId(UUID otherId) { this.otherId = otherId; } +} + diff --git a/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseForm.java b/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseForm.java index 2ed88e2..c51af1d 100644 --- a/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseForm.java +++ b/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseForm.java @@ -1,8 +1,11 @@ package org.example.projektarendehantering.presentation.dto; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; +import java.util.UUID; + public class CreateCaseForm { @NotBlank(message = "Title is required") @@ -13,6 +16,9 @@ public class CreateCaseForm { @Size(max = 4000, message = "Description must be under 4000 characters") private String description; + @NotNull(message = "Patient is required") + private UUID patientId; + public CreateCaseForm() {} public String getTitle() { return title; } @@ -20,4 +26,7 @@ public CreateCaseForm() {} public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } + + public UUID getPatientId() { return patientId; } + public void setPatientId(UUID patientId) { this.patientId = patientId; } } diff --git a/src/main/java/org/example/projektarendehantering/presentation/dto/EmployeeCreateDTO.java b/src/main/java/org/example/projektarendehantering/presentation/dto/EmployeeCreateDTO.java new file mode 100644 index 0000000..1b542f4 --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/presentation/dto/EmployeeCreateDTO.java @@ -0,0 +1,28 @@ +package org.example.projektarendehantering.presentation.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import org.example.projektarendehantering.common.Role; + +public class EmployeeCreateDTO { + + @NotBlank + private String displayName; + + @NotNull + private Role role; + + public EmployeeCreateDTO() {} + + public EmployeeCreateDTO(String displayName, Role role) { + this.displayName = displayName; + this.role = role; + } + + public String getDisplayName() { return displayName; } + public void setDisplayName(String displayName) { this.displayName = displayName; } + + public Role getRole() { return role; } + public void setRole(Role role) { this.role = role; } +} + diff --git a/src/main/java/org/example/projektarendehantering/presentation/dto/EmployeeDTO.java b/src/main/java/org/example/projektarendehantering/presentation/dto/EmployeeDTO.java new file mode 100644 index 0000000..fcecf7f --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/presentation/dto/EmployeeDTO.java @@ -0,0 +1,36 @@ +package org.example.projektarendehantering.presentation.dto; + +import org.example.projektarendehantering.common.Role; + +import java.time.Instant; +import java.util.UUID; + +public class EmployeeDTO { + + private UUID id; + private String displayName; + private Role role; + private Instant createdAt; + + public EmployeeDTO() {} + + public EmployeeDTO(UUID id, String displayName, Role role, Instant createdAt) { + this.id = id; + this.displayName = displayName; + this.role = role; + this.createdAt = createdAt; + } + + public UUID getId() { return id; } + public void setId(UUID id) { this.id = id; } + + public String getDisplayName() { return displayName; } + public void setDisplayName(String displayName) { this.displayName = displayName; } + + public Role getRole() { return role; } + public void setRole(Role role) { this.role = role; } + + public Instant getCreatedAt() { return createdAt; } + public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; } +} + diff --git a/src/main/java/org/example/projektarendehantering/presentation/rest/CaseController.java b/src/main/java/org/example/projektarendehantering/presentation/rest/CaseController.java index 9ffa43e..0b18fe0 100644 --- a/src/main/java/org/example/projektarendehantering/presentation/rest/CaseController.java +++ b/src/main/java/org/example/projektarendehantering/presentation/rest/CaseController.java @@ -2,6 +2,8 @@ import jakarta.validation.Valid; import org.example.projektarendehantering.application.service.CaseService; +import org.example.projektarendehantering.infrastructure.security.HeaderCurrentUserAdapter; +import org.example.projektarendehantering.presentation.dto.CaseAssignmentDTO; import org.example.projektarendehantering.presentation.dto.CaseDTO; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -14,26 +16,33 @@ public class CaseController { private final CaseService caseService; + private final HeaderCurrentUserAdapter currentUserAdapter; - public CaseController(CaseService caseService) { + public CaseController(CaseService caseService, HeaderCurrentUserAdapter currentUserAdapter) { this.caseService = caseService; + this.currentUserAdapter = currentUserAdapter; } @PostMapping public ResponseEntity createCase(@RequestBody @Valid CaseDTO caseDTO) { - CaseDTO created = caseService.createCase(caseDTO); + CaseDTO created = caseService.createCase(currentUserAdapter.currentUser(), caseDTO); return ResponseEntity.ok(created); } @GetMapping("/{id}") public ResponseEntity getCase(@PathVariable UUID id) { - return caseService.getCase(id) + return caseService.getCase(currentUserAdapter.currentUser(), id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @GetMapping public ResponseEntity> getAllCases() { - return ResponseEntity.ok(caseService.getAllCases()); + return ResponseEntity.ok(caseService.getAllCases(currentUserAdapter.currentUser())); + } + + @PutMapping("/{id}/assignments") + public ResponseEntity assignUsers(@PathVariable UUID id, @RequestBody CaseAssignmentDTO dto) { + return ResponseEntity.ok(caseService.assignUsers(currentUserAdapter.currentUser(), id, dto)); } } diff --git a/src/main/java/org/example/projektarendehantering/presentation/rest/EmployeeController.java b/src/main/java/org/example/projektarendehantering/presentation/rest/EmployeeController.java new file mode 100644 index 0000000..c7fd0eb --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/presentation/rest/EmployeeController.java @@ -0,0 +1,43 @@ +package org.example.projektarendehantering.presentation.rest; + +import jakarta.validation.Valid; +import org.example.projektarendehantering.application.service.EmployeeService; +import org.example.projektarendehantering.infrastructure.security.HeaderCurrentUserAdapter; +import org.example.projektarendehantering.presentation.dto.EmployeeCreateDTO; +import org.example.projektarendehantering.presentation.dto.EmployeeDTO; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/api/employees") +public class EmployeeController { + + private final EmployeeService employeeService; + private final HeaderCurrentUserAdapter currentUserAdapter; + + public EmployeeController(EmployeeService employeeService, HeaderCurrentUserAdapter currentUserAdapter) { + this.employeeService = employeeService; + this.currentUserAdapter = currentUserAdapter; + } + + @PostMapping + public ResponseEntity createEmployee(@RequestBody @Valid EmployeeCreateDTO dto) { + return ResponseEntity.ok(employeeService.createEmployee(currentUserAdapter.currentUser(), dto)); + } + + @GetMapping("/{id}") + public ResponseEntity getEmployee(@PathVariable UUID id) { + return employeeService.getEmployee(currentUserAdapter.currentUser(), id) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @GetMapping + public ResponseEntity> getAllEmployees() { + return ResponseEntity.ok(employeeService.getAllEmployees(currentUserAdapter.currentUser())); + } +} + diff --git a/src/main/java/org/example/projektarendehantering/presentation/rest/PatientController.java b/src/main/java/org/example/projektarendehantering/presentation/rest/PatientController.java index a0b2430..568b611 100644 --- a/src/main/java/org/example/projektarendehantering/presentation/rest/PatientController.java +++ b/src/main/java/org/example/projektarendehantering/presentation/rest/PatientController.java @@ -3,6 +3,7 @@ import jakarta.validation.Valid; import org.example.projektarendehantering.application.service.CaseService; import org.example.projektarendehantering.application.service.PatientService; +import org.example.projektarendehantering.infrastructure.security.HeaderCurrentUserAdapter; import org.example.projektarendehantering.presentation.dto.PatientCreateDTO; import org.example.projektarendehantering.presentation.dto.CaseDTO; import org.example.projektarendehantering.presentation.dto.PatientDTO; @@ -18,10 +19,12 @@ public class PatientController { private final PatientService patientService; private final CaseService caseService; + private final HeaderCurrentUserAdapter currentUserAdapter; - public PatientController(PatientService patientService, CaseService caseService) { + public PatientController(PatientService patientService, CaseService caseService, HeaderCurrentUserAdapter currentUserAdapter) { this.patientService = patientService; this.caseService = caseService; + this.currentUserAdapter = currentUserAdapter; } @PostMapping @@ -43,7 +46,7 @@ public ResponseEntity> getAllPatients() { @GetMapping("/{id}/cases") public ResponseEntity> getCasesForPatient(@PathVariable UUID id) { - return ResponseEntity.ok(caseService.getCasesForPatient(id)); + return ResponseEntity.ok(caseService.getCasesForPatient(currentUserAdapter.currentUser(), id)); } } diff --git a/src/main/java/org/example/projektarendehantering/presentation/web/UiController.java b/src/main/java/org/example/projektarendehantering/presentation/web/UiController.java index 6ef3f47..2a65746 100644 --- a/src/main/java/org/example/projektarendehantering/presentation/web/UiController.java +++ b/src/main/java/org/example/projektarendehantering/presentation/web/UiController.java @@ -1,6 +1,8 @@ package org.example.projektarendehantering.presentation.web; import org.example.projektarendehantering.application.service.CaseService; +import org.example.projektarendehantering.application.service.PatientService; +import org.example.projektarendehantering.infrastructure.security.HeaderCurrentUserAdapter; import org.example.projektarendehantering.presentation.dto.CaseDTO; import org.example.projektarendehantering.presentation.dto.CreateCaseForm; import org.springframework.stereotype.Controller; @@ -18,9 +20,13 @@ public class UiController { private final CaseService caseService; + private final PatientService patientService; + private final HeaderCurrentUserAdapter currentUserAdapter; - public UiController(CaseService caseService) { + public UiController(CaseService caseService, PatientService patientService, HeaderCurrentUserAdapter currentUserAdapter) { this.caseService = caseService; + this.patientService = patientService; + this.currentUserAdapter = currentUserAdapter; } @GetMapping("/") @@ -30,13 +36,14 @@ public String index() { @GetMapping("/ui/cases") public String listCases(Model model) { - model.addAttribute("cases", caseService.getAllCases()); + model.addAttribute("cases", caseService.getAllCases(currentUserAdapter.currentUser())); return "cases/list"; } @GetMapping("/ui/cases/new") public String newCase(Model model) { model.addAttribute("createCaseForm", new CreateCaseForm()); + model.addAttribute("patients", patientService.getAllPatients()); return "cases/new"; } @@ -49,14 +56,15 @@ public String createCase(@Valid @ModelAttribute("createCaseForm") CreateCaseForm CaseDTO caseDTO = new CaseDTO(); caseDTO.setTitle(form.getTitle()); caseDTO.setDescription(form.getDescription()); + caseDTO.setPatientId(form.getPatientId()); - caseService.createCase(caseDTO); + caseService.createCase(currentUserAdapter.currentUser(), caseDTO); return "redirect:/ui/cases"; } @GetMapping("/ui/cases/{caseId}") public String caseDetail(@PathVariable UUID caseId, Model model) { - caseService.getCase(caseId).ifPresent(c -> model.addAttribute("case", c)); + caseService.getCase(currentUserAdapter.currentUser(), caseId).ifPresent(c -> model.addAttribute("case", c)); return "cases/detail"; } }