diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/dto/response/OrgResponse.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/dto/response/OrgResponse.java index e9cfe5d..f87b707 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/dto/response/OrgResponse.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/dto/response/OrgResponse.java @@ -1,5 +1,7 @@ package com.whereyouad.WhereYouAd.domains.organization.application.dto.response; +import com.whereyouad.WhereYouAd.domains.organization.domain.constant.OrgRole; + import java.time.LocalDateTime; import java.util.List; @@ -10,8 +12,28 @@ public record Create( LocalDateTime createdAt ) {} - public record Read ( - //TODO + //내 조직 정보 조회를 위한 간략화된 조직 정보 DTO + public record SimpleInfo( + Long orgId, + String name, + String description, + String logoUrl, + OrgRole myRole + ) {} + + //내 조직 정보는 SimpleInfo 를 List 로 반환 + //MyOrganization DTO 내부에 SimpleInfo DTO 가 여러개 포함 + public record MyOrganizations( + List organizations + ) {} + + //하나의 조직 세부 정보 반환 DTO + public record OrgDetail ( + Long orgId, + String name, + String description, + String logoUrl, + LocalDateTime createdAt ) {} public record Update ( diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/mapper/OrgConverter.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/mapper/OrgConverter.java index f8dc294..4b47751 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/mapper/OrgConverter.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/application/mapper/OrgConverter.java @@ -28,6 +28,33 @@ public static OrgResponse.Delete toRestoredResponse(Organization organization) { "해당 조직이 활성화 되었습니다"); } + public static OrgResponse.MyOrganizations toMyOrganizations(List infos) { + return new OrgResponse.MyOrganizations( + infos + ); + } + + public static OrgResponse.OrgDetail toOrgDetail(Organization organization) { + return new OrgResponse.OrgDetail(organization.getId(), + organization.getName(), + organization.getDescription(), + organization.getLogoUrl(), + organization.getCreatedAt() + ); + } + + public static OrgResponse.SimpleInfo toOrgSimpleInfo(OrgMember orgMember) { + //OrgMember 내부에 존재하는 Role 활용 + Organization organization = orgMember.getOrganization(); + + return new OrgResponse.SimpleInfo(organization.getId(), + organization.getName(), + organization.getDescription(), + organization.getLogoUrl(), + orgMember.getRole() + ); + } + //DTO -> Entity public static Organization toOrganization(Long userId, OrgRequest.Create request) { return Organization.builder() diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgService.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgService.java index 052c1d1..0a82d83 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgService.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgService.java @@ -7,7 +7,9 @@ public interface OrgService { OrgResponse.Create createOrganization(Long userId, OrgRequest.Create request); - OrgResponse.Read getOrganization(Long userId); + OrgResponse.MyOrganizations getMyOrganizations(Long userId); + + OrgResponse.OrgDetail getOrganizationDetail(Long orgId); OrgResponse.Update modifyOrganization(Long userId, Long orgId, OrgRequest.Update request); diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgServiceImpl.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgServiceImpl.java index e6db79b..c152534 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgServiceImpl.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/domain/service/OrgServiceImpl.java @@ -59,9 +59,33 @@ public OrgResponse.Create createOrganization(Long userId, OrgRequest.Create requ return OrgConverter.toCreatedResponse(organization); } - public OrgResponse.Read getOrganization(Long userId) { - //TODO - return null; + //로그인한 회원이 속한 조직 모두 조회 메서드 + public OrgResponse.MyOrganizations getMyOrganizations(Long userId) { + //회원 id 로 OrgMember 모두 조회 -> DB 조회에서 OrgStatus.ACTIVE 인 Organization 만 포함하는 OrgMember 만 조회해 온다. + List orgMembers = orgMemberRepository.findOrgMemberByUserId(userId); + + //각각의 OrgMember 에서 SimpleInfo DTO 로 매핑 + List infos = orgMembers.stream() + .map(OrgConverter::toOrgSimpleInfo) + .toList(); + + //마지막 반환 DTO 로 변환 + return OrgConverter.toMyOrganizations(infos); + } + + //하나의 조직에 대한 세부 사항(ID, 이름, 설명, logoUrl, createdAt) + public OrgResponse.OrgDetail getOrganizationDetail(Long orgId) { + //해당 조직 id 로 Organization 조회 + Organization organization = orgRepository.findById(orgId) + .orElseThrow(() -> new OrgHandler(OrgErrorCode.ORG_NOT_FOUND)); + + //Soft Delete 된 조직이면 예외처리 + if (organization.getStatus() == OrgStatus.DELETED) { + throw new OrgHandler(OrgErrorCode.ORG_SOFT_DELETED); + } + + //DTO 로 변환 + return OrgConverter.toOrgDetail(organization); } //조직 정보 수정 메서드 diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/exception/code/OrgErrorCode.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/exception/code/OrgErrorCode.java index 1204834..af64560 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/exception/code/OrgErrorCode.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/exception/code/OrgErrorCode.java @@ -18,7 +18,11 @@ public enum OrgErrorCode implements BaseErrorCode { ORG_NOT_FOUND(HttpStatus.NOT_FOUND, "ORG_404_1", "해당 id 의 조직이 존재하지 않습니다."), //409 - ORG_ALREADY_ACTIVE(HttpStatus.CONFLICT, "ORG_409_1", "해당 조직은 이미 활성화 상태 입니다.") + ORG_ALREADY_ACTIVE(HttpStatus.CONFLICT, "ORG_409_1", "해당 조직은 이미 활성화 상태 입니다."), + + + //410 + ORG_SOFT_DELETED(HttpStatus.GONE, "ORG_410_1", "해당 조직은 삭제된 조직입니다.(Soft Delete)"), ; private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/persistence/repository/OrgMemberRepository.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/persistence/repository/OrgMemberRepository.java index 5324f89..a93ea9e 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/persistence/repository/OrgMemberRepository.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/persistence/repository/OrgMemberRepository.java @@ -17,6 +17,10 @@ public interface OrgMemberRepository extends JpaRepository { //User 가 가진 OrgMember 모두 추출하는 메서드 List findOrgMemberByUser(User user); + //userId 를 통해 OrgMember 추출 -> Organization 의 status 가 ACTIVE 인 경우에만 조회 + @Query(value = "select om from OrgMember om join fetch om.organization o where om.user.id = :userId and o.status = 'ACTIVE'") + List findOrgMemberByUserId(@Param("userId") Long userId); + //특정 Organization 에 속한 OrgMember 모두 추출하는 메서드 @Query("select om from OrgMember om where om.organization = :organization") List findOrgMemberByOrg(@Param(value = "organization") Organization organization); diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/OrgController.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/OrgController.java index eeeec47..89c940a 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/OrgController.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/OrgController.java @@ -6,7 +6,6 @@ import com.whereyouad.WhereYouAd.domains.organization.domain.service.OrgService; import com.whereyouad.WhereYouAd.domains.organization.presentation.docs.OrgControllerDocs; import com.whereyouad.WhereYouAd.global.response.DataResponse; -import io.swagger.v3.oas.annotations.Hidden; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -32,12 +31,23 @@ public ResponseEntity> createOrganization( ); } - @Hidden - @GetMapping("/read") - public ResponseEntity> getOrganizations( + @GetMapping("/my") + public ResponseEntity> getMyOrganizations( @AuthenticationPrincipal(expression = "userId") Long userId - ) { - OrgResponse.Read response = orgService.getOrganization(userId); + ) + { + OrgResponse.MyOrganizations response = orgService.getMyOrganizations(userId); + + return ResponseEntity.ok( + DataResponse.from(response) + ); + } + + @GetMapping("/{orgId}") + public ResponseEntity> getOrganizationDetail(@PathVariable Long orgId) + { + OrgResponse.OrgDetail response = orgService.getOrganizationDetail(orgId); + return ResponseEntity.ok( DataResponse.from(response) ); diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/docs/OrgControllerDocs.java b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/docs/OrgControllerDocs.java index 1e7fca9..72c09a5 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/docs/OrgControllerDocs.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/organization/presentation/docs/OrgControllerDocs.java @@ -23,6 +23,29 @@ public interface OrgControllerDocs { public ResponseEntity> createOrganization(@AuthenticationPrincipal(expression = "userId") Long userId, @RequestBody @Valid OrgRequest.Create request); + @Operation( + summary = "내가 속한 조직 전체 조회 API", + description = "로그인한 회원이 속한 조직들의 DB id, 이름, 설명, 로고URL, 내 역할(ADMIN/MEMBER) 을 반환" + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse(responseCode = "401_3", description = "토큰 없이 접근 시 실패") + }) + public ResponseEntity> getMyOrganizations( + @AuthenticationPrincipal(expression = "userId") Long userId); + + @Operation( + summary = "조직 하나의 세부정보 조회 API", + description = "조직 id 를 param 으로 받아 해당 조직의 id, 이름, 설명, 로고URL, 조직 생성 시각 반환" + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse(responseCode = "404_1", description = "해당 id 값 조직 존재 X"), + @ApiResponse(responseCode = "410_1", description = "해당 조직은 삭제되었습니다 (Soft Delete)") + }) + public ResponseEntity> getOrganizationDetail(@PathVariable Long orgId); + + @Operation( summary = "조직 정보 수정 API", description = "새로운 조직 이름, 설명, 로고 이미지 URL 을 받아 저장(해당 조직을 생성한 회원만 정보 변경 가능)"