Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/main/java/com/retrip/crew/application/in/CrewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
import com.retrip.crew.domain.vo.IntroductionTitle;
import com.retrip.crew.infra.adapter.in.presentation.rest.common.ScrollPageResponse;
import com.retrip.crew.infra.util.PaginationUtils;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import java.util.UUID;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
Expand Down Expand Up @@ -163,8 +163,10 @@ private Demand findDemandByIdAndCrewId(UUID demandId, UUID crewId) {

@Override
@Transactional(readOnly = true)
public ScrollPageResponse<CrewListResponse> getCrews(Pageable pageable, String keyword, CrewOrder order, String sort) {
Pageable orderPageable = PaginationUtils.createPageRequest(pageable, order.getField(), sort);
public ScrollPageResponse<CrewListResponse> getCrews(
Pageable pageable, String keyword, CrewOrder order, String sort) {
Pageable orderPageable =
PaginationUtils.createPageRequest(pageable, order.getField(), sort);
Slice<CrewListResponse> result = crewQueryRepository.getCrews(orderPageable, keyword);
Long totalCount = crewQueryRepository.getCrewCount(keyword);
return ScrollPageResponse.of(totalCount, result.hasNext(), result.getContent());
Expand Down
86 changes: 86 additions & 0 deletions src/main/java/com/retrip/crew/application/in/PostService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.retrip.crew.application.in;

import com.retrip.crew.application.in.request.CreatePostRequest;
import com.retrip.crew.application.in.request.PostOrder;
import com.retrip.crew.application.in.request.UpdatePostRequest;
import com.retrip.crew.application.in.response.CreatePostResponse;
import com.retrip.crew.application.in.response.DeletePostResponse;
import com.retrip.crew.application.in.response.PostResponse;
import com.retrip.crew.application.in.response.UpdatePostResponse;
import com.retrip.crew.application.in.usecase.GetPostUseCase;
import com.retrip.crew.application.in.usecase.ManagePostUseCase;
import com.retrip.crew.application.out.repository.CrewMemberQueryRepository;
import com.retrip.crew.application.out.repository.CrewQueryRepository;
import com.retrip.crew.application.out.repository.PostQueryRepository;
import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.CrewMember;
import com.retrip.crew.domain.entity.Post;
import com.retrip.crew.domain.exception.CrewMemberNotFoundException;

import com.retrip.crew.domain.exception.CrewNotFoundException;
import com.retrip.crew.infra.adapter.in.presentation.rest.common.ScrollPageResponse;
import com.retrip.crew.infra.util.PaginationUtils;

import lombok.RequiredArgsConstructor;

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

@Service
@Transactional
@RequiredArgsConstructor
public class PostService implements ManagePostUseCase, GetPostUseCase {
private final CrewQueryRepository crewQueryRepository;
private final CrewMemberQueryRepository crewMemberQueryRepository;
private final PostQueryRepository postQueryRepository;

@Override
public CreatePostResponse createPost(UUID crewId, CreatePostRequest request) {
Crew crew =
crewQueryRepository
.findByIdWithPosts(crewId)
.orElseThrow(CrewNotFoundException::new);
Post post = request.to(crew);
crew.getPosts().add(post);
return CreatePostResponse.of(post);
}

@Override
public UpdatePostResponse updatePost(UUID crewId, UUID postId, UpdatePostRequest request) {
Crew crew =
crewQueryRepository
.findByIdWithPosts(crewId)
.orElseThrow(CrewNotFoundException::new);
Post post = crew.getPosts().updatePost(postId, request.title(), request.content(), request.memberId());
return UpdatePostResponse.of(post);
}

@Override
public void deletePost(UUID crewId, UUID postId, UUID memberId) {
Crew crew =
crewQueryRepository
.findByIdWithPosts(crewId)
.orElseThrow(CrewNotFoundException::new);
CrewMember crewMember = findCrewMemberByMemberId(crewId, memberId);
crew.getPosts().deletePost(postId, crewMember);
}

private CrewMember findCrewMemberByMemberId(UUID crewId, UUID memberId) {
return crewMemberQueryRepository
.findCrewMemberByMemberId(crewId, memberId)
.orElseThrow(CrewMemberNotFoundException::new);
}

@Override
public ScrollPageResponse<PostResponse> getPosts(UUID crewId, Pageable page, String keyword, PostOrder order, String sort) {
Pageable orderPageable =
PaginationUtils.createPageRequest(page, order.getField(), sort);
Slice<PostResponse> result = postQueryRepository.findPosts(crewId, orderPageable, keyword);
Long totalCount = postQueryRepository.getPostCount(crewId, keyword);
return ScrollPageResponse.of(totalCount, result.hasNext(), result.getContent());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.retrip.crew.application.in.request;

import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.Post;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;


@Schema(description = "자유 게시글 생성 Request")
public record CreatePostRequest(
@Schema(description = "게시글 제목")
@Size(min = 1, max = 30)
String title,

@Schema(description = "게시글 내용")
@Size(min = 1, max = 500)
String content
) {

public Post to(Crew crew) {
return Post.create(title, content, crew);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.retrip.crew.application.in.request;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum PostOrder {
DATE("createdAt");

private final String field;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.retrip.crew.application.in.request;

import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.Post;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

import java.util.UUID;


@Schema(description = "자유 게시글 생성 Request")
public record UpdatePostRequest(
@Schema(description = "게시글 제목")
@Size(min = 1, max = 30)
String title,

@Schema(description = "게시글 내용")
@Size(min = 1, max = 500)
String content,

@Schema(description = "수정자")
@NotNull
UUID memberId
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.Post;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

public record CreatePostResponse(
@Schema(description = "자유 게시글 ID")
UUID id,

@Schema(description = "작성자")
UUID createAt,

@Schema(description = "게시글 제목")
String title,

@Schema(description = "게시글 내용")
String content
) {
public static CreatePostResponse of(Post post) {
return new CreatePostResponse(
post.getId(),
UUID.randomUUID(), //todo: CreateAt 생성시, 변경 예정
post.getTitle().getValue(),
post.getContent().getValue()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Post;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

public record DeletePostResponse(
@Schema(description = "자유 게시글 ID")
UUID id
) {
public static DeletePostResponse of(UUID id) {
return new DeletePostResponse(
id
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.retrip.crew.application.in.response;

import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

@Schema(description = "자유 게시글 조회 Response")
public record PostResponse(
@Schema(description = "자유 게시글 Id") UUID id,
@Schema(description = "자유 게시글 Title") String title,
@Schema(description = "자유 게시글 Contents") String Contents) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Post;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

public record UpdatePostResponse(
@Schema(description = "자유 게시글 ID")
UUID id,

@Schema(description = "작성자")
UUID createAt,

@Schema(description = "게시글 제목")
String title,

@Schema(description = "게시글 내용")
String content
) {
public static UpdatePostResponse of(Post post) {
return new UpdatePostResponse(
post.getId(),
UUID.randomUUID(), //todo: CreateAt 생성시, 변경 예정
post.getTitle().getValue(),
post.getContent().getValue()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.retrip.crew.application.in.usecase;

import com.retrip.crew.application.in.request.PostOrder;
import com.retrip.crew.application.in.response.PostResponse;

import com.retrip.crew.infra.adapter.in.presentation.rest.common.ScrollPageResponse;

import java.util.UUID;

import org.springframework.data.domain.Pageable;

public interface GetPostUseCase {

ScrollPageResponse<PostResponse> getPosts(UUID crewId, Pageable page, String keyword, PostOrder order, String sort);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import com.retrip.crew.application.in.response.crew.CrewCreateResponse;
import com.retrip.crew.application.in.response.crew.CrewUpdateResponse;

import com.retrip.crew.domain.entity.Crew;

import java.util.UUID;

public interface ManageCrewUseCase {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.retrip.crew.application.in.usecase;

import com.retrip.crew.application.in.request.CreatePostRequest;
import com.retrip.crew.application.in.request.UpdatePostRequest;
import com.retrip.crew.application.in.response.CreatePostResponse;

import com.retrip.crew.application.in.response.DeletePostResponse;

import com.retrip.crew.application.in.response.PostResponse;
import com.retrip.crew.application.in.response.UpdatePostResponse;

import java.util.UUID;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface ManagePostUseCase {
CreatePostResponse createPost(UUID crewId, CreatePostRequest request);

UpdatePostResponse updatePost(UUID crewId, UUID postId, UpdatePostRequest request);

void deletePost(UUID crewId, UUID postId, UUID memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.retrip.crew.application.out.repository;

import com.retrip.crew.domain.entity.CrewMember;

import java.util.Optional;
import java.util.UUID;

public interface CrewMemberQueryRepository {
Optional<CrewMember> findCrewMemberByMemberId(UUID crewId, UUID userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.retrip.crew.application.in.response.crew.CrewListResponse;
import com.retrip.crew.application.in.response.demand.CrewsOfDemandResponse;
import com.retrip.crew.domain.entity.Crew;
import java.util.Optional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
Expand All @@ -11,6 +13,6 @@
public interface CrewQueryRepository {
Slice<CrewListResponse> getCrews(Pageable pageable, String keyword);
Long getCrewCount(String keyword);

Optional<Crew> findByIdWithPosts(UUID id);
Page<CrewsOfDemandResponse> findAllContainsMember(Pageable pageable, UUID memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.retrip.crew.application.out.repository;

import com.retrip.crew.application.in.response.PostResponse;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.UUID;

import org.springframework.data.domain.Slice;

public interface PostQueryRepository {
Slice<PostResponse> findPosts(UUID crewId, Pageable page, String keyword);

Long getPostCount(UUID crewId, String keyword);
}
2 changes: 2 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/BaseEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass
public abstract class BaseEntity {
@CreatedDate
Expand Down
Loading