diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java index 1d195c1d..9b9f18ed 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [작업 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements") diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/DeleteCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteCategoryController.java index e377c7da..a44bc68e 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/DeleteCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteCategoryController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [작업 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements") diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java index 55f36924..e65e180f 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [회원 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements") diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindDepartmentController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindDepartmentController.java index cf6b6fab..e9c489da 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindDepartmentController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindDepartmentController.java @@ -13,7 +13,7 @@ import java.util.List; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [회원 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements") diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java index 18d1afe7..1514177f 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java @@ -5,6 +5,7 @@ import clap.server.adapter.inbound.web.dto.common.PageResponse; import clap.server.application.port.inbound.admin.FindMembersWithFilterUsecase; +import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -16,7 +17,8 @@ import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.*; -@RestController +@Tag(name = "05. Admin [회원 관리]") +@WebAdapter @RequestMapping("/api/managements") @RequiredArgsConstructor public class FindMemberController { diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/ManageMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/ManageMemberController.java index 6684071c..4535fcbe 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/ManageMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/ManageMemberController.java @@ -2,32 +2,41 @@ import clap.server.adapter.inbound.security.service.SecurityUserDetails; import clap.server.adapter.inbound.web.dto.admin.request.UpdateMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.response.MemberDetailsResponse; +import clap.server.application.port.inbound.admin.MemberDetailUsecase; import clap.server.application.port.inbound.admin.UpdateMemberUsecase; import clap.server.common.annotation.architecture.WebAdapter; 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.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.PathVariable; -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.*; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [회원 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements/members") public class ManageMemberController { private final UpdateMemberUsecase updateMemberUsecase; + private final MemberDetailUsecase memberDetailUsecase; @Operation(summary = "회원 정보 수정 API") @PostMapping("/{memberId}") @Secured("ROLE_ADMIN") public void registerMember(@AuthenticationPrincipal SecurityUserDetails userInfo, @PathVariable Long memberId, - @RequestBody @Valid UpdateMemberRequest request){ + @RequestBody @Valid UpdateMemberRequest request) { updateMemberUsecase.updateMemberInfo(userInfo.getUserId(), memberId, request); } + + @Operation(summary = "회원 상세 정보 조회 API") + @GetMapping("/{memberId}/details") + @Secured("ROLE_ADMIN") + public ResponseEntity getMemberDetail(@AuthenticationPrincipal SecurityUserDetails userInfo, + @PathVariable Long memberId) { + return ResponseEntity.ok(memberDetailUsecase.getMemberDetail(memberId)); + } } diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java b/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java index 0a6451f8..359581f0 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java @@ -17,7 +17,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [작업 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements/labels") diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberController.java index 017b6f98..da512a91 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberController.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [회원 관리]") @WebAdapter @RequestMapping("/api/managements") @RequiredArgsConstructor diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java b/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java index 9dd219e9..41a57546 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java @@ -19,7 +19,7 @@ import java.io.IOException; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [회원 관리]") @WebAdapter @RequestMapping("/api/managements") public class RegisterMemberCsvController { diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/SendInvitationController.java b/src/main/java/clap/server/adapter/inbound/web/admin/SendInvitationController.java index 36cb4040..e7c26276 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/SendInvitationController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/SendInvitationController.java @@ -10,7 +10,7 @@ import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.*; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [회원 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements") diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java index 3bf301ba..ce967a93 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@Tag(name = "05. Admin") +@Tag(name = "05. Admin [작업 관리]") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/managements") diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/MemberDetailsResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/MemberDetailsResponse.java new file mode 100644 index 00000000..d6c1cda3 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/MemberDetailsResponse.java @@ -0,0 +1,26 @@ +package clap.server.adapter.inbound.web.dto.admin.response; + +import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record MemberDetailsResponse( + String profileImageUrl, + @Schema(description = "회원 이름", example = "서주원") + String name, + @Schema(description = "회원 아이디", example = "siena.it") + String nicknanme, + @Schema(description = "회원 이메일", example = "siena.it@gmail.com") + String email, + @Schema(description = "승인 권한 여부") + Boolean isReviewer, + @Schema(description = "회원 역할") + MemberRole role, + @NotNull @Schema(description = "부서 ID") + Long departmentId, + @Schema(description = "부서") + String departmentName, + @Schema(description = "직무") + String departmentRole +) {} + \ No newline at end of file diff --git a/src/main/java/clap/server/application/mapper/MemberResponseMapper.java b/src/main/java/clap/server/application/mapper/MemberResponseMapper.java index 4eed787e..67e9ceba 100644 --- a/src/main/java/clap/server/application/mapper/MemberResponseMapper.java +++ b/src/main/java/clap/server/application/mapper/MemberResponseMapper.java @@ -1,6 +1,7 @@ package clap.server.application.mapper; +import clap.server.adapter.inbound.web.dto.admin.response.MemberDetailsResponse; import clap.server.adapter.inbound.web.dto.member.response.MemberDetailInfoResponse; import clap.server.adapter.inbound.web.dto.member.response.MemberProfileResponse; import clap.server.domain.model.member.Member; @@ -56,4 +57,18 @@ public static Member toMember(MemberInfo memberInfo) { .build(); } + public static MemberDetailsResponse toMemberDetailsResponse(Member member) { + return new MemberDetailsResponse( + member.getImageUrl(), + member.getMemberInfo().getName(), + member.getMemberInfo().getNickname(), + member.getImageUrl(), + member.isReviewer(), + member.getMemberInfo().getRole(), + member.getMemberInfo().getDepartment().getDepartmentId(), + member.getMemberInfo().getDepartment().getName(), + member.getMemberInfo().getDepartmentRole() + ); + } + } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/inbound/admin/MemberDetailUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/MemberDetailUsecase.java new file mode 100644 index 00000000..220bb0a7 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/admin/MemberDetailUsecase.java @@ -0,0 +1,7 @@ +package clap.server.application.port.inbound.admin; + +import clap.server.adapter.inbound.web.dto.admin.response.MemberDetailsResponse; + +public interface MemberDetailUsecase { + MemberDetailsResponse getMemberDetail(Long memberId); +} \ No newline at end of file diff --git a/src/main/java/clap/server/application/service/admin/UpdateMemberService.java b/src/main/java/clap/server/application/service/admin/ManageMemberService.java similarity index 74% rename from src/main/java/clap/server/application/service/admin/UpdateMemberService.java rename to src/main/java/clap/server/application/service/admin/ManageMemberService.java index 06237a3f..28b9b010 100644 --- a/src/main/java/clap/server/application/service/admin/UpdateMemberService.java +++ b/src/main/java/clap/server/application/service/admin/ManageMemberService.java @@ -1,6 +1,9 @@ package clap.server.application.service.admin; import clap.server.adapter.inbound.web.dto.admin.request.UpdateMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.response.MemberDetailsResponse; +import clap.server.application.mapper.MemberResponseMapper; +import clap.server.application.port.inbound.admin.MemberDetailUsecase; import clap.server.application.port.inbound.admin.UpdateMemberUsecase; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.outbound.member.CommandMemberPort; @@ -15,13 +18,13 @@ @ApplicationService @RequiredArgsConstructor -@Transactional -class UpdateMemberService implements UpdateMemberUsecase { +class ManageMemberService implements UpdateMemberUsecase, MemberDetailUsecase { private final MemberService memberService; private final CommandMemberPort commandMemberPort; private final LoadDepartmentPort loadDepartmentPort; @Override + @Transactional public void updateMemberInfo(Long adminId, Long memberId, UpdateMemberRequest request) { Member member = memberService.findActiveMember(memberId); Department department = loadDepartmentPort.findById(request.departmentId()).orElseThrow(() -> @@ -33,4 +36,11 @@ public void updateMemberInfo(Long adminId, Long memberId, UpdateMemberRequest re department, request.role(), request.departmentRole()); commandMemberPort.save(member); } + + @Override + @Transactional(readOnly = true) + public MemberDetailsResponse getMemberDetail(Long memberId) { + Member member = memberService.findActiveMember(memberId); + return MemberResponseMapper.toMemberDetailsResponse(member); + } }