Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public class PostAdminFacade {
private final PostQueryService postQueryService;
private final PostSchedulingService postSchedulingService;

public PostPersistResponse createPost(PostRequest request) {
Long id = postCommandService.createPost(request.title(), request.content(), request.category());
public PostPersistResponse createPost(Long fileId, PostRequest request) {
Long id = postCommandService.createPost(request.title(), request.content(), request.category(), fileId);
return PostPersistResponse.from(id);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package kgu.developers.admin.post.presentation;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand All @@ -15,6 +11,10 @@
import jakarta.validation.constraints.Positive;
import kgu.developers.admin.post.presentation.request.PostRequest;
import kgu.developers.admin.post.presentation.response.PostPersistResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

@Tag(name = "Post", description = "게시글 관리자 API")
public interface PostAdminController {
Expand All @@ -27,6 +27,10 @@ public interface PostAdminController {
responseCode = "201",
content = @Content(schema = @Schema(implementation = PostPersistResponse.class)))
ResponseEntity<PostPersistResponse> createPost(
@Parameter(
description = "게시글에 저장할 파일의 ID 입니다.",
example = "1"
) @RequestParam(required = false) Long fileId,
@Parameter(
description = "게시글 생성 request 객체 입니다.",
required = true
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package kgu.developers.admin.post.presentation;

import static org.springframework.http.HttpStatus.CREATED;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import kgu.developers.admin.post.application.PostAdminFacade;
import kgu.developers.admin.post.presentation.request.PostRequest;
import kgu.developers.admin.post.presentation.response.PostPersistResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -10,14 +14,10 @@
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import kgu.developers.admin.post.application.PostAdminFacade;
import kgu.developers.admin.post.presentation.request.PostRequest;
import kgu.developers.admin.post.presentation.response.PostPersistResponse;
import lombok.RequiredArgsConstructor;
import static org.springframework.http.HttpStatus.CREATED;

@RestController
@RequiredArgsConstructor
Expand All @@ -29,16 +29,17 @@ public class PostAdminControllerImpl implements PostAdminController {
@Override
@PostMapping
public ResponseEntity<PostPersistResponse> createPost(
@RequestParam(required = false) Long fileId,
@Valid @RequestBody PostRequest request
) {
PostPersistResponse response = postAdminFacade.createPost(request);
PostPersistResponse response = postAdminFacade.createPost(fileId, request);
return ResponseEntity.status(CREATED).body(response);
}

@Override
@PatchMapping("/{postId}")
public ResponseEntity<Void> updatePost(
@Positive @PathVariable Long postId,
@Positive @PathVariable Long postId,
@Valid @RequestBody PostRequest request
) {
postAdminFacade.updatePost(postId, request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public record PostRequest(
@NotBlank
String content,

@Schema(description = "게시물 카테고리", example = "DEPT_INFO", requiredMode = NOT_REQUIRED)
@Schema(description = "게시물 카테고리", example = "NOTIFICATION", requiredMode = NOT_REQUIRED)
Category category
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

import kgu.developers.domain.file.application.query.FileQueryService;
import mock.repository.FakeFileRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -36,9 +38,11 @@ public class PostAdminFacadeTest {
public void init() {
fakePostRepository = new FakePostRepository();
FakeUserRepository fakeUserRepository = new FakeUserRepository();
FakeFileRepository fakeFileRepository = new FakeFileRepository();
UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
FileQueryService fileQueryService = new FileQueryService(fakeFileRepository);
this.postAdminFacade = new PostAdminFacade(
new PostCommandService(userQueryService, fakePostRepository),
new PostCommandService(userQueryService, fakePostRepository, fileQueryService),
new PostQueryService(fakePostRepository),
new PostSchedulingService(fakePostRepository)
);
Expand All @@ -60,7 +64,7 @@ public void init() {

fakePostRepository.save(
Post.create(
"post title", "post content", NOTIFICATION, author
"post title", "post content", NOTIFICATION, author, null
)
);
}
Expand All @@ -74,9 +78,10 @@ void createPost_Success() {
.content("new content")
.category(NOTIFICATION)
.build();
Long fileId = 1L;

// when
PostPersistResponse post = postAdminFacade.createPost(postRequest);
PostPersistResponse post = postAdminFacade.createPost(fileId, postRequest);
Post found = fakePostRepository.findByIdAndDeletedAtIsNull(post.postId()).get();

// then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ public record PostSummaryPageResponse<T>(
@Schema(description = "게시글 정보 리스트",
example = "[{"
+ "\"postId\": 3, "
+ "\"category\": \"공지사항\", "
+ "\"title\": \"SW 부트캠프 4기 교육생 모집\", "
+ "\"author\": \"홈피관리자\", "
+ "\"description\": \"2024학년도 학과 소개가 아래와 같은 일정으로 진행됩\", "
+ "\"views\": 19, "
+ "\"hasAttachment\": false, "
+ "\"isPinned\": false, "
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package kgu.developers.api.post.presentation.response;

import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;

import java.time.format.DateTimeFormatter;

import org.springframework.format.annotation.DateTimeFormat;

import io.swagger.v3.oas.annotations.media.Schema;
import kgu.developers.domain.post.domain.Post;
import lombok.Builder;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.format.DateTimeFormatter;

import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;

@Builder
public record PostSummaryResponse(
Expand All @@ -24,6 +23,9 @@ public record PostSummaryResponse(
@Schema(description = "작성자 이름", example = "홈피관리자", requiredMode = REQUIRED)
String author,

@Schema(description = "게시글 내용 앞부분 30자", example = "2024학년도 학과 소개가 아래와 같은 일정으로 진행됩", requiredMode = REQUIRED)
String description,

@Schema(description = "조회수", example = "19", requiredMode = REQUIRED)
int views,

Expand All @@ -39,11 +41,16 @@ public record PostSummaryResponse(
) {
public static PostSummaryResponse from(Post post) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

String content = post.getContent();
String description = content.length() > 30 ? content.substring(0, 30) : content;

return PostSummaryResponse.builder()
.postId(post.getId())
.category(post.getCategory().getDescription())
.title(post.getTitle())
.author(post.getAuthor().getName())
.description(description)
.views(post.getViews())
.hasAttachment(false) // TODO : 첨부파일 여부 확인
.isPinned(post.isPinned())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public void init() {
.build());

Post post = fakePostRepository.save(Post.create(
"테스트용 제목1", "테스트용 내용1", NEWS, author
"테스트용 제목1", "테스트용 내용1", NEWS, author, null
));

fakeCommentRepository.save(Comment.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import java.util.List;

import kgu.developers.domain.file.application.query.FileQueryService;
import mock.repository.FakeFileRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -39,11 +41,13 @@ public class PostFacadeTest {
public void init() {
FakePostRepository fakePostRepository = new FakePostRepository();
FakeUserRepository fakeUserRepository = new FakeUserRepository();
FakeFileRepository fakeFileRepository = new FakeFileRepository();

UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
FileQueryService fileQueryService = new FileQueryService(fakeFileRepository);

postFacade = new PostFacade(
new PostCommandService(userQueryService, fakePostRepository),
new PostCommandService(userQueryService, fakePostRepository, fileQueryService),
new PostQueryService(fakePostRepository)
);

Expand All @@ -63,16 +67,16 @@ public void init() {
);

fakePostRepository.save(Post.create(
"first title", "first content", NEWS, author
"first title", "first content", NEWS, author, null
));

Post delete = fakePostRepository.save(Post.create(
"second title", "second content", NEWS, author
"second title", "second content", NEWS, author, null
));
delete.delete();

fakePostRepository.save(Post.create(
"third title", "third content", NEWS, author
"third title", "third content", NEWS, author, null
));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
package kgu.developers.domain.file.application.query;

import org.springframework.stereotype.Service;

import kgu.developers.domain.file.domain.FileEntity;
import kgu.developers.domain.file.domain.FileRepository;
import kgu.developers.domain.file.exception.FileNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class FileQueryService {
private final FileRepository fileRepository;

public FileEntity getFileById(Long id) {
return fileRepository.findById(id).orElseThrow(FileNotFoundException::new);
return fileRepository.findById(id).orElse(null);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,30 @@
package kgu.developers.domain.post.application.command;

import org.springframework.stereotype.Service;

import kgu.developers.domain.file.application.query.FileQueryService;
import kgu.developers.domain.file.domain.FileEntity;
import kgu.developers.domain.post.domain.Category;
import kgu.developers.domain.post.domain.Post;
import kgu.developers.domain.post.domain.PostRepository;
import kgu.developers.domain.user.application.query.UserQueryService;
import kgu.developers.domain.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class PostCommandService {
private final UserQueryService userQueryService;
private final PostRepository postRepository;
private final FileQueryService fileQueryService;

public Long createPost(String title, String content, Category category) {
public Long createPost(String title, String content, Category category, Long fileId) {
User author = userQueryService.me();
Post post = Post.create(title, content, category, author);

FileEntity file = null;
if (fileId != null)
file = fileQueryService.getFileById(fileId);

Post post = Post.create(title, content, category, author, file);
return postRepository.save(post).getId();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,15 @@ public class Post extends BaseTimeEntity {
@OneToMany(mappedBy = "post", fetch = LAZY, cascade = ALL, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();

public static Post create(String title, String content, Category category, User author) {
public static Post create(String title, String content, Category category, User author, FileEntity file) {
return Post.builder()
.title(title)
.content(content)
.views(0)
.isPinned(false)
.category(category)
.author(author) // NOTE: User Setter 주입 방지 위해 생성자 주입
.file(file)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,19 @@ public void init() {
}

private static void saveTestUserAndPost(FakeUserRepository fakeUserRepository,
FakePostRepository fakePostRepository) {
FakePostRepository fakePostRepository) {
fakeUserRepository.save(
User.create(TEST_USER_ID, "password1234", "홍길동", "honggildong@kyonggi.ac.kr",
"010-1234-5678", CSE)
);
fakePostRepository.save(Post.create(
"SW 부트캠프 4기 교육생 모집", "SW전문인재양성사업단에서는 SW부트캠프 4기 교육생을 모집합니다.", NEWS,
User.builder().build()
User.builder().build(), null
));
}

private void initializeCommentCommandService(FakePostRepository fakePostRepository,
UserQueryService userQueryService) {
UserQueryService userQueryService) {
commentCommandService = new CommentCommandService(
new PostQueryService(fakePostRepository),
userQueryService,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ private static void saveTestComment(FakeCommentRepository fakeCommentRepository,
private static Post saveTestPost() {
FakePostRepository fakePostRepository = new FakePostRepository();
Post commentedPost = Post.create("SW 부트캠프 4기 교육생 모집",
"SW전문인재양성사업단에서는 SW부트캠프 4기 교육생을 모집합니다.", NEWS, User.builder().build());
"SW전문인재양성사업단에서는 SW부트캠프 4기 교육생을 모집합니다.", NEWS, User.builder().build(), null);
return fakePostRepository.save(commentedPost);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ private Post getPost(User author) {
"title",
"content.",
NEWS,
author
author,
null
);
}

Expand Down
Loading