From 3b54855f1b1a3ede4cd77f9a4ef080cafc27022c Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Mon, 23 Dec 2024 18:19:06 +0900 Subject: [PATCH 01/15] =?UTF-8?q?feat(ExecutiveJpaEntity):=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/out/ExecutiveJpaEntity.java | 51 +++++++++++++++++++ .../executive/domain/Executive.java | 23 +++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/ExecutiveJpaEntity.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/ExecutiveJpaEntity.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/ExecutiveJpaEntity.java new file mode 100644 index 000000000..c0d3ff124 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/ExecutiveJpaEntity.java @@ -0,0 +1,51 @@ +package page.clab.api.domain.memberManagement.executive.adapter.out; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Size; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.SQLRestriction; +import page.clab.api.global.common.domain.BaseEntity; + +@Entity +@Table(name = "executive") +@Getter +@Setter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@SQLDelete(sql = "UPDATE executive SET is_deleted = true WHERE id = ?") +@SQLRestriction("is_deleted = false") +public class ExecutiveJpaEntity extends BaseEntity { + + @Id + @Column(nullable = false, updatable = false, unique = true) + @Size(min = 9, max = 9, message = "{size.member.id}") + private String id; + + @Column(nullable = false) + @Size(min = 1, max = 10, message = "{size.member.name}") + private String name; + + @Column(nullable = false) + @Email(message = "{email.member.email}") + @Size(min = 1, message = "{size.member.email}") + private String email; + + @Column(nullable = false) + private String field; + + @Column(nullable = false) + private String position; + + private String imageUrl; +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java new file mode 100644 index 000000000..6dca2b49f --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java @@ -0,0 +1,23 @@ +package page.clab.api.domain.memberManagement.executive.domain; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class Executive { + + private String id; + private String name; + private String email; + private String field; + private String position; + private String imageUrl; +} From b9ec0ff69da4f3fc867d40dc8187f7991a2a00cc Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Fri, 27 Dec 2024 13:05:05 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat(ExecutiveRegisterService):=20?= =?UTF-8?q?=EC=9A=B4=EC=98=81=EC=A7=84=20=EB=93=B1=EB=A1=9D=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/ExecutiveRegisterController.java | 32 +++++++++++++++++ .../{ => persistence}/ExecutiveJpaEntity.java | 15 ++++---- .../out/persistence/ExecutiveMapper.java | 12 +++++++ .../ExecutivePersistenceAdapter.java | 21 +++++++++++ .../out/persistence/ExecutiveRepository.java | 8 +++++ .../dto/mapper/ExecutiveDtoMapper.java | 21 +++++++++++ .../dto/request/ExecutiveRequestDto.java | 34 ++++++++++++++++++ .../ExecutiveRegistrationException.java | 8 +++++ .../port/in/RegisterExecutiveUseCase.java | 7 ++++ .../port/out/RegisterExecutivePort.java | 7 ++++ .../service/ExecutiveRegisterService.java | 36 +++++++++++++++++++ .../executive/domain/Executive.java | 1 + .../handler/GlobalExceptionHandler.java | 4 ++- src/main/resources/messages.properties | 9 +++++ 14 files changed, 208 insertions(+), 7 deletions(-) create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java rename src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/{ => persistence}/ExecutiveJpaEntity.java (76%) create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveMapper.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveRepository.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/exception/ExecutiveRegistrationException.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RegisterExecutiveUseCase.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RegisterExecutivePort.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java new file mode 100644 index 000000000..43e87291a --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java @@ -0,0 +1,32 @@ +package page.clab.api.domain.memberManagement.executive.adapter.in.web; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveRequestDto; +import page.clab.api.domain.memberManagement.executive.application.port.in.RegisterExecutiveUseCase; +import page.clab.api.global.common.dto.ApiResponse; + +@RestController +@RequestMapping("/api/v1/executive") +@RequiredArgsConstructor +@Tag(name = "Member Management - Executive", description = "운영진") +public class ExecutiveRegisterController { + + private final RegisterExecutiveUseCase registerExecutiveUseCase; + + @Operation(summary = "[A] 운영진 등록", description = "ROLE_ADMIN 이상의 권한이 필요함") + @PreAuthorize("hasRole('ADMIN')") + @PostMapping("") + public ApiResponse registerExecutive( + @RequestBody ExecutiveRequestDto requestDto + ) { + String id = registerExecutiveUseCase.registerExecutive(requestDto); + return ApiResponse.success(id); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/ExecutiveJpaEntity.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java similarity index 76% rename from src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/ExecutiveJpaEntity.java rename to src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java index c0d3ff124..405b810a0 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/ExecutiveJpaEntity.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java @@ -1,4 +1,4 @@ -package page.clab.api.domain.memberManagement.executive.adapter.out; +package page.clab.api.domain.memberManagement.executive.adapter.out.persistence; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -28,17 +28,17 @@ public class ExecutiveJpaEntity extends BaseEntity { @Id - @Column(nullable = false, updatable = false, unique = true) - @Size(min = 9, max = 9, message = "{size.member.id}") + @Column(nullable = false, unique = true) + @Size(min = 9, max = 9, message = "{size.executive.id}") private String id; @Column(nullable = false) - @Size(min = 1, max = 10, message = "{size.member.name}") + @Size(min = 1, max = 10, message = "{size.executive.name}") private String name; @Column(nullable = false) - @Email(message = "{email.member.email}") - @Size(min = 1, message = "{size.member.email}") + @Email(message = "{email.executive.email}") + @Size(min = 1, message = "{size.executive.email}") private String email; @Column(nullable = false) @@ -48,4 +48,7 @@ public class ExecutiveJpaEntity extends BaseEntity { private String position; private String imageUrl; + + @Column(name = "is_deleted", nullable = false) + private Boolean isDeleted; } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveMapper.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveMapper.java new file mode 100644 index 000000000..732fe5d96 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveMapper.java @@ -0,0 +1,12 @@ +package page.clab.api.domain.memberManagement.executive.adapter.out.persistence; + +import org.mapstruct.Mapper; +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +@Mapper(componentModel = "spring") +public interface ExecutiveMapper { + + ExecutiveJpaEntity toEntity(Executive executive); + + Executive toDomain(ExecutiveJpaEntity jpaEntity); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java new file mode 100644 index 000000000..05cca4367 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java @@ -0,0 +1,21 @@ +package page.clab.api.domain.memberManagement.executive.adapter.out.persistence; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import page.clab.api.domain.memberManagement.executive.application.port.out.RegisterExecutivePort; +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +@Component +@RequiredArgsConstructor +public class ExecutivePersistenceAdapter implements RegisterExecutivePort { + + private final ExecutiveMapper executiveMapper; + private final ExecutiveRepository executiveRepository; + + @Override + public Executive save(Executive executive) { + ExecutiveJpaEntity jpaEntity = executiveMapper.toEntity(executive); + ExecutiveJpaEntity savedEntity = executiveRepository.save(jpaEntity); + return executiveMapper.toDomain(savedEntity); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveRepository.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveRepository.java new file mode 100644 index 000000000..67233a3bd --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveRepository.java @@ -0,0 +1,8 @@ +package page.clab.api.domain.memberManagement.executive.adapter.out.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ExecutiveRepository extends JpaRepository { +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java new file mode 100644 index 000000000..89b00955e --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java @@ -0,0 +1,21 @@ +package page.clab.api.domain.memberManagement.executive.application.dto.mapper; + +import org.springframework.stereotype.Component; +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveRequestDto; +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +@Component +public class ExecutiveDtoMapper { + + public Executive fromDto(ExecutiveRequestDto requestDto) { + return Executive.builder() + .id(requestDto.getId()) + .name(requestDto.getName()) + .email(requestDto.getEmail()) + .field(requestDto.getField()) + .position(requestDto.getPosition()) + .imageUrl(requestDto.getImageUrl()) + .isDeleted(false) + .build(); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java new file mode 100644 index 000000000..dfd3b0fd0 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java @@ -0,0 +1,34 @@ +package page.clab.api.domain.memberManagement.executive.application.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ExecutiveRequestDto { + + @NotNull(message = "{notNull.executive.id}") + @Schema(description = "학번", example = "202310000") + private String id; + + @NotNull(message = "{notNull.executive.name}") + @Schema(description = "이름", example = "홍길동") + private String name; + + @NotNull(message = "{notNull.executive.email}") + @Schema(description = "이메일", example = "clab.coreteam@gamil.com") + private String email; + + @NotNull(message = "{notNull.executive.field}") + @Schema(description = "분야", example = "Back-End") + private String field; + + @NotNull(message = "{notNull.executive.position}") + @Schema(description = "직급", example = "회장") + private String position; + + @Schema(description = "프로필 이미지", example = "https://www.clab.page/assets/dongmin-860f3a1e.jpeg") + private String imageUrl; +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/exception/ExecutiveRegistrationException.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/exception/ExecutiveRegistrationException.java new file mode 100644 index 000000000..03224e226 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/exception/ExecutiveRegistrationException.java @@ -0,0 +1,8 @@ +package page.clab.api.domain.memberManagement.executive.application.exception; + +public class ExecutiveRegistrationException extends RuntimeException { + + public ExecutiveRegistrationException(String message) { + super(message); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RegisterExecutiveUseCase.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RegisterExecutiveUseCase.java new file mode 100644 index 000000000..57833a9f4 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RegisterExecutiveUseCase.java @@ -0,0 +1,7 @@ +package page.clab.api.domain.memberManagement.executive.application.port.in; + +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveRequestDto; + +public interface RegisterExecutiveUseCase { + String registerExecutive(ExecutiveRequestDto requestDto); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RegisterExecutivePort.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RegisterExecutivePort.java new file mode 100644 index 000000000..a1cab5d14 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RegisterExecutivePort.java @@ -0,0 +1,7 @@ +package page.clab.api.domain.memberManagement.executive.application.port.out; + +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +public interface RegisterExecutivePort { + Executive save(Executive executive); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java new file mode 100644 index 000000000..dac893612 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java @@ -0,0 +1,36 @@ +package page.clab.api.domain.memberManagement.executive.application.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import page.clab.api.domain.memberManagement.executive.application.dto.mapper.ExecutiveDtoMapper; +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveRequestDto; +import page.clab.api.domain.memberManagement.executive.application.exception.ExecutiveRegistrationException; +import page.clab.api.domain.memberManagement.executive.application.port.in.RegisterExecutiveUseCase; +import page.clab.api.domain.memberManagement.executive.application.port.out.RegisterExecutivePort; +import page.clab.api.domain.memberManagement.executive.domain.Executive; +import page.clab.api.external.memberManagement.member.application.port.ExternalRetrieveMemberUseCase; + +@Service +@RequiredArgsConstructor +public class ExecutiveRegisterService implements RegisterExecutiveUseCase { + + private final RegisterExecutivePort registerExecutivePort; + private final ExecutiveDtoMapper mapper; + private final ExternalRetrieveMemberUseCase externalRetrieveMemberUseCase; + + @Transactional + @Override + public String registerExecutive(ExecutiveRequestDto requestDto) { + Executive executive = mapper.fromDto(requestDto); + Executive savedExecutive = registerExecutivePort.save(executive); + checkExistMember(requestDto); + return savedExecutive.getId(); + } + + private void checkExistMember(ExecutiveRequestDto requestDto) { + if (!externalRetrieveMemberUseCase.existsById(requestDto.getId())) { + throw new ExecutiveRegistrationException("등록하려는 운영진이 멤버가 아닙니다."); + } + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java index 6dca2b49f..33c4d7303 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java @@ -20,4 +20,5 @@ public class Executive { private String field; private String position; private String imageUrl; + private Boolean isDeleted; } diff --git a/src/main/java/page/clab/api/global/handler/GlobalExceptionHandler.java b/src/main/java/page/clab/api/global/handler/GlobalExceptionHandler.java index ac269d054..2fb2dab10 100644 --- a/src/main/java/page/clab/api/global/handler/GlobalExceptionHandler.java +++ b/src/main/java/page/clab/api/global/handler/GlobalExceptionHandler.java @@ -62,6 +62,7 @@ import page.clab.api.domain.library.bookLoanRecord.application.exception.LoanSuspensionException; import page.clab.api.domain.library.bookLoanRecord.application.exception.MaxBorrowLimitExceededException; import page.clab.api.domain.library.bookLoanRecord.application.exception.OverdueException; +import page.clab.api.domain.memberManagement.executive.application.exception.ExecutiveRegistrationException; import page.clab.api.domain.memberManagement.member.application.exception.DuplicateMemberContactException; import page.clab.api.domain.memberManagement.member.application.exception.DuplicateMemberEmailException; import page.clab.api.domain.memberManagement.member.application.exception.DuplicateMemberIdException; @@ -125,7 +126,8 @@ public class GlobalExceptionHandler { SortingArgumentException.class, UnknownPathException.class, AssignmentBoardHasNoDueDateTimeException.class, - FeedbackBoardHasNoContentException.class + FeedbackBoardHasNoContentException.class, + ExecutiveRegistrationException.class }) public ErrorResponse badRequestException(HttpServletResponse response, Exception e) { response.setStatus(HttpServletResponse.SC_OK); diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 6e7db6fb5..e91ff3261 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -54,10 +54,14 @@ size.verification.memberId=학번은 {min}자 이상 {max}자 이하로 입력 size.verification.verification=인증 코드는 {min}자 이상 {max}자 이하로 입력하세요. size.workExperience.companyName=회사명은 최소 {min}글자 이상이어야 합니다. size.workExperience.position=직책은 최소 {min}글자 이상이어야 합니다. +size.executive.id=학번은 최소 {min}자 이상 {max}자 이하로 입력하세요. +size.executive.name=이름은 최소 {min}자 이상 {max}자 이하로 입력하세요. +size.executive.email=이메일을 {min}자 이상 입력하세요. range.activityGroup.progress=진행도는 0에서 100 사이의 값이어야 합니다. pattern.application.studentId=학번은 숫자로만 입력하세요. email.application.email=올바른 이메일 형식으로 입력하세요. email.member.email=올바른 이메일 형식으로 입력하세요. +email.executive.email=올바른 이메일 형식으로 입력하세요. min.application.grade=학년은 {value}학년 이상이어야 합니다. min.donation.amount=금액은 {value}원 이상이어야 합니다. min.member.grade=최소값은 {value} 이상이어야 합니다. @@ -189,4 +193,9 @@ notNull.workExperience.companyName=회사명은 필수 입력 항목입니다. notNull.workExperience.position=직책은 필수 입력 항목입니다. notNull.workExperience.startDate=시작일은 필수 입력 항목입니다. notNull.workExperience.endDate=종료일은 필수 입력 항목입니다. +notNull.executive.id=학번은 필수 입력 항목입니다. +notNull.executive.name=이름은 필수 입력 항목입니다. +notNull.executive.email=이메일은 필수 입력 항목입니다. +notNull.executive.field=분야는 필수 입력 항목입니다. +notNull.executive.position=직급은 필수 입력 항목입니다. invalid.activityGroupBoard.dueDateTime=마감일자는 현재 시간 이후로 설정되어야 합니다. \ No newline at end of file From b0e862ae4ba7db701f0b215356c6cc64dd4cdaca Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Fri, 27 Dec 2024 15:02:46 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat(File):=20=EC=9A=B4=EC=98=81=EC=A7=84?= =?UTF-8?q?=20=EC=82=AC=EC=A7=84=20=EC=97=85=EB=A1=9C=EB=93=9C=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/global/common/file/api/FileController.java | 12 ++++++++++++ .../global/common/file/application/FileService.java | 9 +++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/page/clab/api/global/common/file/api/FileController.java b/src/main/java/page/clab/api/global/common/file/api/FileController.java index 5b75eb894..c0f84593e 100644 --- a/src/main/java/page/clab/api/global/common/file/api/FileController.java +++ b/src/main/java/page/clab/api/global/common/file/api/FileController.java @@ -55,6 +55,18 @@ public ApiResponse profileUpload( return ApiResponse.success(responseDto); } + @Operation(summary = "[A] 운영진 사진 업로드", description = "ROLE_ADMIN 이상의 권한이 필요함") + @PreAuthorize("hasRole('ADMIN')") + @PostMapping(value = "/executives", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ApiResponse executiveUpload( + @RequestParam(name = "multipartFile") MultipartFile multipartFile, + @RequestParam(name = "storagePeriod") long storagePeriod + ) throws IOException, PermissionDeniedException { + String path = fileService.buildPath("executives"); + UploadedFileResponseDto responseDto = fileService.saveFile(multipartFile, path, storagePeriod); + return ApiResponse.success(responseDto); + } + @Operation(summary = "[A] 함께하는 활동 사진 업로드", description = "ROLE_ADMIN 이상의 권한이 필요함") @PreAuthorize("hasRole('ADMIN')") @PostMapping(value = "/activity-photos", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) diff --git a/src/main/java/page/clab/api/global/common/file/application/FileService.java b/src/main/java/page/clab/api/global/common/file/application/FileService.java index 925b0a3a9..34f652b04 100644 --- a/src/main/java/page/clab/api/global/common/file/application/FileService.java +++ b/src/main/java/page/clab/api/global/common/file/application/FileService.java @@ -85,13 +85,14 @@ public class FileService { private static final Map> roleCategoryMap = Map.of( Role.GUEST, Set.of("boards", "profiles", "activity-photos", "membership-fees"), Role.USER, Set.of("boards", "profiles", "activity-photos", "membership-fees" , "notices", "weekly-activities", "members", "assignments", "submits"), - Role.ADMIN, Set.of("boards", "profiles", "activity-photos", "membership-fees", "notices", "weekly-activities", "members", "assignments", "submits"), - Role.SUPER, Set.of("boards", "profiles", "activity-photos", "membership-fees", "notices", "weekly-activities", "members", "assignments", "submits") + Role.ADMIN, Set.of("boards", "profiles", "activity-photos", "membership-fees", "notices", "weekly-activities", "members", "assignments", "submits", "executives"), + Role.SUPER, Set.of("boards", "profiles", "activity-photos", "membership-fees", "notices", "weekly-activities", "members", "assignments", "submits", "executives") ); private final Map> categoryAccessMap = Map.of( "boards", (url, auth) -> true, "profiles", (url, auth) -> true, + "executives", (url, auth) -> true, "activity-photos", (url, auth) -> true, "membership-fees", (url, auth) -> true, "notices", this::isNonSubmitCategoryAccessible, @@ -267,7 +268,7 @@ private void validateMemberCloudUsage(MultipartFile multipartFile, String path) } private void checkAndRemoveExistingFile(String path) { - List validPrefixes = Arrays.asList("profiles", "members/", "assignments"); + List validPrefixes = Arrays.asList("profiles", "members/", "assignments", "executives"); boolean shouldDelete = validPrefixes.stream().anyMatch(path::startsWith); if (shouldDelete) { UploadedFile fileToDelete = uploadedFileService.getUniqueUploadedFileByCategory(path); @@ -285,7 +286,7 @@ public boolean isUserAccessibleAtFile(Authentication authentication, String url) } public boolean isUserAccessibleByCategory(String category, String url, Authentication authentication) { - if (category.equals("activity-photos")) { + if (category.equals("activity-photos") || category.equals("executives")) { return true; } if (AuthUtil.isUserUnAuthenticated(authentication)) { From 2bd8be67947e91b66858508db2b3dcb2abf6b6d2 Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Fri, 27 Dec 2024 16:50:43 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat(ExecutiveRetrieve):=20=EC=9A=B4?= =?UTF-8?q?=EC=98=81=EC=A7=84=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/ExecutiveRegisterController.java | 6 +++- .../in/web/ExecutiveRetrievalController.java | 30 ++++++++++++++++ .../out/persistence/ExecutiveJpaEntity.java | 6 +++- .../ExecutivePersistenceAdapter.java | 15 +++++++- .../dto/mapper/ExecutiveDtoMapper.java | 12 +++++++ .../dto/request/ExecutiveRequestDto.java | 5 +-- .../dto/response/ExecutiveResponseDto.java | 17 +++++++++ .../port/in/RetrieveExecutiveUseCase.java | 8 +++++ .../port/out/RetrieveExecutivePort.java | 8 +++++ .../service/ExecutiveRetrievalService.java | 36 +++++++++++++++++++ .../executive/domain/Executive.java | 2 +- .../executive/domain/ExecutivePosition.java | 16 +++++++++ 12 files changed, 155 insertions(+), 6 deletions(-) create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRetrievalController.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RetrieveExecutiveUseCase.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java index 43e87291a..222a1f23b 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java @@ -20,7 +20,11 @@ public class ExecutiveRegisterController { private final RegisterExecutiveUseCase registerExecutiveUseCase; - @Operation(summary = "[A] 운영진 등록", description = "ROLE_ADMIN 이상의 권한이 필요함") + @Operation(summary = "[A] 운영진 등록", description = "ROLE_ADMIN 이상의 권한이 필요함
" + + "position은 다음과 같이 등록 가능
" + + "- PRESIDENT : 회장
" + + "- VICE_PRESIDENT : 부회장
" + + "- GENERAL : 일반 운영진
") @PreAuthorize("hasRole('ADMIN')") @PostMapping("") public ApiResponse registerExecutive( diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRetrievalController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRetrievalController.java new file mode 100644 index 000000000..683c36bf5 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRetrievalController.java @@ -0,0 +1,30 @@ +package page.clab.api.domain.memberManagement.executive.adapter.in.web; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import page.clab.api.domain.memberManagement.executive.application.dto.response.ExecutiveResponseDto; +import page.clab.api.domain.memberManagement.executive.application.port.in.RetrieveExecutiveUseCase; +import page.clab.api.global.common.dto.ApiResponse; + +@RestController +@RequestMapping("/api/v1/executive") +@RequiredArgsConstructor +@Tag(name = "Member Management - Executive", description = "운영진") +public class ExecutiveRetrievalController { + + private final RetrieveExecutiveUseCase retrieveExecutiveUseCase; + + @Operation(summary = "[G] 운영진 정보 조회", description = "ROLE_GUEST 이상의 권한이 필요함") + @PreAuthorize("hasRole('GUEST')") + @GetMapping("") + public ApiResponse> retrieveExecutives() { + List executives = retrieveExecutiveUseCase.retrieveExecutives(); + return ApiResponse.success(executives); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java index 405b810a0..f90ac951a 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java @@ -2,6 +2,8 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.validation.constraints.Email; @@ -14,6 +16,7 @@ import lombok.Setter; import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.SQLRestriction; +import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; import page.clab.api.global.common.domain.BaseEntity; @Entity @@ -45,7 +48,8 @@ public class ExecutiveJpaEntity extends BaseEntity { private String field; @Column(nullable = false) - private String position; + @Enumerated(EnumType.STRING) + private ExecutivePosition position; private String imageUrl; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java index 05cca4367..949f83be4 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java @@ -1,13 +1,18 @@ package page.clab.api.domain.memberManagement.executive.adapter.out.persistence; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import page.clab.api.domain.memberManagement.executive.application.port.out.RegisterExecutivePort; +import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; import page.clab.api.domain.memberManagement.executive.domain.Executive; @Component @RequiredArgsConstructor -public class ExecutivePersistenceAdapter implements RegisterExecutivePort { +public class ExecutivePersistenceAdapter implements + RegisterExecutivePort, + RetrieveExecutivePort { private final ExecutiveMapper executiveMapper; private final ExecutiveRepository executiveRepository; @@ -18,4 +23,12 @@ public Executive save(Executive executive) { ExecutiveJpaEntity savedEntity = executiveRepository.save(jpaEntity); return executiveMapper.toDomain(savedEntity); } + + @Override + public List findAll() { + List jpaEntities = executiveRepository.findAll(); + return jpaEntities.stream() + .map(executiveMapper::toDomain) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java index 89b00955e..633b87121 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java @@ -2,6 +2,7 @@ import org.springframework.stereotype.Component; import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveRequestDto; +import page.clab.api.domain.memberManagement.executive.application.dto.response.ExecutiveResponseDto; import page.clab.api.domain.memberManagement.executive.domain.Executive; @Component @@ -18,4 +19,15 @@ public Executive fromDto(ExecutiveRequestDto requestDto) { .isDeleted(false) .build(); } + + public ExecutiveResponseDto toDto(Executive executive) { + return ExecutiveResponseDto.builder() + .id(executive.getId()) + .name(executive.getName()) + .email(executive.getEmail()) + .field(executive.getField()) + .position(executive.getPosition()) + .imageUrl(executive.getImageUrl()) + .build(); + } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java index dfd3b0fd0..d7594337c 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java @@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; @Getter @Setter @@ -26,8 +27,8 @@ public class ExecutiveRequestDto { private String field; @NotNull(message = "{notNull.executive.position}") - @Schema(description = "직급", example = "회장") - private String position; + @Schema(description = "직급", example = "PRESIDENT") + private ExecutivePosition position; @Schema(description = "프로필 이미지", example = "https://www.clab.page/assets/dongmin-860f3a1e.jpeg") private String imageUrl; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java new file mode 100644 index 000000000..49125f76f --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java @@ -0,0 +1,17 @@ +package page.clab.api.domain.memberManagement.executive.application.dto.response; + +import lombok.Builder; +import lombok.Getter; +import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; + +@Getter +@Builder +public class ExecutiveResponseDto { + + private String id; + private String name; + private String email; + private String field; + private ExecutivePosition position; + private String imageUrl; +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RetrieveExecutiveUseCase.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RetrieveExecutiveUseCase.java new file mode 100644 index 000000000..8e1225fd3 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RetrieveExecutiveUseCase.java @@ -0,0 +1,8 @@ +package page.clab.api.domain.memberManagement.executive.application.port.in; + +import java.util.List; +import page.clab.api.domain.memberManagement.executive.application.dto.response.ExecutiveResponseDto; + +public interface RetrieveExecutiveUseCase { + List retrieveExecutives(); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java new file mode 100644 index 000000000..d64dce97d --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java @@ -0,0 +1,8 @@ +package page.clab.api.domain.memberManagement.executive.application.port.out; + +import java.util.List; +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +public interface RetrieveExecutivePort { + List findAll(); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java new file mode 100644 index 000000000..2cd8b4edc --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java @@ -0,0 +1,36 @@ +package page.clab.api.domain.memberManagement.executive.application.service; + +import java.util.Comparator; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import page.clab.api.domain.memberManagement.executive.application.dto.mapper.ExecutiveDtoMapper; +import page.clab.api.domain.memberManagement.executive.application.dto.response.ExecutiveResponseDto; +import page.clab.api.domain.memberManagement.executive.application.port.in.RetrieveExecutiveUseCase; +import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +@Service +@RequiredArgsConstructor +public class ExecutiveRetrievalService implements RetrieveExecutiveUseCase { + + private final RetrieveExecutivePort retrieveExecutivePort; + private final ExecutiveDtoMapper mapper; + + @Transactional(readOnly = true) + @Override + public List retrieveExecutives() { + List executives = retrieveExecutivePort.findAll(); + sortExecutives(executives); + return executives.stream() + .map(mapper::toDto) + .toList(); + } + + private void sortExecutives(List executives) { + executives.sort(Comparator + .comparing((Executive executive) -> executive.getPosition().ordinal()) + .thenComparing(Executive::getId)); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java index 33c4d7303..a731865ed 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java @@ -18,7 +18,7 @@ public class Executive { private String name; private String email; private String field; - private String position; + private ExecutivePosition position; private String imageUrl; private Boolean isDeleted; } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java new file mode 100644 index 000000000..14335556f --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java @@ -0,0 +1,16 @@ +package page.clab.api.domain.memberManagement.executive.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ExecutivePosition { + + PRESIDENT("PRESIDENT", "회장"), + VICE_PRESIDENT("VICE_PRESIDENT", "부회장"), + GENERAL("GENERAL", "일반 운영진"); + + private final String key; + private final String description; +} From 4c3c9aa1cf1ff4821bf8464aa5d2bf47911f609e Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Sat, 28 Dec 2024 15:27:33 +0900 Subject: [PATCH 05/15] =?UTF-8?q?feat(Executive):=20=EC=9A=B4=EC=98=81?= =?UTF-8?q?=EC=A7=84=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/ExecutiveRemoveController.java | 32 +++++++++++++++++ .../in/web/ExecutiveUpdateController.java | 34 +++++++++++++++++++ .../ExecutivePersistenceAdapter.java | 22 ++++++++++-- .../request/ExecutiveUpdateRequestDto.java | 30 ++++++++++++++++ .../port/in/RemoveExecutiveUseCase.java | 5 +++ .../port/in/UpdateExecutiveUseCase.java | 7 ++++ .../port/out/RetrieveExecutivePort.java | 3 ++ .../port/out/UpdateExecutivePort.java | 7 ++++ .../service/ExecutiveRemoveService.java | 26 ++++++++++++++ .../service/ExecutiveUpdateService.java | 28 +++++++++++++++ .../executive/domain/Executive.java | 15 ++++++++ 11 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/UpdateExecutivePort.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java create mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java new file mode 100644 index 000000000..7b686dcee --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java @@ -0,0 +1,32 @@ +package page.clab.api.domain.memberManagement.executive.adapter.in.web; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import page.clab.api.domain.memberManagement.executive.application.port.in.RemoveExecutiveUseCase; +import page.clab.api.global.common.dto.ApiResponse; + +@RestController +@RequestMapping("/api/v1/executive") +@RequiredArgsConstructor +@Tag(name = "Member Management - Executive", description = "운영진") +public class ExecutiveRemoveController { + + private final RemoveExecutiveUseCase removeExecutiveUseCase; + + @Operation(summary = "[A] 운영진 정보 삭제", description = "ROLE_ADMIN 이상의 권한이 필요함") + @PreAuthorize("hasRole('ADMIN')") + @DeleteMapping("/{id}") + public ApiResponse removeMember( + @PathVariable(name = "id") String id + ) { + String executiveId = removeExecutiveUseCase.removeExecutive(id); + return ApiResponse.success(executiveId); + } + +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java new file mode 100644 index 000000000..f9583a240 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java @@ -0,0 +1,34 @@ +package page.clab.api.domain.memberManagement.executive.adapter.in.web; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveUpdateRequestDto; +import page.clab.api.domain.memberManagement.executive.application.port.in.UpdateExecutiveUseCase; +import page.clab.api.global.common.dto.ApiResponse; + +@RestController +@RequestMapping("/api/v1/executive") +@RequiredArgsConstructor +@Tag(name = "Member Management - Executive", description = "운영진") +public class ExecutiveUpdateController { + + private final UpdateExecutiveUseCase updateExecutiveUseCase; + + @Operation(summary = "[A] 운영진 정보 수정", description = "ROLE_ADMIN 이상의 권한이 필요함") + @PreAuthorize("hasRole('ADMIN')") + @PatchMapping("/{id}") + public ApiResponse updateExecutive( + @PathVariable(name = "id") String id, + @RequestBody ExecutiveUpdateRequestDto requestDto + ) { + String executiveId = updateExecutiveUseCase.updateExecutive(id, requestDto); + return ApiResponse.success(executiveId); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java index 949f83be4..5b28dfeec 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java @@ -1,18 +1,22 @@ package page.clab.api.domain.memberManagement.executive.adapter.out.persistence; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import page.clab.api.domain.memberManagement.executive.application.port.out.RegisterExecutivePort; import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; +import page.clab.api.domain.memberManagement.executive.application.port.out.UpdateExecutivePort; import page.clab.api.domain.memberManagement.executive.domain.Executive; +import page.clab.api.global.exception.NotFoundException; @Component @RequiredArgsConstructor public class ExecutivePersistenceAdapter implements - RegisterExecutivePort, - RetrieveExecutivePort { + RegisterExecutivePort, + RetrieveExecutivePort, + UpdateExecutivePort { private final ExecutiveMapper executiveMapper; private final ExecutiveRepository executiveRepository; @@ -24,6 +28,13 @@ public Executive save(Executive executive) { return executiveMapper.toDomain(savedEntity); } + @Override + public Executive update(Executive executive) { + ExecutiveJpaEntity jpaEntity = executiveMapper.toEntity(executive); + ExecutiveJpaEntity savedEntity = executiveRepository.save(jpaEntity); + return executiveMapper.toDomain(savedEntity); + } + @Override public List findAll() { List jpaEntities = executiveRepository.findAll(); @@ -31,4 +42,11 @@ public List findAll() { .map(executiveMapper::toDomain) .collect(Collectors.toList()); } + + @Override + public Executive getById(String id) { + ExecutiveJpaEntity jpaEntity = executiveRepository.findById(id) + .orElseThrow(() -> new NotFoundException("학번이 " + id + "인 운영진이 존재하지 않습니다.")); + return executiveMapper.toDomain(jpaEntity); + } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java new file mode 100644 index 000000000..194249e11 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java @@ -0,0 +1,30 @@ +package page.clab.api.domain.memberManagement.executive.application.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; + +@Getter +@Setter +public class ExecutiveUpdateRequestDto { + + @Schema(description = "학번", example = "202310000") + private String id; + + @Schema(description = "이름", example = "홍길동") + private String name; + + @Schema(description = "이메일", example = "clab.coreteam@gamil.com") + private String email; + + @Schema(description = "분야", example = "Back-End") + private String field; + + @Schema(description = "직급", example = "PRESIDENT") + private ExecutivePosition position; + + @Schema(description = "프로필 이미지", example = "https://www.clab.page/assets/dongmin-860f3a1e.jpeg") + private String imageUrl; +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java new file mode 100644 index 000000000..bba69b3b1 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java @@ -0,0 +1,5 @@ +package page.clab.api.domain.memberManagement.executive.application.port.in; + +public interface RemoveExecutiveUseCase { + String removeExecutive(String id); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java new file mode 100644 index 000000000..0e92d6b13 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java @@ -0,0 +1,7 @@ +package page.clab.api.domain.memberManagement.executive.application.port.in; + +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveUpdateRequestDto; + +public interface UpdateExecutiveUseCase { + String updateExecutive(String id, ExecutiveUpdateRequestDto requestDto); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java index d64dce97d..a1511a67e 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java @@ -4,5 +4,8 @@ import page.clab.api.domain.memberManagement.executive.domain.Executive; public interface RetrieveExecutivePort { + List findAll(); + + Executive getById(String id); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/UpdateExecutivePort.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/UpdateExecutivePort.java new file mode 100644 index 000000000..0f383e4ae --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/UpdateExecutivePort.java @@ -0,0 +1,7 @@ +package page.clab.api.domain.memberManagement.executive.application.port.out; + +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +public interface UpdateExecutivePort { + Executive update(Executive executive); +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java new file mode 100644 index 000000000..fce67b095 --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java @@ -0,0 +1,26 @@ +package page.clab.api.domain.memberManagement.executive.application.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import page.clab.api.domain.memberManagement.executive.application.port.in.RemoveExecutiveUseCase; +import page.clab.api.domain.memberManagement.executive.application.port.out.RegisterExecutivePort; +import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +@Service +@RequiredArgsConstructor +public class ExecutiveRemoveService implements RemoveExecutiveUseCase { + + private final RetrieveExecutivePort retrieveExecutivePort; + private final RegisterExecutivePort registerExecutivePort; + + @Transactional + @Override + public String removeExecutive(String id) { + Executive executive = retrieveExecutivePort.getById(id); + executive.delete(); + registerExecutivePort.save(executive); + return executive.getId(); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java new file mode 100644 index 000000000..d6d863b4f --- /dev/null +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java @@ -0,0 +1,28 @@ +package page.clab.api.domain.memberManagement.executive.application.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import page.clab.api.domain.memberManagement.executive.application.dto.mapper.ExecutiveDtoMapper; +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveUpdateRequestDto; +import page.clab.api.domain.memberManagement.executive.application.port.in.UpdateExecutiveUseCase; +import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; +import page.clab.api.domain.memberManagement.executive.application.port.out.UpdateExecutivePort; +import page.clab.api.domain.memberManagement.executive.domain.Executive; + +@Service +@RequiredArgsConstructor +public class ExecutiveUpdateService implements UpdateExecutiveUseCase { + + private final UpdateExecutivePort updateExecutivePort; + private final RetrieveExecutivePort retrieveExecutivePort; + + @Transactional + @Override + public String updateExecutive(String id, ExecutiveUpdateRequestDto requestDto) { + Executive executive = retrieveExecutivePort.getById(id); + executive.update(requestDto); + Executive updatedExecutive = updateExecutivePort.update(executive); + return updatedExecutive.getId(); + } +} diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java index a731865ed..7cca83ea7 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java @@ -1,11 +1,13 @@ package page.clab.api.domain.memberManagement.executive.domain; +import java.util.Optional; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveUpdateRequestDto; @Getter @Setter @@ -21,4 +23,17 @@ public class Executive { private ExecutivePosition position; private String imageUrl; private Boolean isDeleted; + + public void update(ExecutiveUpdateRequestDto requestDto) { + Optional.ofNullable(requestDto.getId()).ifPresent(this::setId); + Optional.ofNullable(requestDto.getName()).ifPresent(this::setName); + Optional.ofNullable(requestDto.getEmail()).ifPresent(this::setEmail); + Optional.ofNullable(requestDto.getField()).ifPresent(this::setField); + Optional.ofNullable(requestDto.getPosition()).ifPresent(this::setPosition); + Optional.ofNullable(requestDto.getImageUrl()).ifPresent(this::setImageUrl); + } + + public void delete() { + this.isDeleted = true; + } } From ce80cc1b818419d523d684665ddbfe9dee4c1247 Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Sat, 28 Dec 2024 16:47:03 +0900 Subject: [PATCH 06/15] =?UTF-8?q?feat(ExecutiveRegisterService):=20?= =?UTF-8?q?=EC=9A=B4=EC=98=81=EC=A7=84=20=EC=88=98=EC=A0=95=EC=8B=9C=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/out/persistence/ExecutiveJpaEntity.java | 2 +- .../persistence/ExecutivePersistenceAdapter.java | 6 +++++- .../dto/request/ExecutiveUpdateRequestDto.java | 4 ---- .../application/port/out/RetrieveExecutivePort.java | 2 ++ .../service/ExecutiveRegisterService.java | 13 +++++++++++-- .../executive/domain/Executive.java | 1 - 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java index f90ac951a..d19944c6f 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java @@ -31,7 +31,7 @@ public class ExecutiveJpaEntity extends BaseEntity { @Id - @Column(nullable = false, unique = true) + @Column(nullable = false, updatable = false, unique = true) @Size(min = 9, max = 9, message = "{size.executive.id}") private String id; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java index 5b28dfeec..b861c8502 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java @@ -1,7 +1,6 @@ package page.clab.api.domain.memberManagement.executive.adapter.out.persistence; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -49,4 +48,9 @@ public Executive getById(String id) { .orElseThrow(() -> new NotFoundException("학번이 " + id + "인 운영진이 존재하지 않습니다.")); return executiveMapper.toDomain(jpaEntity); } + + @Override + public Boolean existsById(String id) { + return executiveRepository.existsById(id); + } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java index 194249e11..542bd5ed9 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java @@ -1,7 +1,6 @@ package page.clab.api.domain.memberManagement.executive.application.dto.request; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; @@ -10,9 +9,6 @@ @Setter public class ExecutiveUpdateRequestDto { - @Schema(description = "학번", example = "202310000") - private String id; - @Schema(description = "이름", example = "홍길동") private String name; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java index a1511a67e..c6a1f9186 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/out/RetrieveExecutivePort.java @@ -8,4 +8,6 @@ public interface RetrieveExecutivePort { List findAll(); Executive getById(String id); + + Boolean existsById(String id); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java index dac893612..94e4ae476 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java @@ -8,6 +8,7 @@ import page.clab.api.domain.memberManagement.executive.application.exception.ExecutiveRegistrationException; import page.clab.api.domain.memberManagement.executive.application.port.in.RegisterExecutiveUseCase; import page.clab.api.domain.memberManagement.executive.application.port.out.RegisterExecutivePort; +import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; import page.clab.api.domain.memberManagement.executive.domain.Executive; import page.clab.api.external.memberManagement.member.application.port.ExternalRetrieveMemberUseCase; @@ -16,19 +17,27 @@ public class ExecutiveRegisterService implements RegisterExecutiveUseCase { private final RegisterExecutivePort registerExecutivePort; + private final RetrieveExecutivePort retrieveExecutivePort; private final ExecutiveDtoMapper mapper; private final ExternalRetrieveMemberUseCase externalRetrieveMemberUseCase; @Transactional @Override public String registerExecutive(ExecutiveRequestDto requestDto) { + checkAlreadyExecutive(requestDto); + checkIsMember(requestDto); Executive executive = mapper.fromDto(requestDto); Executive savedExecutive = registerExecutivePort.save(executive); - checkExistMember(requestDto); return savedExecutive.getId(); } - private void checkExistMember(ExecutiveRequestDto requestDto) { + private void checkAlreadyExecutive(ExecutiveRequestDto requestDto) { + if (retrieveExecutivePort.existsById(requestDto.getId())) { + throw new ExecutiveRegistrationException("해당 운영진이 이미 존재합니다."); + } + } + + private void checkIsMember(ExecutiveRequestDto requestDto) { if (!externalRetrieveMemberUseCase.existsById(requestDto.getId())) { throw new ExecutiveRegistrationException("등록하려는 운영진이 멤버가 아닙니다."); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java index 7cca83ea7..0031b4123 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java @@ -25,7 +25,6 @@ public class Executive { private Boolean isDeleted; public void update(ExecutiveUpdateRequestDto requestDto) { - Optional.ofNullable(requestDto.getId()).ifPresent(this::setId); Optional.ofNullable(requestDto.getName()).ifPresent(this::setName); Optional.ofNullable(requestDto.getEmail()).ifPresent(this::setEmail); Optional.ofNullable(requestDto.getField()).ifPresent(this::setField); From 2d1be298d2517a712bea54c908b480beac002e3e Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Sat, 28 Dec 2024 17:29:44 +0900 Subject: [PATCH 07/15] =?UTF-8?q?refactor(ExecutiveRegisterController):=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executive/adapter/in/web/ExecutiveRegisterController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java index 222a1f23b..dec72ceef 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; @@ -28,7 +29,7 @@ public class ExecutiveRegisterController { @PreAuthorize("hasRole('ADMIN')") @PostMapping("") public ApiResponse registerExecutive( - @RequestBody ExecutiveRequestDto requestDto + @Valid @RequestBody ExecutiveRequestDto requestDto ) { String id = registerExecutiveUseCase.registerExecutive(requestDto); return ApiResponse.success(id); From d62fc1998f7b05f9bcb5f94b8c4523cd9db49859 Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Mon, 30 Dec 2024 21:50:26 +0900 Subject: [PATCH 08/15] =?UTF-8?q?refactor(Executive):=20ExecutivePosition?= =?UTF-8?q?=EC=9D=84=20=EA=B8=B0=EC=A1=B4=EC=9D=98=20Position=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=99=80=20=EC=97=B0=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/ExecutiveRegisterController.java | 6 +-- .../out/persistence/ExecutiveJpaEntity.java | 7 ---- .../dto/mapper/ExecutiveDtoMapper.java | 5 +-- .../dto/request/ExecutiveRequestDto.java | 5 --- .../request/ExecutiveUpdateRequestDto.java | 4 -- .../dto/response/ExecutiveResponseDto.java | 3 +- .../service/ExecutiveRetrievalService.java | 39 ++++++++++++++++--- .../executive/domain/Executive.java | 2 - .../PositionPersistenceAdapter.java | 6 +++ .../out/persistence/PositionRepository.java | 2 + .../port/out/RetrievePositionPort.java | 2 + .../port/ExternalRetrievePositionUseCase.java | 2 + .../ExternalPositionRetrievalService.java | 7 ++++ 13 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java index dec72ceef..c206fdcf3 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRegisterController.java @@ -21,11 +21,7 @@ public class ExecutiveRegisterController { private final RegisterExecutiveUseCase registerExecutiveUseCase; - @Operation(summary = "[A] 운영진 등록", description = "ROLE_ADMIN 이상의 권한이 필요함
" + - "position은 다음과 같이 등록 가능
" + - "- PRESIDENT : 회장
" + - "- VICE_PRESIDENT : 부회장
" + - "- GENERAL : 일반 운영진
") + @Operation(summary = "[A] 운영진 등록", description = "ROLE_ADMIN 이상의 권한이 필요함") @PreAuthorize("hasRole('ADMIN')") @PostMapping("") public ApiResponse registerExecutive( diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java index d19944c6f..06f02d614 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java @@ -2,8 +2,6 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.validation.constraints.Email; @@ -16,7 +14,6 @@ import lombok.Setter; import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.SQLRestriction; -import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; import page.clab.api.global.common.domain.BaseEntity; @Entity @@ -47,10 +44,6 @@ public class ExecutiveJpaEntity extends BaseEntity { @Column(nullable = false) private String field; - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private ExecutivePosition position; - private String imageUrl; @Column(name = "is_deleted", nullable = false) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java index 633b87121..1ff1f86ec 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java @@ -14,19 +14,18 @@ public Executive fromDto(ExecutiveRequestDto requestDto) { .name(requestDto.getName()) .email(requestDto.getEmail()) .field(requestDto.getField()) - .position(requestDto.getPosition()) .imageUrl(requestDto.getImageUrl()) .isDeleted(false) .build(); } - public ExecutiveResponseDto toDto(Executive executive) { + public ExecutiveResponseDto toDto(Executive executive, String position) { return ExecutiveResponseDto.builder() .id(executive.getId()) .name(executive.getName()) .email(executive.getEmail()) .field(executive.getField()) - .position(executive.getPosition()) + .position(position) .imageUrl(executive.getImageUrl()) .build(); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java index d7594337c..f9fa38746 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java @@ -4,7 +4,6 @@ import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; -import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; @Getter @Setter @@ -26,10 +25,6 @@ public class ExecutiveRequestDto { @Schema(description = "분야", example = "Back-End") private String field; - @NotNull(message = "{notNull.executive.position}") - @Schema(description = "직급", example = "PRESIDENT") - private ExecutivePosition position; - @Schema(description = "프로필 이미지", example = "https://www.clab.page/assets/dongmin-860f3a1e.jpeg") private String imageUrl; } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java index 542bd5ed9..4c651eadd 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java @@ -3,7 +3,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; -import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; @Getter @Setter @@ -18,9 +17,6 @@ public class ExecutiveUpdateRequestDto { @Schema(description = "분야", example = "Back-End") private String field; - @Schema(description = "직급", example = "PRESIDENT") - private ExecutivePosition position; - @Schema(description = "프로필 이미지", example = "https://www.clab.page/assets/dongmin-860f3a1e.jpeg") private String imageUrl; } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java index 49125f76f..e98d11c1c 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java @@ -2,7 +2,6 @@ import lombok.Builder; import lombok.Getter; -import page.clab.api.domain.memberManagement.executive.domain.ExecutivePosition; @Getter @Builder @@ -12,6 +11,6 @@ public class ExecutiveResponseDto { private String name; private String email; private String field; - private ExecutivePosition position; + private String position; private String imageUrl; } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java index 2cd8b4edc..4aae2ef4b 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java @@ -1,7 +1,10 @@ package page.clab.api.domain.memberManagement.executive.application.service; +import java.time.LocalDate; import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -10,27 +13,51 @@ import page.clab.api.domain.memberManagement.executive.application.port.in.RetrieveExecutiveUseCase; import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; import page.clab.api.domain.memberManagement.executive.domain.Executive; +import page.clab.api.external.memberManagement.position.application.port.ExternalRetrievePositionUseCase; @Service @RequiredArgsConstructor public class ExecutiveRetrievalService implements RetrieveExecutiveUseCase { private final RetrieveExecutivePort retrieveExecutivePort; + private final ExternalRetrievePositionUseCase externalRetrievePositionUseCase; private final ExecutiveDtoMapper mapper; + private static final Map PRIORITY = Map.of( + "PRESIDENT", 1, + "VICE_PRESIDENT", 2, + "OPERATION", 3 + ); @Transactional(readOnly = true) @Override public List retrieveExecutives() { List executives = retrieveExecutivePort.findAll(); - sortExecutives(executives); + Map positionMap = getPositionMap(executives); + List sortedExecutives = sortExecutives(executives, positionMap); + + return sortedExecutives.stream() + .map(executive -> mapper.toDto(executive, positionMap.get(executive.getId()))) + .toList(); + } + + private List sortExecutives(List executives, Map positionMap) { return executives.stream() - .map(mapper::toDto) + .sorted(Comparator + .comparing((Executive executive) -> + PRIORITY.getOrDefault(positionMap.get(executive.getId()), Integer.MAX_VALUE)) + .thenComparing(Executive::getId)) .toList(); } - private void sortExecutives(List executives) { - executives.sort(Comparator - .comparing((Executive executive) -> executive.getPosition().ordinal()) - .thenComparing(Executive::getId)); + private Map getPositionMap(List executives) { + return executives.stream() + .collect(Collectors.toMap( + Executive::getId, + executive -> externalRetrievePositionUseCase + .findTopByMemberIdAndYearOrderByCreatedAtDesc(executive.getId(), + String.valueOf(LocalDate.now().getYear())) + .map(position -> position.getPositionType().getKey()) + .orElse("") + )); } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java index 0031b4123..c186c7f50 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java @@ -20,7 +20,6 @@ public class Executive { private String name; private String email; private String field; - private ExecutivePosition position; private String imageUrl; private Boolean isDeleted; @@ -28,7 +27,6 @@ public void update(ExecutiveUpdateRequestDto requestDto) { Optional.ofNullable(requestDto.getName()).ifPresent(this::setName); Optional.ofNullable(requestDto.getEmail()).ifPresent(this::setEmail); Optional.ofNullable(requestDto.getField()).ifPresent(this::setField); - Optional.ofNullable(requestDto.getPosition()).ifPresent(this::setPosition); Optional.ofNullable(requestDto.getImageUrl()).ifPresent(this::setImageUrl); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionPersistenceAdapter.java b/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionPersistenceAdapter.java index 8c16c68f2..8cfe54ec8 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionPersistenceAdapter.java +++ b/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionPersistenceAdapter.java @@ -78,4 +78,10 @@ public List findByMemberId(String memberId) { .map(mapper::toDomain) .toList(); } + + @Override + public Optional findTopByMemberIdAndYearOrderByCreatedAtDesc(String memberId, String year) { + return repository.findTopByMemberIdAndYearOrderByCreatedAtDesc(memberId, year) + .map(mapper::toDomain); + } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionRepository.java b/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionRepository.java index bba32cff3..4f4a7e1f9 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionRepository.java +++ b/src/main/java/page/clab/api/domain/memberManagement/position/adapter/out/persistence/PositionRepository.java @@ -15,4 +15,6 @@ Optional findByMemberIdAndYearAndPositionType(String memberId PositionType positionType); List findAllByMemberIdAndYearOrderByPositionTypeAsc(String memberId, String year); + + Optional findTopByMemberIdAndYearOrderByCreatedAtDesc(String memberId, String year); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/position/application/port/out/RetrievePositionPort.java b/src/main/java/page/clab/api/domain/memberManagement/position/application/port/out/RetrievePositionPort.java index c6a2aabbe..62a6a79e9 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/position/application/port/out/RetrievePositionPort.java +++ b/src/main/java/page/clab/api/domain/memberManagement/position/application/port/out/RetrievePositionPort.java @@ -18,4 +18,6 @@ public interface RetrievePositionPort { Page findByConditions(String year, PositionType positionType, Pageable pageable); List findByMemberId(String memberId); + + Optional findTopByMemberIdAndYearOrderByCreatedAtDesc(String memberId, String year); } diff --git a/src/main/java/page/clab/api/external/memberManagement/position/application/port/ExternalRetrievePositionUseCase.java b/src/main/java/page/clab/api/external/memberManagement/position/application/port/ExternalRetrievePositionUseCase.java index 50891dc4e..ae2636250 100644 --- a/src/main/java/page/clab/api/external/memberManagement/position/application/port/ExternalRetrievePositionUseCase.java +++ b/src/main/java/page/clab/api/external/memberManagement/position/application/port/ExternalRetrievePositionUseCase.java @@ -7,4 +7,6 @@ public interface ExternalRetrievePositionUseCase { Optional findByMemberIdAndYearAndPositionType(String memberId, String year, PositionType positionType); + + Optional findTopByMemberIdAndYearOrderByCreatedAtDesc(String memberId, String year); } diff --git a/src/main/java/page/clab/api/external/memberManagement/position/application/service/ExternalPositionRetrievalService.java b/src/main/java/page/clab/api/external/memberManagement/position/application/service/ExternalPositionRetrievalService.java index 6861eb65c..75ee9b7f5 100644 --- a/src/main/java/page/clab/api/external/memberManagement/position/application/service/ExternalPositionRetrievalService.java +++ b/src/main/java/page/clab/api/external/memberManagement/position/application/service/ExternalPositionRetrievalService.java @@ -21,4 +21,11 @@ public Optional findByMemberIdAndYearAndPositionType(String memberId, PositionType positionType) { return retrievePositionPort.findByMemberIdAndYearAndPositionType(memberId, year, positionType); } + + @Transactional(readOnly = true) + @Override + public Optional findTopByMemberIdAndYearOrderByCreatedAtDesc(String memberId, String year) { + return retrievePositionPort.findTopByMemberIdAndYearOrderByCreatedAtDesc(memberId, year); + } + } From 7e6852fc56f6b6f23ba62e7fbb8135d9b1161b0c Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Mon, 30 Dec 2024 22:10:57 +0900 Subject: [PATCH 09/15] =?UTF-8?q?refactor(Executive):=20id=EB=A5=BC=20exec?= =?UTF-8?q?utiveId=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/in/web/ExecutiveRemoveController.java | 9 ++++----- .../adapter/in/web/ExecutiveUpdateController.java | 8 ++++---- .../out/persistence/ExecutivePersistenceAdapter.java | 10 +++++----- .../application/dto/mapper/ExecutiveDtoMapper.java | 4 ++-- .../application/dto/request/ExecutiveRequestDto.java | 2 +- .../application/dto/response/ExecutiveResponseDto.java | 2 +- .../application/port/in/RemoveExecutiveUseCase.java | 2 +- .../application/port/in/UpdateExecutiveUseCase.java | 2 +- .../application/service/ExecutiveRegisterService.java | 10 ++++++---- .../application/service/ExecutiveRemoveService.java | 4 ++-- .../application/service/ExecutiveUpdateService.java | 5 ++--- 11 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java index 7b686dcee..5dd794c87 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveRemoveController.java @@ -21,12 +21,11 @@ public class ExecutiveRemoveController { @Operation(summary = "[A] 운영진 정보 삭제", description = "ROLE_ADMIN 이상의 권한이 필요함") @PreAuthorize("hasRole('ADMIN')") - @DeleteMapping("/{id}") + @DeleteMapping("/{executiveId}") public ApiResponse removeMember( - @PathVariable(name = "id") String id + @PathVariable(name = "executiveId") String executiveId ) { - String executiveId = removeExecutiveUseCase.removeExecutive(id); - return ApiResponse.success(executiveId); + String id = removeExecutiveUseCase.removeExecutive(executiveId); + return ApiResponse.success(id); } - } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java index f9583a240..e02be431a 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/in/web/ExecutiveUpdateController.java @@ -23,12 +23,12 @@ public class ExecutiveUpdateController { @Operation(summary = "[A] 운영진 정보 수정", description = "ROLE_ADMIN 이상의 권한이 필요함") @PreAuthorize("hasRole('ADMIN')") - @PatchMapping("/{id}") + @PatchMapping("/{executiveId}") public ApiResponse updateExecutive( - @PathVariable(name = "id") String id, + @PathVariable(name = "executiveId") String executiveId, @RequestBody ExecutiveUpdateRequestDto requestDto ) { - String executiveId = updateExecutiveUseCase.updateExecutive(id, requestDto); - return ApiResponse.success(executiveId); + String id = updateExecutiveUseCase.updateExecutive(executiveId, requestDto); + return ApiResponse.success(id); } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java index b861c8502..726a8c8ac 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutivePersistenceAdapter.java @@ -43,14 +43,14 @@ public List findAll() { } @Override - public Executive getById(String id) { - ExecutiveJpaEntity jpaEntity = executiveRepository.findById(id) - .orElseThrow(() -> new NotFoundException("학번이 " + id + "인 운영진이 존재하지 않습니다.")); + public Executive getById(String executiveId) { + ExecutiveJpaEntity jpaEntity = executiveRepository.findById(executiveId) + .orElseThrow(() -> new NotFoundException("[Executive] id: " + executiveId + "에 해당하는 운영진이 존재하지 않습니다.")); return executiveMapper.toDomain(jpaEntity); } @Override - public Boolean existsById(String id) { - return executiveRepository.existsById(id); + public Boolean existsById(String executiveId) { + return executiveRepository.existsById(executiveId); } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java index 1ff1f86ec..7c91ba95b 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java @@ -10,7 +10,7 @@ public class ExecutiveDtoMapper { public Executive fromDto(ExecutiveRequestDto requestDto) { return Executive.builder() - .id(requestDto.getId()) + .id(requestDto.getExecutiveId()) .name(requestDto.getName()) .email(requestDto.getEmail()) .field(requestDto.getField()) @@ -21,7 +21,7 @@ public Executive fromDto(ExecutiveRequestDto requestDto) { public ExecutiveResponseDto toDto(Executive executive, String position) { return ExecutiveResponseDto.builder() - .id(executive.getId()) + .executiveId(executive.getId()) .name(executive.getName()) .email(executive.getEmail()) .field(executive.getField()) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java index f9fa38746..afbb75baa 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java @@ -11,7 +11,7 @@ public class ExecutiveRequestDto { @NotNull(message = "{notNull.executive.id}") @Schema(description = "학번", example = "202310000") - private String id; + private String executiveId; @NotNull(message = "{notNull.executive.name}") @Schema(description = "이름", example = "홍길동") diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java index e98d11c1c..19171f0d5 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java @@ -7,7 +7,7 @@ @Builder public class ExecutiveResponseDto { - private String id; + private String executiveId; private String name; private String email; private String field; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java index bba69b3b1..feaf47215 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/RemoveExecutiveUseCase.java @@ -1,5 +1,5 @@ package page.clab.api.domain.memberManagement.executive.application.port.in; public interface RemoveExecutiveUseCase { - String removeExecutive(String id); + String removeExecutive(String executiveId); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java index 0e92d6b13..33ee55f0c 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/port/in/UpdateExecutiveUseCase.java @@ -3,5 +3,5 @@ import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveUpdateRequestDto; public interface UpdateExecutiveUseCase { - String updateExecutive(String id, ExecutiveUpdateRequestDto requestDto); + String updateExecutive(String executiveId, ExecutiveUpdateRequestDto requestDto); } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java index 94e4ae476..34602bfef 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRegisterService.java @@ -32,14 +32,16 @@ public String registerExecutive(ExecutiveRequestDto requestDto) { } private void checkAlreadyExecutive(ExecutiveRequestDto requestDto) { - if (retrieveExecutivePort.existsById(requestDto.getId())) { - throw new ExecutiveRegistrationException("해당 운영진이 이미 존재합니다."); + if (retrieveExecutivePort.existsById(requestDto.getExecutiveId())) { + throw new ExecutiveRegistrationException("[Executive] id: " + requestDto.getExecutiveId() + "에 해당하는 운영진이 " + + "이미 존재합니다."); } } private void checkIsMember(ExecutiveRequestDto requestDto) { - if (!externalRetrieveMemberUseCase.existsById(requestDto.getId())) { - throw new ExecutiveRegistrationException("등록하려는 운영진이 멤버가 아닙니다."); + if (!externalRetrieveMemberUseCase.existsById(requestDto.getExecutiveId())) { + throw new ExecutiveRegistrationException("[Executive] id: " + requestDto.getExecutiveId() + "에 해당하는 운영진이 " + + "멤버가 아닙니다."); } } } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java index fce67b095..beb54422c 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRemoveService.java @@ -17,8 +17,8 @@ public class ExecutiveRemoveService implements RemoveExecutiveUseCase { @Transactional @Override - public String removeExecutive(String id) { - Executive executive = retrieveExecutivePort.getById(id); + public String removeExecutive(String executiveId) { + Executive executive = retrieveExecutivePort.getById(executiveId); executive.delete(); registerExecutivePort.save(executive); return executive.getId(); diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java index d6d863b4f..4e3ca1320 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveUpdateService.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import page.clab.api.domain.memberManagement.executive.application.dto.mapper.ExecutiveDtoMapper; import page.clab.api.domain.memberManagement.executive.application.dto.request.ExecutiveUpdateRequestDto; import page.clab.api.domain.memberManagement.executive.application.port.in.UpdateExecutiveUseCase; import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; @@ -19,8 +18,8 @@ public class ExecutiveUpdateService implements UpdateExecutiveUseCase { @Transactional @Override - public String updateExecutive(String id, ExecutiveUpdateRequestDto requestDto) { - Executive executive = retrieveExecutivePort.getById(id); + public String updateExecutive(String executiveId, ExecutiveUpdateRequestDto requestDto) { + Executive executive = retrieveExecutivePort.getById(executiveId); executive.update(requestDto); Executive updatedExecutive = updateExecutivePort.update(executive); return updatedExecutive.getId(); From 0803dd76b4a35b0a576e96aedeb185b18b17b372 Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Mon, 30 Dec 2024 22:47:29 +0900 Subject: [PATCH 10/15] =?UTF-8?q?refactor(FileService):=20=EC=A4=84?= =?UTF-8?q?=EB=B0=94=EA=BF=88=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clab/api/global/common/file/application/FileService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/page/clab/api/global/common/file/application/FileService.java b/src/main/java/page/clab/api/global/common/file/application/FileService.java index 7411d0174..1e920a268 100644 --- a/src/main/java/page/clab/api/global/common/file/application/FileService.java +++ b/src/main/java/page/clab/api/global/common/file/application/FileService.java @@ -82,10 +82,10 @@ public class FileService { private String maxFileSize; private static final Map> roleCategoryMap = Map.of( - Role.GUEST, Set.of("boards", "profiles", "activity-photos", "membership-fees"), + Role.GUEST, Set.of("boards", "profiles", "activity-photos", "membership-fees", "executives"), Role.USER, Set.of("boards", "profiles", "activity-photos", "membership-fees", "notices", "weekly-activities", "members", - "assignments", "submits"), + "assignments", "submits", "executives"), Role.ADMIN, Set.of("boards", "profiles", "activity-photos", "membership-fees", "notices", "weekly-activities", "members", "assignments", "submits", "executives"), From 2a59ac3324155c969cffaade0e09ab8e66093f0c Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Mon, 30 Dec 2024 22:30:31 +0900 Subject: [PATCH 11/15] =?UTF-8?q?refactor(Executive):=20=EA=B4=80=EC=8B=AC?= =?UTF-8?q?=EB=B6=84=EC=95=BC=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executive/adapter/out/persistence/ExecutiveJpaEntity.java | 2 +- .../executive/application/dto/mapper/ExecutiveDtoMapper.java | 4 ++-- .../application/dto/request/ExecutiveRequestDto.java | 2 +- .../application/dto/request/ExecutiveUpdateRequestDto.java | 2 +- .../application/dto/response/ExecutiveResponseDto.java | 2 +- .../domain/memberManagement/executive/domain/Executive.java | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java index 06f02d614..70efb3175 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/adapter/out/persistence/ExecutiveJpaEntity.java @@ -42,7 +42,7 @@ public class ExecutiveJpaEntity extends BaseEntity { private String email; @Column(nullable = false) - private String field; + private String interests; private String imageUrl; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java index 7c91ba95b..52613fbe2 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/mapper/ExecutiveDtoMapper.java @@ -13,7 +13,7 @@ public Executive fromDto(ExecutiveRequestDto requestDto) { .id(requestDto.getExecutiveId()) .name(requestDto.getName()) .email(requestDto.getEmail()) - .field(requestDto.getField()) + .interests(requestDto.getInterests()) .imageUrl(requestDto.getImageUrl()) .isDeleted(false) .build(); @@ -24,7 +24,7 @@ public ExecutiveResponseDto toDto(Executive executive, String position) { .executiveId(executive.getId()) .name(executive.getName()) .email(executive.getEmail()) - .field(executive.getField()) + .interests(executive.getInterests()) .position(position) .imageUrl(executive.getImageUrl()) .build(); diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java index afbb75baa..459e54b4b 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java @@ -23,7 +23,7 @@ public class ExecutiveRequestDto { @NotNull(message = "{notNull.executive.field}") @Schema(description = "분야", example = "Back-End") - private String field; + private String interests; @Schema(description = "프로필 이미지", example = "https://www.clab.page/assets/dongmin-860f3a1e.jpeg") private String imageUrl; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java index 4c651eadd..00d1387ad 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java @@ -15,7 +15,7 @@ public class ExecutiveUpdateRequestDto { private String email; @Schema(description = "분야", example = "Back-End") - private String field; + private String interests; @Schema(description = "프로필 이미지", example = "https://www.clab.page/assets/dongmin-860f3a1e.jpeg") private String imageUrl; diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java index 19171f0d5..758e82574 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/response/ExecutiveResponseDto.java @@ -10,7 +10,7 @@ public class ExecutiveResponseDto { private String executiveId; private String name; private String email; - private String field; + private String interests; private String position; private String imageUrl; } diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java index c186c7f50..8bb02ff8c 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/Executive.java @@ -19,14 +19,14 @@ public class Executive { private String id; private String name; private String email; - private String field; + private String interests; private String imageUrl; private Boolean isDeleted; public void update(ExecutiveUpdateRequestDto requestDto) { Optional.ofNullable(requestDto.getName()).ifPresent(this::setName); Optional.ofNullable(requestDto.getEmail()).ifPresent(this::setEmail); - Optional.ofNullable(requestDto.getField()).ifPresent(this::setField); + Optional.ofNullable(requestDto.getInterests()).ifPresent(this::setInterests); Optional.ofNullable(requestDto.getImageUrl()).ifPresent(this::setImageUrl); } From 9be32fc2a50ef437cb07a98bc327079e5ca2ae9f Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Mon, 30 Dec 2024 22:49:55 +0900 Subject: [PATCH 12/15] =?UTF-8?q?refactor(ExecutivePosition):=20enum=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executive/domain/ExecutivePosition.java | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java b/src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java deleted file mode 100644 index 14335556f..000000000 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/domain/ExecutivePosition.java +++ /dev/null @@ -1,16 +0,0 @@ -package page.clab.api.domain.memberManagement.executive.domain; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ExecutivePosition { - - PRESIDENT("PRESIDENT", "회장"), - VICE_PRESIDENT("VICE_PRESIDENT", "부회장"), - GENERAL("GENERAL", "일반 운영진"); - - private final String key; - private final String description; -} From 649310ba68b9dddbef6b567062d423afbbffb4b5 Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Mon, 30 Dec 2024 23:13:48 +0900 Subject: [PATCH 13/15] =?UTF-8?q?refactor(messages):=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=ED=94=84=EB=A1=9C=ED=8D=BC?= =?UTF-8?q?=ED=8B=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/request/ExecutiveRequestDto.java | 4 ++-- src/main/resources/messages.properties | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java index 459e54b4b..e566fd2f7 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java @@ -9,7 +9,7 @@ @Setter public class ExecutiveRequestDto { - @NotNull(message = "{notNull.executive.id}") + @NotNull(message = "{notNull.executive.executiveId}") @Schema(description = "학번", example = "202310000") private String executiveId; @@ -21,7 +21,7 @@ public class ExecutiveRequestDto { @Schema(description = "이메일", example = "clab.coreteam@gamil.com") private String email; - @NotNull(message = "{notNull.executive.field}") + @NotNull(message = "{notNull.executive.interests}") @Schema(description = "분야", example = "Back-End") private String interests; diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index e91ff3261..cfb1ad445 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -193,9 +193,8 @@ notNull.workExperience.companyName=회사명은 필수 입력 항목입니다. notNull.workExperience.position=직책은 필수 입력 항목입니다. notNull.workExperience.startDate=시작일은 필수 입력 항목입니다. notNull.workExperience.endDate=종료일은 필수 입력 항목입니다. -notNull.executive.id=학번은 필수 입력 항목입니다. +notNull.executive.executiveId=학번은 필수 입력 항목입니다. notNull.executive.name=이름은 필수 입력 항목입니다. notNull.executive.email=이메일은 필수 입력 항목입니다. -notNull.executive.field=분야는 필수 입력 항목입니다. -notNull.executive.position=직급은 필수 입력 항목입니다. +notNull.executive.interests=분야는 필수 입력 항목입니다. invalid.activityGroupBoard.dueDateTime=마감일자는 현재 시간 이후로 설정되어야 합니다. \ No newline at end of file From 6def65f7dd1071f61c5ffec82cd572a5a5c89439 Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Wed, 1 Jan 2025 17:16:20 +0900 Subject: [PATCH 14/15] =?UTF-8?q?refactor(ExecutiveRetrievalService):=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EC=9A=B0=EC=84=A0=EC=88=9C=EC=9C=84=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EB=A5=BC=20enum=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ExecutiveRetrievalService.java | 14 +++++++------ .../position/domain/PositionType.java | 20 ++++++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java index 4aae2ef4b..2a762d925 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/service/ExecutiveRetrievalService.java @@ -4,6 +4,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,6 +14,7 @@ import page.clab.api.domain.memberManagement.executive.application.port.in.RetrieveExecutiveUseCase; import page.clab.api.domain.memberManagement.executive.application.port.out.RetrieveExecutivePort; import page.clab.api.domain.memberManagement.executive.domain.Executive; +import page.clab.api.domain.memberManagement.position.domain.PositionType; import page.clab.api.external.memberManagement.position.application.port.ExternalRetrievePositionUseCase; @Service @@ -22,11 +24,6 @@ public class ExecutiveRetrievalService implements RetrieveExecutiveUseCase { private final RetrieveExecutivePort retrieveExecutivePort; private final ExternalRetrievePositionUseCase externalRetrievePositionUseCase; private final ExecutiveDtoMapper mapper; - private static final Map PRIORITY = Map.of( - "PRESIDENT", 1, - "VICE_PRESIDENT", 2, - "OPERATION", 3 - ); @Transactional(readOnly = true) @Override @@ -44,11 +41,16 @@ private List sortExecutives(List executives, Map - PRIORITY.getOrDefault(positionMap.get(executive.getId()), Integer.MAX_VALUE)) + getPriority(positionMap.get(executive.getId()))) .thenComparing(Executive::getId)) .toList(); } + private int getPriority(String positionKey) { + return Optional.ofNullable(PositionType.getPriorityByKey(positionKey)) + .orElse(Integer.MAX_VALUE); + } + private Map getPositionMap(List executives) { return executives.stream() .collect(Collectors.toMap( diff --git a/src/main/java/page/clab/api/domain/memberManagement/position/domain/PositionType.java b/src/main/java/page/clab/api/domain/memberManagement/position/domain/PositionType.java index 674479ddf..46062f396 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/position/domain/PositionType.java +++ b/src/main/java/page/clab/api/domain/memberManagement/position/domain/PositionType.java @@ -9,13 +9,23 @@ @AllArgsConstructor public enum PositionType { - PRESIDENT("PRESIDENT", "회장"), - VICE_PRESIDENT("VICE_PRESIDENT", "부회장"), - OPERATION("OPERATION", "운영진"), - CORE_TEAM("CORE_TEAM", "코어팀"), - MEMBER("MEMBER", "일반회원"); + PRESIDENT("PRESIDENT", "회장", 1), + VICE_PRESIDENT("VICE_PRESIDENT", "부회장", 2), + OPERATION("OPERATION", "운영진", 3), + CORE_TEAM("CORE_TEAM", "코어팀", null), + MEMBER("MEMBER", "일반회원", null); @Enumerated(EnumType.STRING) private final String key; private final String description; + private final Integer priority; + + public static Integer getPriorityByKey(String key) { + for (PositionType positionType : values()) { + if (positionType.getKey().equals(key)) { + return positionType.getPriority(); + } + } + throw new IllegalArgumentException("Invalid PositionType key: " + key); + } } From 4de063f9715cff9d90ca58ed168c86aa5ee1e565 Mon Sep 17 00:00:00 2001 From: SongJaeHoonn Date: Fri, 3 Jan 2025 14:25:57 +0900 Subject: [PATCH 15/15] =?UTF-8?q?refactor(Email):=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=98=A4=ED=83=88=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/request/ApplicationRequestDto.java | 2 +- .../executive/application/dto/request/ExecutiveRequestDto.java | 2 +- .../application/dto/request/ExecutiveUpdateRequestDto.java | 2 +- .../member/application/dto/request/MemberRequestDto.java | 2 +- .../application/dto/request/MemberResetPasswordRequestDto.java | 2 +- .../member/application/dto/request/MemberUpdateRequestDto.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/page/clab/api/domain/hiring/application/application/dto/request/ApplicationRequestDto.java b/src/main/java/page/clab/api/domain/hiring/application/application/dto/request/ApplicationRequestDto.java index a595cb8fd..67c1781aa 100644 --- a/src/main/java/page/clab/api/domain/hiring/application/application/dto/request/ApplicationRequestDto.java +++ b/src/main/java/page/clab/api/domain/hiring/application/application/dto/request/ApplicationRequestDto.java @@ -28,7 +28,7 @@ public class ApplicationRequestDto { private String contact; @NotNull(message = "{notNull.application.email}") - @Schema(description = "이메일", example = "clab.coreteam@gamil.com", required = true) + @Schema(description = "이메일", example = "clab.coreteam@gmail.com", required = true) private String email; @NotNull(message = "{notNull.application.department}") diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java index e566fd2f7..702f0c402 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveRequestDto.java @@ -18,7 +18,7 @@ public class ExecutiveRequestDto { private String name; @NotNull(message = "{notNull.executive.email}") - @Schema(description = "이메일", example = "clab.coreteam@gamil.com") + @Schema(description = "이메일", example = "clab.coreteam@gmail.com") private String email; @NotNull(message = "{notNull.executive.interests}") diff --git a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java index 00d1387ad..3a26e3580 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/executive/application/dto/request/ExecutiveUpdateRequestDto.java @@ -11,7 +11,7 @@ public class ExecutiveUpdateRequestDto { @Schema(description = "이름", example = "홍길동") private String name; - @Schema(description = "이메일", example = "clab.coreteam@gamil.com") + @Schema(description = "이메일", example = "clab.coreteam@gmail.com") private String email; @Schema(description = "분야", example = "Back-End") diff --git a/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberRequestDto.java index 7a77352d2..a3bb87f61 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberRequestDto.java @@ -27,7 +27,7 @@ public class MemberRequestDto { private String contact; @NotNull(message = "{notNull.member.email}") - @Schema(description = "이메일", example = "clab.coreteam@gamil.com", required = true) + @Schema(description = "이메일", example = "clab.coreteam@gmail.com", required = true) private String email; @NotNull(message = "{notNull.member.department}") diff --git a/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberResetPasswordRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberResetPasswordRequestDto.java index 0861d4dee..978a67fac 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberResetPasswordRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberResetPasswordRequestDto.java @@ -18,6 +18,6 @@ public class MemberResetPasswordRequestDto { private String name; @NotNull(message = "{notNull.member.email}") - @Schema(description = "이메일", example = "clab.coreteam@gamil.com", required = true) + @Schema(description = "이메일", example = "clab.coreteam@gmail.com", required = true) private String email; } diff --git a/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberUpdateRequestDto.java b/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberUpdateRequestDto.java index 04083d654..7e9f2b263 100644 --- a/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberUpdateRequestDto.java +++ b/src/main/java/page/clab/api/domain/memberManagement/member/application/dto/request/MemberUpdateRequestDto.java @@ -16,7 +16,7 @@ public class MemberUpdateRequestDto { @Schema(description = "연락처", example = "01012345678") private String contact; - @Schema(description = "이메일", example = "clab.coreteam@gamil.com") + @Schema(description = "이메일", example = "clab.coreteam@gmail.com") private String email; @Schema(description = "학년", example = "1")