Skip to content

Commit

Permalink
Merge branch 'dev' into STMT-268-get_studies_joined
Browse files Browse the repository at this point in the history
  • Loading branch information
05AM authored May 27, 2024
2 parents dc1e817 + bede893 commit ed95a5f
Show file tree
Hide file tree
Showing 41 changed files with 920 additions and 47 deletions.
33 changes: 32 additions & 1 deletion src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -457,4 +457,35 @@ include::{snippets}/create-activity/fail/not-admin/response-fields.adoc[]
====== 응답 실패 (404)
.존재하지 않는 스터디 ID를 요청한 경우
include::{snippets}/create-activity/fail/not-exists-study/response-body.adoc[]
include::{snippets}/create-activity/fail/not-exists-study/response-fields.adoc[]
include::{snippets}/create-activity/fail/not-exists-study/response-fields.adoc[]

=== 스터디 활동 단일 조회

스터디 활동을 단일 조회하는 API입니다.

==== GET /api/v1/studies/{studyId}/activities/{activityId}

===== 요청
include::{snippets}/get-activity-by-id/success/http-request.adoc[]
include::{snippets}/get-activity-by-id/success/path-parameters.adoc[]
include::{snippets}/get-activity-by-id/success/request-headers.adoc[]

===== 응답 성공 (200)
include::{snippets}/get-activity-by-id/success/response-body.adoc[]
include::{snippets}/get-activity-by-id/success/response-fields.adoc[]

===== 응답 실패(403)
.스터디의 멤버가 아닌 경우
include::{snippets}/get-activity-by-id/fail/not-joined-study/response-body.adoc[]
include::{snippets}/get-activity-by-id/fail/not-joined-study/response-fields.adoc[]

===== 응답 실패 (404)
.존재하지 않는 스터디를 전달한 경우
include::{snippets}/get-activity-by-id/fail/study-not-found/response-body.adoc[]
include::{snippets}/get-activity-by-id/fail/study-not-found/response-fields.adoc[]

.존재하지 않는 활동을 전달한 경우
include::{snippets}/get-activity-by-id/fail/activity-not-found/response-body.adoc[]
include::{snippets}/get-activity-by-id/fail/activity-not-found/response-fields.adoc[]


Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.stumeet.server.activity.adapter.in;

