Skip to content

Commit

Permalink
Merge pull request #13 from 2dongyeop/dongyeop
Browse files Browse the repository at this point in the history
feat: 의료진 조회 및 수정, 삭제 유스케이스 개발(#8)
  • Loading branch information
2dongyeop authored Jun 4, 2023
2 parents 499f4c7 + e61e920 commit 04edb2c
Show file tree
Hide file tree
Showing 28 changed files with 411 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package io.wisoft.avocadobackendhexagonal.domain.auth.application.port.in.command;

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

public record SignupStaffCommand(
String name,
String email,
String password,
String license_path,
String dept,
Long hospitalId
@NotBlank String name,
@NotBlank String email,
@NotBlank String password,
@NotBlank String license_path,
@NotBlank String dept,
@NotNull Long hospitalId
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
import io.wisoft.avocadobackendhexagonal.domain.hospital.domain.Hospital;
import io.wisoft.avocadobackendhexagonal.domain.member.application.port.out.SaveMemberPort;
import io.wisoft.avocadobackendhexagonal.domain.member.domain.Member;
import io.wisoft.avocadobackendhexagonal.domain.staff.application.port.out.LoadStaffPort;
import io.wisoft.avocadobackendhexagonal.domain.staff.domain.Staff;
import io.wisoft.avocadobackendhexagonal.global.enumeration.HospitalDept;
import io.wisoft.avocadobackendhexagonal.global.exception.duplicate.DuplicateStaffException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -19,6 +21,7 @@ public class SignUpService implements SignupUseCase {

private final SaveMemberPort saveMemberPort;
private final SaveStaffPort saveStaffPort;
private final LoadStaffPort loadStaffPort;
private final LoadHospitalPort loadHospitalPort;

@Override
Expand All @@ -39,18 +42,26 @@ public Long signupMember(final SignupMemberCommand request) {
@Override
public Long signupStaff(final SignupStaffCommand request) {

final Hospital hospital = loadHospitalPort.findById(request.hospitalId());
validateDuplicateStaffEmail(request.email());

final Hospital hospital = loadHospitalPort.findById(request.hospitalId());
final Staff staff = Staff.createStaff(
null,
request.name(),
request.email(),
request.password(),
request.license_path(),
null,
HospitalDept.valueOf(request.dept()),
hospital
);

return saveStaffPort.save(staff);
}

private void validateDuplicateStaffEmail(final String email) {
if (loadStaffPort.existsByEmail(email)) {
throw new DuplicateStaffException("이메일이 중복된 의료진이 존재합니다.");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.wisoft.avocadobackendhexagonal.domain.hospital.adapter.out.persistence;

import io.wisoft.avocadobackendhexagonal.domain.hospital.adapter.out.persistence.HospitalEntity;
import io.wisoft.avocadobackendhexagonal.domain.hospital.domain.Hospital;
import org.springframework.stereotype.Component;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface HospitalRepository extends JpaRepository<HospitalEntity, Long> {

boolean existsByName(final String name);
Optional<HospitalEntity> findByName(final String name);
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ public Hospital findById(final Long hospitalId) {
return HospitalMapper.hospitalEntityToHospital(hospitalEntity);
}

@Override
public Hospital findByName(final String hospitalName) {
final HospitalEntity hospitalEntity = hospitalRepository.findByName(hospitalName)
.orElseThrow(NotFoundHospitalException::new);

return HospitalMapper.hospitalEntityToHospital(hospitalEntity);
}

@Override
public List<Hospital> findAll() {
return hospitalRepository.findAll().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
public interface LoadHospitalPort {

Hospital findById(final Long hospitalId);
Hospital findByName(final String hospitalName);

List<Hospital> findAll();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package io.wisoft.avocadobackendhexagonal.domain.hospital.domain;

import io.wisoft.avocadobackendhexagonal.domain.staff.domain.Staff;
import io.wisoft.avocadobackendhexagonal.global.basetime.BaseTimeDomain;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

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

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Hospital extends BaseTimeDomain {
Expand All @@ -13,7 +17,7 @@ public class Hospital extends BaseTimeDomain {
private String number;
private String address;
private String operatingTime;

private final List<Staff> staffList = new ArrayList<>();

public static Hospital registerHospital(
final Long id,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.adapter.in.web;

import io.wisoft.avocadobackendhexagonal.domain.staff.application.port.in.DeleteStaffUseCase;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class DeleteStaffController {

private final DeleteStaffUseCase deleteStaffUseCase;

@DeleteMapping("api/staff/{id}")
public ResponseEntity<Void> deleteStaff(@PathVariable("id") final Long id) {
deleteStaffUseCase.delete(id);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.adapter.in.web;

import io.wisoft.avocadobackendhexagonal.domain.staff.adapter.in.web.dto.StaffDto;
import io.wisoft.avocadobackendhexagonal.domain.staff.application.port.in.LoadStaffUseCase;
import io.wisoft.avocadobackendhexagonal.domain.staff.domain.Staff;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
@RequiredArgsConstructor
public class LoadStaffController {

private final LoadStaffUseCase loadStaffUseCase;

@GetMapping("api/staff/{id}/details")
public ResponseEntity<StaffDto> staff(@PathVariable("id") final Long id) {

return ResponseEntity.ok(getStaffDto(loadStaffUseCase.loadStaff(id)));
}

@GetMapping("/api/staff")
public ResponseEntity<List<StaffDto>> staffs() {
return ResponseEntity.ok(
loadStaffUseCase.loadStaffList().stream()
.map(staff -> getStaffDto(staff))
.toList()
);
}

private StaffDto getStaffDto(final Staff staff) {
final StaffDto staffDto = new StaffDto(
staff.getId(),
staff.getName(),
staff.getEmail(),
staff.getLicense_path(),
staff.getDept().name(),
staff.getHospital().getName()
);
return staffDto;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.adapter.in.web;

import io.wisoft.avocadobackendhexagonal.domain.staff.adapter.in.web.dto.UpdateStaffPasswordRequest;
import io.wisoft.avocadobackendhexagonal.domain.staff.application.port.in.UpdateStaffUseCase;
import io.wisoft.avocadobackendhexagonal.domain.staff.application.port.in.command.UpdateStaffPasswordCommand;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
public class UpdateStaffController {

private final UpdateStaffUseCase updateStaffUseCase;

@PatchMapping("/api/staff/{id}/password")
public ResponseEntity<Void> updateStaffPassword(
@PathVariable("id") final Long id,
@RequestBody @Valid final UpdateStaffPasswordRequest request) {

final UpdateStaffPasswordCommand command = getUpdateStaffPasswordCommand(request);
updateStaffUseCase.updatePassword(id, command);

return ResponseEntity.ok().build();
}

@PatchMapping("/api/staff/{id}")
public ResponseEntity<Void> updateStaff(
@PathVariable("id") final Long id,
@RequestParam(value = "hospitalName", required = false) final String hospitalName,
@RequestParam(value = "photoPath", required = false) final String photoPath) {

updateStaffUseCase.updateStaff(id, hospitalName, photoPath);
return ResponseEntity.ok().build();
}

private UpdateStaffPasswordCommand getUpdateStaffPasswordCommand(final UpdateStaffPasswordRequest request) {
final UpdateStaffPasswordCommand command = new UpdateStaffPasswordCommand(
request.oldPassword(),
request.newPassword()
);
return command;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.adapter.in.web.dto;


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

public record StaffDto(
@NotNull Long id,
@NotBlank String name,
@NotBlank String email,
@NotBlank String license_path,
@NotBlank String dept,
@NotBlank String hospital
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.adapter.in.web.dto;

import jakarta.validation.constraints.NotBlank;

public record UpdateStaffPasswordRequest(
@NotBlank String oldPassword,
@NotBlank String newPassword
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public static StaffEntity createStaff(
final String email,
final String password,
final String license_path,
final String staffPhotoPath,
final HospitalDept dept,
final HospitalEntity hospital
) {
Expand All @@ -71,6 +72,7 @@ public static StaffEntity createStaff(
staffEntity.email = email;
staffEntity.password = password;
staffEntity.license_path = license_path;
staffEntity.staffPhotoPath = staffPhotoPath;
staffEntity.dept = dept;
staffEntity.setHospital(hospital);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public static StaffEntity staffToStaffEntity(final Staff staff) {
staff.getEmail(),
staff.getPassword(),
staff.getLicense_path(),
staff.getStaffPhotoPath() == null ? null : staff.getStaffPhotoPath(),
staff.getDept(),
HospitalMapper.hospitalToHospitalEntity(staff.getHospital())
);
Expand All @@ -29,6 +30,7 @@ public static Staff staffEntityToStaff(final StaffEntity staffEntity) {
staffEntity.getEmail(),
staffEntity.getPassword(),
staffEntity.getLicense_path(),
staffEntity.getStaffPhotoPath(),
staffEntity.getDept(),
HospitalMapper.hospitalEntityToHospital(staffEntity.getHospital())
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
import org.springframework.data.jpa.repository.JpaRepository;

public interface StaffRepository extends JpaRepository<StaffEntity, Long> {
boolean existsByEmail(final String email);
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,56 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.adapter.out.persistence.adapter;

import io.wisoft.avocadobackendhexagonal.domain.auth.application.port.out.SaveStaffPort;
import io.wisoft.avocadobackendhexagonal.domain.staff.adapter.out.persistence.StaffEntity;
import io.wisoft.avocadobackendhexagonal.domain.staff.adapter.out.persistence.StaffMapper;
import io.wisoft.avocadobackendhexagonal.domain.staff.adapter.out.persistence.StaffRepository;
import io.wisoft.avocadobackendhexagonal.domain.staff.application.port.out.DeleteStaffPort;
import io.wisoft.avocadobackendhexagonal.domain.staff.application.port.out.LoadStaffPort;
import io.wisoft.avocadobackendhexagonal.domain.staff.domain.Staff;
import io.wisoft.avocadobackendhexagonal.global.exception.notfound.NotFoundStaffException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@RequiredArgsConstructor
public class StaffPersistenceAdapter implements SaveStaffPort {
public class StaffPersistenceAdapter implements SaveStaffPort, LoadStaffPort, DeleteStaffPort {

private final StaffRepository staffRepository;

@Override
public Long save(final Staff staff) {
return staffRepository.save(StaffMapper.staffToStaffEntity(staff)).getId();
}

@Override
public Staff findById(final Long staffId) {
final StaffEntity staffEntity = staffRepository.findById(staffId).orElseThrow(NotFoundStaffException::new);
return StaffMapper.staffEntityToStaff(staffEntity);
}

@Override
public StaffEntity findStaffEntityById(final Long staffId) {
return staffRepository.findById(staffId)
.orElseThrow(NotFoundStaffException::new);
}

@Override
public List<Staff> findAll() {
return staffRepository.findAll().stream()
.map(staffEntity
-> StaffMapper.staffEntityToStaff(staffEntity))
.toList();
}

@Override
public boolean existsByEmail(final String email) {
return staffRepository.existsByEmail(email);
}

@Override
public void delete(final StaffEntity staffEntity) {
staffRepository.delete(staffEntity);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.application.port.in;

public interface DeleteStaffUseCase {

void delete(final Long staffId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.wisoft.avocadobackendhexagonal.domain.staff.application.port.in;

import io.wisoft.avocadobackendhexagonal.domain.staff.domain.Staff;

import java.util.List;

public interface LoadStaffUseCase {

Staff loadStaff(final Long staffId);
List<Staff> loadStaffList();
}
Loading

0 comments on commit 04edb2c

Please sign in to comment.