Skip to content

Commit 470bfc5

Browse files
authored
Merge pull request #525 from projects200/feat/feed/update-feed-content
[Feat] 피드 내용 수정 기능 개발 [0.11.8]
2 parents 6001777 + 10ab9d6 commit 470bfc5

File tree

17 files changed

+539
-128
lines changed

17 files changed

+539
-128
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.4-SNAPSHOT'
10+
version = '0.11.8-SNAPSHOT'
1111

1212
java {
1313
toolchain {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
== 피드 수정 API
2+
3+
=== 설명
4+
5+
- #PATCH# `/api/v1/feeds/{feedId}`
6+
- 회원이 작성한 피드를 수정하는 API 입니다.
7+
- 요청시 피드 내용은 필수로 입력받으며, 피드 게시판 내용을 제거하고 싶은경우 요청 본문에 피드 게시판 식별자를 입력하지 않으면 자동으로 게시판 내용이 삭제되도록 하였습니다.
8+
9+
=== 개발 이력
10+
11+
- Sprint 23 (2026-01-30): 기능 개발이 완료되었습니다.
12+
13+
=== 개발 참고 사항
14+
15+
- <<공통-개발-참고-사항,공통 개발 참고 사항>>을 참고하세요.
16+
17+
=== 코드 샘플
18+
19+
operation::update-member-feed/update-member-feed_-success[snippets="curl-request,http-request,http-response"]
20+
21+
=== 매개 변수
22+
23+
operation::update-member-feed/update-member-feed_-success[snippets="request-headers,path-parameters,response-fields"]
24+
25+
==== 응답 상태 코드
26+
27+
|===
28+
|상태 코드|설명
29+
|200|요청이 성공적으로 처리되었습니다.
30+
|400|요청 본문을 읽을 수 없거나 형식이 올바르지 않습니다.
31+
|401|인증되지 않은 요청입니다. Access Token이 없거나 유효하지 않습니다
32+
|404|존재하지 않는 회원입니다. +
33+
존재하지 않는 피드 타입 입니다. +
34+
존재하지 않는 피드 입니다.
35+
|===
36+

src/docs/asciidoc/index.adoc

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

254254
- 마이페이지에서 내가 작성한 피드 목록 조회 API #GET# `/api/v1/mypage/feeds`
255255

256-
- 피드 생성 API #POST# `/api/v1/feeds`
256+
- 피드 생성 API #POST# `/api/v1/feeds`
257+
258+
- 피드 수정 API #PATCH# `/api/v1/feeds/{feedId}`

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ include::feed/특정-피드-상세-조회-API.adoc[]
2525

2626
include::feed/마이페이지-내가-작성한-피드-목록-조회-API.adoc[]
2727

28-
include::feed/피드-생성-API.adoc[]
28+
include::feed/피드-생성-API.adoc[]
29+
30+
include::feed/피드-수정-API.adoc[]

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22

33
import com.project200.undabang.common.web.response.CommonResponse;
44
import com.project200.undabang.feed.dto.request.CreateFeedRequest;
5+
import com.project200.undabang.feed.dto.request.UpdateFeedRequest;
56
import com.project200.undabang.feed.dto.response.CreateFeedResponse;
7+
import com.project200.undabang.feed.dto.response.UpdateFeedResponse;
68
import com.project200.undabang.feed.service.FeedCommandService;
79
import jakarta.validation.Valid;
810
import lombok.RequiredArgsConstructor;
911
import org.springframework.http.HttpStatus;
1012
import org.springframework.http.ResponseEntity;
11-
import org.springframework.web.bind.annotation.PostMapping;
12-
import org.springframework.web.bind.annotation.RequestBody;
13-
import org.springframework.web.bind.annotation.RequestMapping;
14-
import org.springframework.web.bind.annotation.RestController;
13+
import org.springframework.web.bind.annotation.*;
1514

1615
@RestController
1716
@RequiredArgsConstructor
@@ -28,4 +27,15 @@ public ResponseEntity<CommonResponse<CreateFeedResponse>> createMemberFeed(@Vali
2827

2928
return ResponseEntity.status(HttpStatus.CREATED).body(CommonResponse.create(feedCommandService.createMemberFeed(request)));
3029
}
30+
31+
/**
32+
* 특정 피드의 정보를 업데이트합니다.
33+
* 피드 ID에 해당하는 리소스를 찾아 사용자가 제공한 요청 데이터를 기반으로 수정합니다.
34+
*/
35+
@PatchMapping("/v1/feeds/{feedId}")
36+
public ResponseEntity<CommonResponse<UpdateFeedResponse>> updateMemberFeed(@PathVariable Long feedId,
37+
@Valid @RequestBody UpdateFeedRequest request) {
38+
39+
return ResponseEntity.ok(CommonResponse.update(feedCommandService.updateMemberFeed(feedId, request)));
40+
}
3141
}

src/main/java/com/project200/undabang/feed/dto/request/CreateFeedRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
@NoArgsConstructor
1010
@AllArgsConstructor
1111
public class CreateFeedRequest {
12-
@NotBlank
12+
@NotBlank(message = "피드 내용을 입력해주세요.")
1313
private String feedContent;
1414
private Long feedTypeId;
1515
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.project200.undabang.feed.dto.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
public class UpdateFeedRequest {
12+
@NotBlank(message = "피드 내용을 입력해주세요.")
13+
private String feedContent;
14+
private Long feedTypeId;
15+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.project200.undabang.feed.dto.response;
2+
3+
import com.project200.undabang.feed.entity.Feed;
4+
import com.project200.undabang.feed.entity.FeedType;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
import java.util.Optional;
11+
12+
@Getter
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public class UpdateFeedResponse {
17+
private long feedId;
18+
private String feedContent;
19+
private Integer feedLikesCount;
20+
private Integer feedCommentsCount;
21+
private Long feedTypeId;
22+
private String feedTypeName;
23+
private String feedTypeDesc;
24+
25+
public static UpdateFeedResponse of(Feed feed) {
26+
Optional<FeedType> optionalFeedType = Optional.ofNullable(feed.getFeedType());
27+
28+
Long feedTypeId = optionalFeedType.map(FeedType::getFeedTypeId).orElse(null);
29+
String feedTypeName = optionalFeedType.map(FeedType::getFeedTypeName).orElse(null);
30+
String feedTypeDesc = optionalFeedType.map(FeedType::getFeedTypeDesc).orElse(null);
31+
32+
return UpdateFeedResponse.builder()
33+
.feedId(feed.getId())
34+
.feedContent(feed.getFeedContent())
35+
.feedLikesCount(feed.getLikesCount())
36+
.feedCommentsCount(feed.getCommentsCount())
37+
.feedTypeId(feedTypeId)
38+
.feedTypeName(feedTypeName)
39+
.feedTypeDesc(feedTypeDesc)
40+
.build();
41+
}
42+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,10 @@ public static Feed create(Member member, String feedContent, FeedType feedType)
6767
.createdAt(LocalDateTime.now())
6868
.build();
6969
}
70+
71+
public void update(String feedContent, FeedType feedType) {
72+
this.feedContent = feedContent;
73+
this.feedType = feedType;
74+
this.updatedAt = LocalDateTime.now();
75+
}
7076
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.project200.undabang.feed.repository;
22

33
import com.project200.undabang.feed.entity.Feed;
4+
import com.project200.undabang.member.entity.Member;
45
import org.springframework.data.jpa.repository.JpaRepository;
56

7+
import java.util.Optional;
8+
69
public interface FeedRepository extends JpaRepository<Feed, Long>, FeedRepositoryCustom {
10+
Optional<Feed> findByIdAndMemberAndDeletedAtNull(Long id, Member member);
711
}

0 commit comments

Comments
 (0)