import com.stumeet.server.activity.adapter.in.response.ActivityDetailResponse;
import com.stumeet.server.activity.application.port.in.ActivityQueryUseCase;
import com.stumeet.server.common.annotation.WebAdapter;
import com.stumeet.server.common.auth.model.LoginMember;
import com.stumeet.server.common.model.ApiResponse;
import com.stumeet.server.common.response.SuccessCode;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@WebAdapter
@RequestMapping("/api/v1")
@RequiredArgsConstructor
public class ActivityQueryApi {

private final ActivityQueryUseCase activityQueryUseCase;

@GetMapping("/studies/{studyId}/activities/{activityId}")
public ResponseEntity<ApiResponse<ActivityDetailResponse>> getById(
@PathVariable Long studyId,
@PathVariable Long activityId,
@AuthenticationPrincipal LoginMember member
) {
ActivityDetailResponse response = activityQueryUseCase.getById(studyId, activityId, member.getId());
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponse.success(SuccessCode.GET_SUCCESS, response));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.stumeet.server.activity.adapter.in.response;

import com.querydsl.core.annotations.QueryProjection;
import lombok.Builder;

import java.time.LocalDateTime;
import java.util.List;

public record ActivityDetailResponse(
Long id,
String title,
String content,
List<ActivityImageResponse> imageUrl,
ActivityParticipantSimpleResponse author,
List<ActivityParticipantSimpleResponse> participants,
String status,
LocalDateTime startDate,
LocalDateTime endDate,
LocalDateTime createdAt

) {

@QueryProjection
@Builder
public ActivityDetailResponse {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.stumeet.server.activity.adapter.in.response;

import lombok.Builder;

public record ActivityImageResponse(
Long id,
String imageUrl
) {
@Builder
public ActivityImageResponse {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.stumeet.server.activity.adapter.in.response;

import com.querydsl.core.annotations.QueryProjection;
import lombok.Builder;

public record ActivityParticipantSimpleResponse(
Long memberId,
String name,
String profileImageUrl
) {

@QueryProjection
@Builder
public ActivityParticipantSimpleResponse {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.stumeet.server.activity.adapter.out.mapper.ActivityImagePersistenceMapper;
import com.stumeet.server.activity.adapter.out.model.ActivityImageJpaEntity;
import com.stumeet.server.activity.application.port.out.ActivityImageCreatePort;
import com.stumeet.server.activity.application.port.out.ActivityImageQueryPort;
import com.stumeet.server.activity.domain.model.ActivityImage;
import com.stumeet.server.common.annotation.PersistenceAdapter;
import lombok.RequiredArgsConstructor;
Expand All @@ -11,7 +12,7 @@

@PersistenceAdapter
@RequiredArgsConstructor
public class ActivityImagePersistenceAdapter implements ActivityImageCreatePort {
public class ActivityImagePersistenceAdapter implements ActivityImageCreatePort, ActivityImageQueryPort {

private final JpaActivityImageRepository jpaActivityImageRepository;
private final ActivityImagePersistenceMapper activityImagePersistenceMapper;
Expand All @@ -22,4 +23,11 @@ public void create(List<ActivityImage> images) {

jpaActivityImageRepository.saveAll(entities);
}

@Override
public List<ActivityImage> findAllByActivityId(Long activityId) {
return jpaActivityImageRepository.findAllByActivityId(activityId).stream()
.map(activityImagePersistenceMapper::toDomain)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.stumeet.server.activity.adapter.out.mapper.ActivityParticipantPersistenceMapper;
import com.stumeet.server.activity.adapter.out.model.ActivityParticipantJpaEntity;
import com.stumeet.server.activity.application.port.out.ActivityParticipantCreatePort;
import com.stumeet.server.activity.application.port.out.ActivityParticipantQueryPort;
import com.stumeet.server.activity.domain.model.ActivityParticipant;
import com.stumeet.server.common.annotation.PersistenceAdapter;
import lombok.RequiredArgsConstructor;
Expand All @@ -11,7 +12,7 @@

@PersistenceAdapter
@RequiredArgsConstructor
public class ActivityParticipantPersistenceAdapter implements ActivityParticipantCreatePort {
public class ActivityParticipantPersistenceAdapter implements ActivityParticipantCreatePort, ActivityParticipantQueryPort {

private final JpaActivityParticipantRepository jpaActivityParticipantRepository;
private final ActivityParticipantPersistenceMapper activityParticipantPersistenceMapper;
Expand All @@ -23,4 +24,12 @@ public void create(List<ActivityParticipant> participants) {

jpaActivityParticipantRepository.saveAll(entities);
}

@Override
public List<ActivityParticipant> findAllByActivityId(Long activityId) {
return jpaActivityParticipantRepository.findAllByActivityId(activityId).stream()
.map(activityParticipantPersistenceMapper::toDomain)
.toList();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import com.stumeet.server.activity.adapter.out.mapper.ActivityPersistenceMapper;
import com.stumeet.server.activity.adapter.out.model.ActivityJpaEntity;
import com.stumeet.server.activity.application.port.out.ActivityCreatePort;
import com.stumeet.server.activity.application.port.out.ActivityQueryPort;
import com.stumeet.server.activity.domain.exception.NotExistsActivityException;
import com.stumeet.server.activity.domain.model.Activity;
import com.stumeet.server.common.annotation.PersistenceAdapter;
import lombok.RequiredArgsConstructor;

@PersistenceAdapter
@RequiredArgsConstructor
public class ActivityPersistenceAdapter implements ActivityCreatePort {
public class ActivityPersistenceAdapter implements ActivityCreatePort, ActivityQueryPort {

private final JpaActivityRepository jpaActivityRepository;
private final ActivityPersistenceMapper activityPersistenceMapper;
Expand All @@ -20,4 +22,12 @@ public Activity create(Activity activity) {

return activityPersistenceMapper.toDomain(jpaActivityRepository.save(entity));
}

@Override
public Activity getById(Long memberId, Long activityId) {
ActivityJpaEntity activityJpaEntity = jpaActivityRepository.findById(activityId)
.orElseThrow(() -> new NotExistsActivityException(activityId));

return activityPersistenceMapper.toDomain(activityJpaEntity);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,8 @@
import com.stumeet.server.activity.adapter.out.model.ActivityImageJpaEntity;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface JpaActivityImageRepository extends JpaRepository<ActivityImageJpaEntity, Long> {
List<ActivityImageJpaEntity> findAllByActivityId(Long activityId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,8 @@
import com.stumeet.server.activity.adapter.out.model.ActivityParticipantJpaEntity;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface JpaActivityParticipantRepository extends JpaRepository<ActivityParticipantJpaEntity, Long> {
List<ActivityParticipantJpaEntity> findAllByActivityId(Long activityId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stumeet.server.activity.application.port.in;

import com.stumeet.server.activity.domain.model.ActivityImage;

import java.util.List;

public interface ActivityImageQuery {
List<ActivityImage> findAllByActivityId(Long activityId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stumeet.server.activity.application.port.in;

import com.stumeet.server.activity.domain.model.ActivityParticipant;

import java.util.List;

public interface ActivityParticipantQuery {
List<ActivityParticipant> findAllByActivityId(Long activityId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.stumeet.server.activity.application.port.in;

import com.stumeet.server.activity.adapter.in.response.ActivityDetailResponse;

public interface ActivityQueryUseCase {
ActivityDetailResponse getById(Long studyId, Long activityId, Long memberId);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.stumeet.server.activity.application.port.in.mapper;

import com.stumeet.server.activity.adapter.in.response.ActivityImageResponse;
import com.stumeet.server.activity.domain.model.Activity;
import com.stumeet.server.activity.domain.model.ActivityImage;
import org.springframework.stereotype.Component;
Expand All @@ -16,9 +17,19 @@ public ActivityImage toDomain(String image, Activity activity) {
.build();

}

public List<ActivityImage> toDomains(List<String> images, Activity activity) {
return images.stream()
.map(image -> toDomain(image, activity))
.toList();
}

public List<ActivityImageResponse> toResponses(List<ActivityImage> activityImages) {
return activityImages.stream()
.map(activityImage -> ActivityImageResponse.builder()
.id(activityImage.getId())
.imageUrl(activityImage.getUrl())
.build())
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.stumeet.server.activity.application.port.in.mapper;

import com.stumeet.server.activity.adapter.in.response.ActivityParticipantSimpleResponse;
import com.stumeet.server.activity.domain.model.Activity;
import com.stumeet.server.activity.domain.model.ActivityMember;
import com.stumeet.server.activity.domain.model.ActivityParticipant;
Expand All @@ -26,4 +27,19 @@ public List<ActivityParticipant> toDomains(List<Long> participants, Activity act
.map(participant -> toDomain(participant, activity))
.toList();
}

public ActivityParticipantSimpleResponse toResponse(ActivityMember member) {
return ActivityParticipantSimpleResponse.builder()
.memberId(member.getId())
.name(member.getName())
.profileImageUrl(member.getImage())
.build();
}

public List<ActivityParticipantSimpleResponse> toResponses(List<ActivityParticipant> participants) {
return participants.stream()
.map(participant -> toResponse(participant.getMember()))
.toList();
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package com.stumeet.server.activity.application.port.in.mapper;


import com.stumeet.server.activity.application.service.model.ActivityCreateSource;
import com.stumeet.server.activity.adapter.in.response.ActivityDetailResponse;
import com.stumeet.server.activity.adapter.in.response.ActivityImageResponse;
import com.stumeet.server.activity.adapter.in.response.ActivityParticipantSimpleResponse;
import com.stumeet.server.activity.application.port.in.command.ActivityCreateCommand;
import com.stumeet.server.activity.application.service.model.ActivityCreateSource;
import com.stumeet.server.activity.domain.model.Activity;
import com.stumeet.server.activity.domain.model.ActivityCategory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

@Component
@RequiredArgsConstructor
public class ActivityUseCaseMapper {

public ActivityCreateSource toSource(Long studyId, ActivityCreateCommand command, Long id) {
Expand All @@ -28,4 +35,25 @@ public ActivityCreateSource toSource(Long studyId, ActivityCreateCommand command
.location(command.location())
.build();
}

public ActivityDetailResponse toDetailResponse(
Activity activity,
List<ActivityImageResponse> activityImages,
ActivityParticipantSimpleResponse author,
List<ActivityParticipantSimpleResponse> participants,
String status
) {
return ActivityDetailResponse.builder()
.id(activity.getId())
.title(activity.getTitle())
.content(activity.getContent())
.imageUrl(activityImages)
.author(author)
.participants(participants)
.status(status)
.startDate(activity.getStartDate())
.endDate(activity.getEndDate())
.createdAt(activity.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stumeet.server.activity.application.port.out;

import com.stumeet.server.activity.domain.model.ActivityImage;

import java.util.List;

public interface ActivityImageQueryPort {
List<ActivityImage> findAllByActivityId(Long activityId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stumeet.server.activity.application.port.out;

import com.stumeet.server.activity.domain.model.ActivityParticipant;

import java.util.List;

public interface ActivityParticipantQueryPort {
List<ActivityParticipant> findAllByActivityId(Long activityId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.stumeet.server.activity.application.port.out;

import com.stumeet.server.activity.domain.model.Activity;

public interface ActivityQueryPort {
Activity getById(Long studyId, Long activityId);
}
Loading

0 comments on commit ed95a5f

Please sign in to comment.