Skip to content

Commit c23b115

Browse files
authored
feature/#194 게시글 API 프론트 QA 반영 (#195)
* feat: PostSummaryResponse에 description 추가 및 swagger 수정 * feat: Post 생성단계에서 file 입력받도록 변경 * feat: PostSummaryResponse 본문 30자 이하 에러 핸들링 * feat: fileId nullable 처리 * refactor: response 객체 description 코멘트 반영 * refactor: Post 생성 코멘트 반영 * refactor: import 정리
1 parent 6291c7c commit c23b115

File tree

20 files changed

+106
-73
lines changed

20 files changed

+106
-73
lines changed

aics-admin/src/main/java/kgu/developers/admin/post/application/PostAdminFacade.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public class PostAdminFacade {
1818
private final PostQueryService postQueryService;
1919
private final PostSchedulingService postSchedulingService;
2020

21-
public PostPersistResponse createPost(PostRequest request) {
22-
Long id = postCommandService.createPost(request.title(), request.content(), request.category());
21+
public PostPersistResponse createPost(Long fileId, PostRequest request) {
22+
Long id = postCommandService.createPost(request.title(), request.content(), request.category(), fileId);
2323
return PostPersistResponse.from(id);
2424
}
2525

aics-admin/src/main/java/kgu/developers/admin/post/presentation/PostAdminController.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package kgu.developers.admin.post.presentation;
22

3-
import org.springframework.http.ResponseEntity;
4-
import org.springframework.web.bind.annotation.PathVariable;
5-
import org.springframework.web.bind.annotation.RequestBody;
6-
73
import io.swagger.v3.oas.annotations.Hidden;
84
import io.swagger.v3.oas.annotations.Operation;
95
import io.swagger.v3.oas.annotations.Parameter;
@@ -15,6 +11,10 @@
1511
import jakarta.validation.constraints.Positive;
1612
import kgu.developers.admin.post.presentation.request.PostRequest;
1713
import kgu.developers.admin.post.presentation.response.PostPersistResponse;
14+
import org.springframework.http.ResponseEntity;
15+
import org.springframework.web.bind.annotation.PathVariable;
16+
import org.springframework.web.bind.annotation.RequestBody;
17+
import org.springframework.web.bind.annotation.RequestParam;
1818

1919
@Tag(name = "Post", description = "게시글 관리자 API")
2020
public interface PostAdminController {
@@ -27,6 +27,10 @@ public interface PostAdminController {
2727
responseCode = "201",
2828
content = @Content(schema = @Schema(implementation = PostPersistResponse.class)))
2929
ResponseEntity<PostPersistResponse> createPost(
30+
@Parameter(
31+
description = "게시글에 저장할 파일의 ID 입니다.",
32+
example = "1"
33+
) @RequestParam(required = false) Long fileId,
3034
@Parameter(
3135
description = "게시글 생성 request 객체 입니다.",
3236
required = true

aics-admin/src/main/java/kgu/developers/admin/post/presentation/PostAdminControllerImpl.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package kgu.developers.admin.post.presentation;
22

3-
import static org.springframework.http.HttpStatus.CREATED;
4-
3+
import jakarta.validation.Valid;
4+
import jakarta.validation.constraints.Positive;
5+
import kgu.developers.admin.post.application.PostAdminFacade;
6+
import kgu.developers.admin.post.presentation.request.PostRequest;
7+
import kgu.developers.admin.post.presentation.response.PostPersistResponse;
8+
import lombok.RequiredArgsConstructor;
59
import org.springframework.http.ResponseEntity;
610
import org.springframework.security.access.prepost.PreAuthorize;
711
import org.springframework.web.bind.annotation.GetMapping;
@@ -10,14 +14,10 @@
1014
import org.springframework.web.bind.annotation.PostMapping;
1115
import org.springframework.web.bind.annotation.RequestBody;
1216
import org.springframework.web.bind.annotation.RequestMapping;
17+
import org.springframework.web.bind.annotation.RequestParam;
1318
import org.springframework.web.bind.annotation.RestController;
1419

15-
import jakarta.validation.Valid;
16-
import jakarta.validation.constraints.Positive;
17-
import kgu.developers.admin.post.application.PostAdminFacade;
18-
import kgu.developers.admin.post.presentation.request.PostRequest;
19-
import kgu.developers.admin.post.presentation.response.PostPersistResponse;
20-
import lombok.RequiredArgsConstructor;
20+
import static org.springframework.http.HttpStatus.CREATED;
2121

2222
@RestController
2323
@RequiredArgsConstructor
@@ -29,16 +29,17 @@ public class PostAdminControllerImpl implements PostAdminController {
2929
@Override
3030
@PostMapping
3131
public ResponseEntity<PostPersistResponse> createPost(
32+
@RequestParam(required = false) Long fileId,
3233
@Valid @RequestBody PostRequest request
3334
) {
34-
PostPersistResponse response = postAdminFacade.createPost(request);
35+
PostPersistResponse response = postAdminFacade.createPost(fileId, request);
3536
return ResponseEntity.status(CREATED).body(response);
3637
}
3738

3839
@Override
3940
@PatchMapping("/{postId}")
4041
public ResponseEntity<Void> updatePost(
41-
@Positive @PathVariable Long postId,
42+
@Positive @PathVariable Long postId,
4243
@Valid @RequestBody PostRequest request
4344
) {
4445
postAdminFacade.updatePost(postId, request);

aics-admin/src/main/java/kgu/developers/admin/post/presentation/request/PostRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public record PostRequest(
2828
@NotBlank
2929
String content,
3030

31-
@Schema(description = "게시물 카테고리", example = "DEPT_INFO", requiredMode = NOT_REQUIRED)
31+
@Schema(description = "게시물 카테고리", example = "NOTIFICATION", requiredMode = NOT_REQUIRED)
3232
Category category
3333
) {
3434
}

aics-admin/src/testFixtures/java/post/application/PostAdminFacadeTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import static org.junit.jupiter.api.Assertions.assertNotEquals;
88
import static org.junit.jupiter.api.Assertions.assertNull;
99

10+
import kgu.developers.domain.file.application.query.FileQueryService;
11+
import mock.repository.FakeFileRepository;
1012
import org.junit.jupiter.api.BeforeEach;
1113
import org.junit.jupiter.api.DisplayName;
1214
import org.junit.jupiter.api.Test;
@@ -36,9 +38,11 @@ public class PostAdminFacadeTest {
3638
public void init() {
3739
fakePostRepository = new FakePostRepository();
3840
FakeUserRepository fakeUserRepository = new FakeUserRepository();
41+
FakeFileRepository fakeFileRepository = new FakeFileRepository();
3942
UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
43+
FileQueryService fileQueryService = new FileQueryService(fakeFileRepository);
4044
this.postAdminFacade = new PostAdminFacade(
41-
new PostCommandService(userQueryService, fakePostRepository),
45+
new PostCommandService(userQueryService, fakePostRepository, fileQueryService),
4246
new PostQueryService(fakePostRepository),
4347
new PostSchedulingService(fakePostRepository)
4448
);
@@ -60,7 +64,7 @@ public void init() {
6064

6165
fakePostRepository.save(
6266
Post.create(
63-
"post title", "post content", NOTIFICATION, author
67+
"post title", "post content", NOTIFICATION, author, null
6468
)
6569
);
6670
}
@@ -74,9 +78,10 @@ void createPost_Success() {
7478
.content("new content")
7579
.category(NOTIFICATION)
7680
.build();
81+
Long fileId = 1L;
7782

7883
// when
79-
PostPersistResponse post = postAdminFacade.createPost(postRequest);
84+
PostPersistResponse post = postAdminFacade.createPost(fileId, postRequest);
8085
Post found = fakePostRepository.findByIdAndDeletedAtIsNull(post.postId()).get();
8186

8287
// then

aics-api/src/main/java/kgu/developers/api/post/presentation/response/PostSummaryPageResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ public record PostSummaryPageResponse<T>(
1414
@Schema(description = "게시글 정보 리스트",
1515
example = "[{"
1616
+ "\"postId\": 3, "
17+
+ "\"category\": \"공지사항\", "
1718
+ "\"title\": \"SW 부트캠프 4기 교육생 모집\", "
1819
+ "\"author\": \"홈피관리자\", "
20+
+ "\"description\": \"2024학년도 학과 소개가 아래와 같은 일정으로 진행됩\", "
1921
+ "\"views\": 19, "
2022
+ "\"hasAttachment\": false, "
2123
+ "\"isPinned\": false, "

aics-api/src/main/java/kgu/developers/api/post/presentation/response/PostSummaryResponse.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package kgu.developers.api.post.presentation.response;
22

3-
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
4-
5-
import java.time.format.DateTimeFormatter;
6-
7-
import org.springframework.format.annotation.DateTimeFormat;
8-
93
import io.swagger.v3.oas.annotations.media.Schema;
104
import kgu.developers.domain.post.domain.Post;
115
import lombok.Builder;
6+
import org.springframework.format.annotation.DateTimeFormat;
7+
8+
import java.time.format.DateTimeFormatter;
9+
10+
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
1211

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

26+
@Schema(description = "게시글 내용 앞부분 30자", example = "2024학년도 학과 소개가 아래와 같은 일정으로 진행됩", requiredMode = REQUIRED)
27+
String description,
28+
2729
@Schema(description = "조회수", example = "19", requiredMode = REQUIRED)
2830
int views,
2931

@@ -39,11 +41,16 @@ public record PostSummaryResponse(
3941
) {
4042
public static PostSummaryResponse from(Post post) {
4143
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
44+
45+
String content = post.getContent();
46+
String description = content.length() > 30 ? content.substring(0, 30) : content;
47+
4248
return PostSummaryResponse.builder()
4349
.postId(post.getId())
4450
.category(post.getCategory().getDescription())
4551
.title(post.getTitle())
4652
.author(post.getAuthor().getName())
53+
.description(description)
4754
.views(post.getViews())
4855
.hasAttachment(false) // TODO : 첨부파일 여부 확인
4956
.isPinned(post.isPinned())

aics-api/src/testFixtures/java/comment/application/CommentFacadeTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void init() {
6262
.build());
6363

6464
Post post = fakePostRepository.save(Post.create(
65-
"테스트용 제목1", "테스트용 내용1", NEWS, author
65+
"테스트용 제목1", "테스트용 내용1", NEWS, author, null
6666
));
6767

6868
fakeCommentRepository.save(Comment.create(

aics-api/src/testFixtures/java/post/application/PostFacadeTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import java.util.List;
1010

11+
import kgu.developers.domain.file.application.query.FileQueryService;
12+
import mock.repository.FakeFileRepository;
1113
import org.junit.jupiter.api.BeforeEach;
1214
import org.junit.jupiter.api.DisplayName;
1315
import org.junit.jupiter.api.Test;
@@ -39,11 +41,13 @@ public class PostFacadeTest {
3941
public void init() {
4042
FakePostRepository fakePostRepository = new FakePostRepository();
4143
FakeUserRepository fakeUserRepository = new FakeUserRepository();
44+
FakeFileRepository fakeFileRepository = new FakeFileRepository();
4245

4346
UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
47+
FileQueryService fileQueryService = new FileQueryService(fakeFileRepository);
4448

4549
postFacade = new PostFacade(
46-
new PostCommandService(userQueryService, fakePostRepository),
50+
new PostCommandService(userQueryService, fakePostRepository, fileQueryService),
4751
new PostQueryService(fakePostRepository)
4852
);
4953

@@ -63,16 +67,16 @@ public void init() {
6367
);
6468

6569
fakePostRepository.save(Post.create(
66-
"first title", "first content", NEWS, author
70+
"first title", "first content", NEWS, author, null
6771
));
6872

6973
Post delete = fakePostRepository.save(Post.create(
70-
"second title", "second content", NEWS, author
74+
"second title", "second content", NEWS, author, null
7175
));
7276
delete.delete();
7377

7478
fakePostRepository.save(Post.create(
75-
"third title", "third content", NEWS, author
79+
"third title", "third content", NEWS, author, null
7680
));
7781
}
7882

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package kgu.developers.domain.file.application.query;
22

3-
import org.springframework.stereotype.Service;
4-
53
import kgu.developers.domain.file.domain.FileEntity;
64
import kgu.developers.domain.file.domain.FileRepository;
7-
import kgu.developers.domain.file.exception.FileNotFoundException;
85
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
97

108
@Service
119
@RequiredArgsConstructor
1210
public class FileQueryService {
1311
private final FileRepository fileRepository;
1412

1513
public FileEntity getFileById(Long id) {
16-
return fileRepository.findById(id).orElseThrow(FileNotFoundException::new);
14+
return fileRepository.findById(id).orElse(null);
1715
}
1816
}

0 commit comments

Comments
 (0)