diff --git a/src/main/java/org/sopt/app/application/meeting/CrewClient.java b/src/main/java/org/sopt/app/application/meeting/CrewClient.java new file mode 100644 index 00000000..b175c791 --- /dev/null +++ b/src/main/java/org/sopt/app/application/meeting/CrewClient.java @@ -0,0 +1,18 @@ +package org.sopt.app.application.meeting; + +import feign.*; +import java.util.Map; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@EnableFeignClients +public interface CrewClient { + + @RequestLine("GET /internal/meetings?orgId={playgroundId}&page={page}&take={take}&category={category}&isOnlyActiveGeneration={isOnlyActiveGeneration}") + CrewMeetingResponse getAllMeetings(@HeaderMap Map headers, + @Param("playgroundId") Long playgroundId, + @Param("page") int page, + @Param("take") int take, + @Param("category") String category, + @Param("isOnlyActiveGeneration") Boolean isOnlyActiveGeneration + ); +} diff --git a/src/main/java/org/sopt/app/application/meeting/CrewMeetingResponse.java b/src/main/java/org/sopt/app/application/meeting/CrewMeetingResponse.java new file mode 100644 index 00000000..dbfbef9d --- /dev/null +++ b/src/main/java/org/sopt/app/application/meeting/CrewMeetingResponse.java @@ -0,0 +1,20 @@ +package org.sopt.app.application.meeting; + +import java.util.List; + +public record CrewMeetingResponse( + List meetings +) { + public record CrewMeeting( + Long id, + String title, + Boolean canJoinOnlyActiveGeneration, + MeetingStatus status, + String imageUrl, + String category, + List joinableParts, + Boolean isBlockedMeeting + ){ + + } +} diff --git a/src/main/java/org/sopt/app/application/meeting/MeetingCategory.java b/src/main/java/org/sopt/app/application/meeting/MeetingCategory.java deleted file mode 100644 index a3b5f621..00000000 --- a/src/main/java/org/sopt/app/application/meeting/MeetingCategory.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.sopt.app.application.meeting; - -public enum MeetingCategory { - STUDY, - EVENT -} diff --git a/src/main/java/org/sopt/app/application/meeting/MeetingResponse.java b/src/main/java/org/sopt/app/application/meeting/MeetingResponse.java index 2d205a5d..ea53dc89 100644 --- a/src/main/java/org/sopt/app/application/meeting/MeetingResponse.java +++ b/src/main/java/org/sopt/app/application/meeting/MeetingResponse.java @@ -1,73 +1,31 @@ package org.sopt.app.application.meeting; +import java.util.List; import lombok.Builder; +import org.sopt.app.application.meeting.CrewMeetingResponse.CrewMeeting; +import org.sopt.app.domain.enums.Part; @Builder public record MeetingResponse( - Long meetingId, + Long id, String title, - MeetingCategory category, + String category, + Boolean canJoinOnlyActiveGeneration, + List joinableParts, + Boolean canJoinAllParts, MeetingStatus status, - String imageUrl, - Boolean canJoinOnlyActiveGeneration + String imageUrl ) { - @Deprecated - public static MeetingResponse eventActiveDummy(Long id) { + public static MeetingResponse of(final CrewMeeting crewMeeting) { return MeetingResponse.builder() - .meetingId(id) - .title("[35기 솝커톤] 서버 파트 신청") - .category(MeetingCategory.EVENT) - .status(MeetingStatus.ACTIVE) - .imageUrl("https://makers-web-img.s3.ap-northeast-2.amazonaws.com/meeting/2024/11/14/78d48e33-f1d7-474f-a357-117b75a8cb90.png") - .canJoinOnlyActiveGeneration(false) - .build(); - } - - @Deprecated - public static MeetingResponse studyRecruitingDummy(Long id) { - return MeetingResponse.builder() - .meetingId(id) - .title("모집중이고 활동 기수만 참여하는 스터디") - .category(MeetingCategory.STUDY) - .status(MeetingStatus.RECRUITING) - .imageUrl("https://makers-web-img.s3.ap-northeast-2.amazonaws.com/meeting/2024/11/14/78d48e33-f1d7-474f-a357-117b75a8cb90.png") - .canJoinOnlyActiveGeneration(true) - .build(); - } - - @Deprecated - public static MeetingResponse studyPreRecruitingDummy(Long id) { - return MeetingResponse.builder() - .meetingId(id) - .title("모집 이전이고 모든 기수가 참여하는 스터디") - .category(MeetingCategory.STUDY) - .status(MeetingStatus.PRE_RECRUITING) - .imageUrl("https://makers-web-img.s3.ap-northeast-2.amazonaws.com/meeting/2024/11/14/78d48e33-f1d7-474f-a357-117b75a8cb90.png") - .canJoinOnlyActiveGeneration(false) - .build(); - } - - @Deprecated - public static MeetingResponse studyClosedDummy(Long id) { - return MeetingResponse.builder() - .meetingId(id) - .title("모집이 끝나고 모든 기수가 참여하는 스터디") - .category(MeetingCategory.STUDY) - .status(MeetingStatus.CLOSED) - .imageUrl("https://makers-web-img.s3.ap-northeast-2.amazonaws.com/meeting/2024/11/14/78d48e33-f1d7-474f-a357-117b75a8cb90.png") - .canJoinOnlyActiveGeneration(false) - .build(); - } - - @Deprecated - public static MeetingResponse studyActiveDummy(Long id) { - return MeetingResponse.builder() - .meetingId(id) - .title("활동중이고 활동 기수만 참여하는 스터디") - .category(MeetingCategory.STUDY) - .status(MeetingStatus.ACTIVE) - .imageUrl("https://makers-web-img.s3.ap-northeast-2.amazonaws.com/meeting/2024/11/14/78d48e33-f1d7-474f-a357-117b75a8cb90.png") - .canJoinOnlyActiveGeneration(true) + .id(crewMeeting.id()) + .title(crewMeeting.title()) + .category(crewMeeting.category()) + .canJoinOnlyActiveGeneration(crewMeeting.canJoinOnlyActiveGeneration()) + .joinableParts(crewMeeting.joinableParts()) + .canJoinAllParts(crewMeeting.joinableParts().size() == Part.values().length) + .status(crewMeeting.status()) + .imageUrl(crewMeeting.imageUrl()) .build(); } } diff --git a/src/main/java/org/sopt/app/application/meeting/MeetingService.java b/src/main/java/org/sopt/app/application/meeting/MeetingService.java new file mode 100644 index 00000000..0d6a42af --- /dev/null +++ b/src/main/java/org/sopt/app/application/meeting/MeetingService.java @@ -0,0 +1,24 @@ +package org.sopt.app.application.meeting; + +import static org.sopt.app.application.playground.PlaygroundHeaderCreator.createAuthorizationHeaderByInternalPlaygroundToken; + +import lombok.RequiredArgsConstructor; +import org.sopt.app.presentation.home.MeetingParamRequest; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MeetingService { + private final CrewClient crewClient; + + public CrewMeetingResponse getAllMeetings(MeetingParamRequest request) { + return crewClient.getAllMeetings( + createAuthorizationHeaderByInternalPlaygroundToken(), + request.playgroundId(), + request.page(), + request.take(), + request.category(), + false + ); + } +} diff --git a/src/main/java/org/sopt/app/application/meeting/MeetingStatus.java b/src/main/java/org/sopt/app/application/meeting/MeetingStatus.java index a795d1d6..b8cd1325 100644 --- a/src/main/java/org/sopt/app/application/meeting/MeetingStatus.java +++ b/src/main/java/org/sopt/app/application/meeting/MeetingStatus.java @@ -1,8 +1,7 @@ package org.sopt.app.application.meeting; public enum MeetingStatus { - RECRUITING, - PRE_RECRUITING, - CLOSED, - ACTIVE + APPLY_ABLE, + BEFORE_START, + RECRUITMENT_COMPLETE } diff --git a/src/main/java/org/sopt/app/application/playground/PlaygroundClient.java b/src/main/java/org/sopt/app/application/playground/PlaygroundClient.java index 28f6accf..70857ba6 100755 --- a/src/main/java/org/sopt/app/application/playground/PlaygroundClient.java +++ b/src/main/java/org/sopt/app/application/playground/PlaygroundClient.java @@ -1,20 +1,14 @@ package org.sopt.app.application.playground; -import feign.HeaderMap; -import feign.Param; -import feign.RequestLine; -import java.util.List; -import java.util.Map; -import org.sopt.app.application.auth.dto.PlaygroundAuthTokenInfo.RefreshedToken; +import feign.*; +import java.util.*; import org.sopt.app.application.playground.dto.PlayGroundCoffeeChatWrapper; +import org.sopt.app.application.playground.dto.PlaygroundProfileInfo.*; +import org.sopt.app.application.auth.dto.PlaygroundAuthTokenInfo.RefreshedToken; import org.sopt.app.application.playground.dto.PlayGroundEmploymentResponse; import org.sopt.app.application.playground.dto.PlayGroundPostDetailResponse; import org.sopt.app.application.playground.dto.PlaygroundPostInfo.PlaygroundPostResponse; -import org.sopt.app.application.playground.dto.PlaygroundProfileInfo.ActiveUserIds; -import org.sopt.app.application.playground.dto.PlaygroundProfileInfo.OwnPlaygroundProfile; -import org.sopt.app.application.playground.dto.PlaygroundProfileInfo.PlaygroundMain; -import org.sopt.app.application.playground.dto.PlaygroundProfileInfo.PlaygroundProfile; import org.sopt.app.application.playground.dto.PlaygroundUserFindCondition; import org.sopt.app.application.playground.dto.RecommendedFriendInfo.PlaygroundUserIds; import org.sopt.app.presentation.auth.AppAuthRequest.*; @@ -66,7 +60,7 @@ PlayGroundEmploymentResponse getPlaygroundEmploymentPost(@HeaderMap Map headers); - + @RequestLine("GET /api/v1/community/posts/{postId}") PlayGroundPostDetailResponse getPlayGroundPostDetail(@HeaderMap Map headers, @Param Long postId); diff --git a/src/main/java/org/sopt/app/common/config/ClientConfig.java b/src/main/java/org/sopt/app/common/config/ClientConfig.java index 6a92997a..dffb6dd6 100755 --- a/src/main/java/org/sopt/app/common/config/ClientConfig.java +++ b/src/main/java/org/sopt/app/common/config/ClientConfig.java @@ -5,6 +5,7 @@ import feign.jackson.*; import feign.okhttp.OkHttpClient; import feign.slf4j.Slf4jLogger; +import org.sopt.app.application.meeting.CrewClient; import org.springframework.context.annotation.*; import org.sopt.app.application.playground.PlaygroundClient; import org.springframework.beans.factory.annotation.Value; @@ -13,9 +14,13 @@ @Configuration @EnableFeignClients public class ClientConfig { + @Value("${makers.playground.server}") private String playgroundEndPoint; + @Value("${makers.crew.server}") + private String crewEndPoint; + @Bean public PlaygroundClient playgroundClient() { return Feign.builder() @@ -27,6 +32,17 @@ public PlaygroundClient playgroundClient() { .target(PlaygroundClient.class, playgroundEndPoint); } + @Bean + public CrewClient crewClient() { + return Feign.builder() + .client(okHttpClient()) + .encoder(encoder()) + .decoder(decoder()) + .logger(new Slf4jLogger(CrewClient.class)) + .logLevel(feignLoggerLevel()) + .target(CrewClient.class, crewEndPoint); + } + @Bean public Encoder encoder() { return new JacksonEncoder(); diff --git a/src/main/java/org/sopt/app/facade/HomeFacade.java b/src/main/java/org/sopt/app/facade/HomeFacade.java index 21162b19..fa6f1ad9 100755 --- a/src/main/java/org/sopt/app/facade/HomeFacade.java +++ b/src/main/java/org/sopt/app/facade/HomeFacade.java @@ -5,17 +5,17 @@ import java.util.List; import lombok.RequiredArgsConstructor; import lombok.val; -import org.sopt.app.application.app_service.AppServiceBadgeService; -import org.sopt.app.application.app_service.AppServiceService; -import org.sopt.app.application.app_service.dto.AppServiceEntryStatusResponse; -import org.sopt.app.application.app_service.dto.AppServiceInfo; +import org.sopt.app.application.app_service.*; +import org.sopt.app.application.app_service.dto.*; import org.sopt.app.application.description.DescriptionInfo.MainDescription; import org.sopt.app.application.description.DescriptionService; import org.sopt.app.application.home.ActivityDurationCalculator; +import org.sopt.app.application.meeting.*; import org.sopt.app.application.playground.PlaygroundAuthService; import org.sopt.app.domain.entity.User; import org.sopt.app.domain.enums.UserStatus; -import org.sopt.app.presentation.home.HomeDescriptionResponse; +import org.sopt.app.presentation.home.response.HomeDescriptionResponse; +import org.sopt.app.presentation.home.MeetingParamRequest; import org.sopt.app.presentation.home.response.CoffeeChatResponse; import org.sopt.app.presentation.home.response.RecentPostsResponse; import org.sopt.app.presentation.home.response.EmploymentPostResponse; @@ -30,6 +30,7 @@ public class HomeFacade { private final PlaygroundAuthService playgroundAuthService; private final AppServiceService appServiceService; private final AppServiceBadgeService appServiceBadgeService; + private final MeetingService meetingService; @Transactional(readOnly = true) @Deprecated @@ -86,4 +87,12 @@ public List getHomeEmploymentPost(User user) { public List getCoffeeChatList(User user) { return playgroundAuthService.getCoffeeChatList(user.getPlaygroundToken()); } + + public List getAllMeetings(MeetingParamRequest request) { + return meetingService.getAllMeetings(request) + .meetings().stream() + .filter(crewMeeting -> !crewMeeting.isBlockedMeeting()) + .map(MeetingResponse::of) + .toList(); + } } diff --git a/src/main/java/org/sopt/app/presentation/home/HomeController.java b/src/main/java/org/sopt/app/presentation/home/HomeController.java index 7e7c285c..b73fc4e1 100644 --- a/src/main/java/org/sopt/app/presentation/home/HomeController.java +++ b/src/main/java/org/sopt/app/presentation/home/HomeController.java @@ -11,15 +11,10 @@ import org.sopt.app.application.meeting.MeetingResponse; import org.sopt.app.domain.entity.User; import org.sopt.app.facade.HomeFacade; -import org.sopt.app.presentation.home.response.CoffeeChatResponse; -import org.sopt.app.presentation.home.response.EmploymentPostResponse; -import org.sopt.app.presentation.home.response.RecentPostsResponse; +import org.sopt.app.presentation.home.response.*; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -103,7 +98,7 @@ public ResponseEntity> getCoffeeChatList( homeFacade.getCoffeeChatList(user) ); } - + @Operation(summary = "전체 모임 확인") @ApiResponses({ @ApiResponse(responseCode = "200", description = "success"), @@ -118,18 +113,7 @@ public ResponseEntity> getAllMeeting( @RequestParam(value = "category") final String category ) { return ResponseEntity.ok( - List.of( - MeetingResponse.eventActiveDummy(1L), - MeetingResponse.studyRecruitingDummy(2L), - MeetingResponse.studyPreRecruitingDummy(3L), - MeetingResponse.studyClosedDummy(4L), - MeetingResponse.studyActiveDummy(5L), - MeetingResponse.eventActiveDummy(6L), - MeetingResponse.studyRecruitingDummy(7L), - MeetingResponse.studyPreRecruitingDummy(8L), - MeetingResponse.studyClosedDummy(9L), - MeetingResponse.studyActiveDummy(10L) - ) + homeFacade.getAllMeetings(new MeetingParamRequest(user.getPlaygroundId(), page, take, category)) ); } } diff --git a/src/main/java/org/sopt/app/presentation/home/MeetingParamRequest.java b/src/main/java/org/sopt/app/presentation/home/MeetingParamRequest.java new file mode 100644 index 00000000..078fc15b --- /dev/null +++ b/src/main/java/org/sopt/app/presentation/home/MeetingParamRequest.java @@ -0,0 +1,10 @@ +package org.sopt.app.presentation.home; + +public record MeetingParamRequest( + Long playgroundId, + int page, + int take, + String category +) { + +} diff --git a/src/main/java/org/sopt/app/presentation/home/HomeDescriptionResponse.java b/src/main/java/org/sopt/app/presentation/home/response/HomeDescriptionResponse.java similarity index 89% rename from src/main/java/org/sopt/app/presentation/home/HomeDescriptionResponse.java rename to src/main/java/org/sopt/app/presentation/home/response/HomeDescriptionResponse.java index 0eb736f5..f80d20d1 100644 --- a/src/main/java/org/sopt/app/presentation/home/HomeDescriptionResponse.java +++ b/src/main/java/org/sopt/app/presentation/home/response/HomeDescriptionResponse.java @@ -1,4 +1,4 @@ -package org.sopt.app.presentation.home; +package org.sopt.app.presentation.home.response; import lombok.*;