Skip to content

Commit b78b984

Browse files
authored
Merge pull request #527 from projects200/feat/feeds/create-feed-images
[Feat] 피드에 이미지 추가하는 기능 개발 [0.11.10]
2 parents 5ff11f9 + 580a5cd commit b78b984

File tree

19 files changed

+549
-16
lines changed

19 files changed

+549
-16
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77
}
88

99
group = 'com.project200'
10-
version = '0.11.9-SNAPSHOT'
10+
version = '0.11.10-SNAPSHOT'
1111

1212
java {
1313
toolchain {

documents/Undabang SQL/Undabang Database DML.sql

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ VALUES ('레슬링', 'https://undabang-public-assets.s3.ap-northeast-2.amazonaws
218218
('미식축구',
219219
'https://undabang-public-assets.s3.ap-northeast-2.amazonaws.com/images/exercises/American_football.png');
220220

221-
INSERT INTO policies (policy_key, policy_value, policy_unit, policy_description)
221+
INSERT INTO policies (policy_id, policy_key, policy_value, policy_unit, policy_description)
222222
VALUES (21, 'PREFERRED_EXERCISE_MAX_COUNT', '5', 'COUNT', '선호 운동 최대 보유 갯수');
223223

224224
INSERT INTO policies (policy_id, policy_key, policy_value, policy_unit, policy_description)
@@ -268,4 +268,13 @@ CREATE INDEX idx_feed_likes_feed_member ON feed_likes (feed_id, member_id);
268268
CREATE INDEX idx_comments_feed_member ON comments (feed_id, member_id);
269269

270270
-- 댓글 좋아요 인덱스: (댓글ID + 회원ID)
271-
CREATE INDEX idx_comment_likes_comment_member ON comment_likes (comment_id, member_id);
271+
CREATE INDEX idx_comment_likes_comment_member ON comment_likes (comment_id, member_id);
272+
273+
INSERT INTO policies (policy_id, policy_key, policy_value, policy_unit, policy_description)
274+
VALUES (23, 'FEED_PICTURE_MAX_COUNT', '5', 'COUNT', '저장할 수 있는 최대 피드 사진 수');
275+
276+
INSERT INTO policy_groups (policy_groups_id, policy_groups_name)
277+
VALUES (6, 'feed');
278+
279+
INSERT INTO policy_group_mappings (policy_id, policy_groups_id)
280+
VALUES (23, 6);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
== 피드 이미지 목록 추가 API
2+
3+
=== 설명
4+
5+
- #POST# `/api/v1/feeds/{feedId}/pictures`
6+
- 회원이 작성한 피드에 이미지를 추가하는 API 입니다.
7+
- 저장 가능한 최대 이미지 갯수는 5개 입니다.
8+
9+
=== 개발 이력
10+
11+
- Sprint 23 (2026-02-02): 기능 개발이 완료되었습니다.
12+
13+
=== 개발 참고 사항
14+
15+
- <<공통-개발-참고-사항,공통 개발 참고 사항>>을 참고하세요.
16+
17+
=== 코드 샘플
18+
19+
operation::create-feed-pictures/create-feed-pictures_-success[snippets="curl-request,http-request,http-response"]
20+
21+
=== 매개 변수
22+
23+
operation::create-feed-pictures/create-feed-pictures_-success[snippets="request-headers,path-parameters,request-parts,response-fields"]
24+
25+
==== 응답 상태 코드
26+
27+
|===
28+
|상태 코드|설명
29+
|200|요청이 성공적으로 처리되었습니다.
30+
|400|요청 본문을 읽을 수 없거나 형식이 올바르지 않습니다.
31+
|401|인증되지 않은 요청입니다. Access Token이 없거나 유효하지 않습니다
32+
|404|존재하지 않는 회원입니다. +
33+
존재하지 않는 피드 입니다.
34+
|409|저장할 수 있는 최대 피드 사진 갯수를 초과했습니다.
35+
|===
36+

src/docs/asciidoc/index.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,6 @@ include::overview/공통-개발-참고-사항.adoc[]
257257

258258
- 피드 수정 API #PATCH# `/api/v1/feeds/{feedId}`
259259

260-
- 피드 삭제 API #DELETE# `/api/v1/feeds/{feedId}`
260+
- 피드 삭제 API #DELETE# `/api/v1/feeds/{feedId}`
261+
262+
- 피드 이미지 목록 추가 API #POST# `/api/v1/feeds/{feedId}/pictures`

src/docs/asciidoc/피드-API.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ include::feed/피드-생성-API.adoc[]
2929

3030
include::feed/피드-수정-API.adoc[]
3131

32-
include::feed/피드-삭제-API.adoc[]
32+
include::feed/피드-삭제-API.adoc[]
33+
34+
include::feed/피드-이미지-목록-추가-API.adoc[]

src/main/java/com/project200/undabang/common/service/FileType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
public enum FileType {
44
EXERCISE("exercises"),
55
PROFILE("profiles"),
6-
THUMBNAIL("thumbnails");
6+
THUMBNAIL("thumbnails"),
7+
FEED("feeds");
78

89
private final String path;
910

src/main/java/com/project200/undabang/common/web/exception/ErrorCode.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ public enum ErrorCode {
102102
FEED_NOT_FOUND(404, "FEED_NOT_FOUND", "존재하지 않는 피드입니다."),
103103

104104
// 피드 타입 관련 에러
105-
FEED_TYPE_NOT_FOUND(404, "FEED_TYPE_NOT_FOUND", "존재하지 않는 피드 타입입니다.");
105+
FEED_TYPE_NOT_FOUND(404, "FEED_TYPE_NOT_FOUND", "존재하지 않는 피드 타입입니다."),
106+
107+
// 피드 사진 관련 에러
108+
FEED_PICTURE_MAX_COUNT_EXCEED(409, "FEED_PICTURE_MAX_COUNT_EXCEED", "저장할 수 있는 최대 피드 사진 갯수를 초과했습니다.");
106109

107110
private final HttpStatusCode status;
108111
private final String code;

src/main/java/com/project200/undabang/feed/controller/FeedCommandController.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,35 @@
11
package com.project200.undabang.feed.controller;
22

3+
import com.project200.undabang.common.validation.AllowedExtensions;
34
import com.project200.undabang.common.web.response.CommonResponse;
45
import com.project200.undabang.feed.dto.request.CreateFeedRequest;
56
import com.project200.undabang.feed.dto.request.UpdateFeedRequest;
7+
import com.project200.undabang.feed.dto.response.CreateFeedPictureResponse;
68
import com.project200.undabang.feed.dto.response.CreateFeedResponse;
79
import com.project200.undabang.feed.dto.response.UpdateFeedResponse;
810
import com.project200.undabang.feed.service.FeedCommandService;
11+
import com.project200.undabang.feed.service.FeedPictureService;
912
import jakarta.validation.Valid;
13+
import jakarta.validation.constraints.Positive;
14+
import jakarta.validation.constraints.Size;
1015
import lombok.RequiredArgsConstructor;
1116
import org.springframework.http.HttpStatus;
17+
import org.springframework.http.MediaType;
1218
import org.springframework.http.ResponseEntity;
19+
import org.springframework.validation.annotation.Validated;
1320
import org.springframework.web.bind.annotation.*;
21+
import org.springframework.web.multipart.MultipartFile;
1422

23+
import java.util.List;
24+
25+
@Validated
1526
@RestController
1627
@RequiredArgsConstructor
1728
@RequestMapping("/api")
1829
public class FeedCommandController {
1930

2031
private final FeedCommandService feedCommandService;
32+
private final FeedPictureService feedPictureService;
2133

2234
/**
2335
* 사용자가 제공한 요청 데이터를 기반으로 새로운 피드 리소스를 생성합니다.
@@ -47,4 +59,14 @@ public ResponseEntity<CommonResponse<Void>> deleteMemberFeed(@PathVariable Long
4759

4860
return ResponseEntity.ok(CommonResponse.delete(feedCommandService.deleteMemberFeed(feedId)));
4961
}
62+
63+
@PostMapping(value = "/v1/feeds/{feedId}/pictures", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
64+
public ResponseEntity<CommonResponse<List<CreateFeedPictureResponse>>> createFeedPictures(
65+
@PathVariable @Positive(message = "올바른 피드 식별자를 입력해주세요") Long feedId,
66+
@Size(max = 5, message = "최대 5개의 파일만 업로드 할 수 있습니다.")
67+
@AllowedExtensions(extensions = {".jpg", ".jpeg", ".png"})
68+
@RequestPart("pictures") List<MultipartFile> feedPictureList) {
69+
70+
return ResponseEntity.status(HttpStatus.CREATED).body(CommonResponse.create(feedPictureService.createFeedPictures(feedId, feedPictureList)));
71+
}
5072
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.project200.undabang.feed.dto.response;
2+
3+
import com.project200.undabang.feed.entity.FeedPicture;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
public class CreateFeedPictureResponse {
12+
private Long pictureId;
13+
private String pictureUrl;
14+
15+
public static CreateFeedPictureResponse of(FeedPicture feedPicture) {
16+
return new CreateFeedPictureResponse(feedPicture.getId(), feedPicture.getPicture().getPictureUrl());
17+
}
18+
}

src/main/java/com/project200/undabang/feed/entity/FeedPicture.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,10 @@ public class FeedPicture {
2727
@JoinColumn(name = "feed_id", nullable = false, updatable = false)
2828
private Feed feed;
2929

30+
public static FeedPicture of(Picture picture, Feed feed) {
31+
return FeedPicture.builder()
32+
.picture(picture)
33+
.feed(feed)
34+
.build();
35+
}
3036
}

0 commit comments

Comments
 (0)