Skip to content

Commit 9319a60

Browse files
xxoznge이소정seheonnn
authored
✨ feat: 공고 수정 기능 개발 (#41)
Co-authored-by: 이소정 <[email protected]> Co-authored-by: seheonnn <[email protected]>
1 parent 8dc1e51 commit 9319a60

File tree

7 files changed

+122
-5
lines changed

7 files changed

+122
-5
lines changed

http/test.http

+16-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Content-Type: application/json
3030
}
3131

3232
### 공고 생성
33-
POST http://localhost:8080/api/v1/announcement
33+
POST http://localhost:8080/api/v1/announcements
3434
Authorization: Bearer {{matsterToken}}
3535
Content-Type: application/json
3636

@@ -43,12 +43,25 @@ Content-Type: application/json
4343
}
4444

4545
### 상세 조회
46-
GET http://localhost:8080/api/v1/announcement/1
46+
GET http://localhost:8080/api/v1/announcements/2
4747

4848
### 삭제 (생성한 단체만 삭제 가능)
49-
DELETE http://localhost:8080/api/v1/announcement/1
49+
DELETE http://localhost:8080/api/v1/announcements/1
5050
Authorization: Bearer {{matsterToken}}
5151

52+
### 공고 수정
53+
PATCH http://localhost:8080/api/v1/announcements/1
54+
Authorization: Bearer {{matsterToken}}
55+
Content-Type: application/json
56+
57+
{
58+
"title": "스포너스 스폰서십",
59+
"type": "SPONSORSHIP",
60+
"category": "MARKETING",
61+
"content": "스포너스 스폰서십을 진행할 대학교 학생회를 모집합니다.",
62+
"status": "POSTED"
63+
}
64+
5265
### 보고서 작성
5366
POST http://localhost:8080/api/v1/reports
5467
Content-Type: application/json

src/main/java/com/sponus/sponusbe/domain/announcement/controller/AnnouncementController.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementCreateRequest;
1717
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementCreateResponse;
1818
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementResponse;
19+
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementUpdateRequest;
20+
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementUpdateResponse;
1921
import com.sponus.sponusbe.domain.announcement.service.AnnouncementQueryService;
2022
import com.sponus.sponusbe.domain.announcement.service.AnnouncementService;
2123
import com.sponus.sponusbe.domain.organization.entity.Organization;
@@ -71,8 +73,13 @@ public ApiResponse<Void> deleteAnnouncement(
7173
}
7274

7375
@PatchMapping("/{announcementId}")
74-
public ApiResponse<?> updateAnnouncement(@PathVariable Long announcementId) {
75-
return null;
76+
public ApiResponse<AnnouncementUpdateResponse> updateAnnouncement(
77+
@AuthOrganization Organization authOrganization,
78+
@PathVariable Long announcementId,
79+
@RequestBody @Valid AnnouncementUpdateRequest request
80+
) {
81+
announcementService.updateAnnouncement(authOrganization, announcementId, request);
82+
return ApiResponse.onSuccess(announcementService.updateAnnouncement(authOrganization, announcementId, request));
7683
}
7784

7885
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.sponus.sponusbe.domain.announcement.dto;
2+
3+
import com.sponus.sponusbe.domain.announcement.entity.Announcement;
4+
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementCategory;
5+
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementStatus;
6+
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementType;
7+
import com.sponus.sponusbe.domain.organization.entity.Organization;
8+
9+
import jakarta.validation.constraints.NotBlank;
10+
import jakarta.validation.constraints.NotNull;
11+
import lombok.Builder;
12+
13+
@Builder
14+
public record AnnouncementUpdateRequest(
15+
@NotBlank(message = "[ERROR] 타이틀 입력은 필수 입니다.")
16+
String title,
17+
@NotNull(message = "[ERROR] 유형 입력은 필수 입니다.")
18+
AnnouncementType type,
19+
@NotNull(message = "[ERROR] 카테코리 입력은 필수 입니다.")
20+
AnnouncementCategory category,
21+
@NotBlank(message = "[ERROR] 내용 입력은 필수 입니다.")
22+
String content,
23+
24+
AnnouncementStatus status
25+
) {
26+
27+
public Announcement toEntity(Organization writer) {
28+
return Announcement.builder()
29+
.writer(writer)
30+
.title(title)
31+
.type(type)
32+
.category(category)
33+
.content(content)
34+
.status(status)
35+
.build();
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.sponus.sponusbe.domain.announcement.dto;
2+
3+
import com.sponus.sponusbe.domain.announcement.entity.Announcement;
4+
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementCategory;
5+
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementStatus;
6+
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementType;
7+
8+
import lombok.Builder;
9+
10+
@Builder
11+
public record AnnouncementUpdateResponse(
12+
Long id,
13+
Long writerId,
14+
String title,
15+
AnnouncementType type,
16+
AnnouncementCategory category,
17+
String content,
18+
AnnouncementStatus status,
19+
Long viewCount
20+
) {
21+
public static AnnouncementUpdateResponse from(Announcement announcement) {
22+
return AnnouncementUpdateResponse.builder()
23+
.id(announcement.getId())
24+
.writerId(announcement.getWriter().getId())
25+
.title(announcement.getTitle())
26+
.type(announcement.getType())
27+
.category(announcement.getCategory())
28+
.content(announcement.getContent())
29+
.status(AnnouncementStatus.POSTED)
30+
.viewCount(announcement.getViewCount())
31+
.build();
32+
}
33+
}

src/main/java/com/sponus/sponusbe/domain/announcement/entity/Announcement.java

+7
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,11 @@ public class Announcement extends BaseEntity {
6666
public void increaseViewCount() {
6767
this.viewCount++;
6868
}
69+
70+
public void update(String title, AnnouncementType type, AnnouncementCategory category, String content) {
71+
this.title = title == null ? this.title : title;
72+
this.type = type == null ? this.type : type;
73+
this.category = category == null ? this.category : category;
74+
this.content = content == null ? this.content : content;
75+
}
6976
}

src/main/java/com/sponus/sponusbe/domain/announcement/exception/AnnouncementErrorCode.java

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
public enum AnnouncementErrorCode implements BaseErrorCode {
1414
ANNOUNCEMENT_ERROR(HttpStatus.BAD_REQUEST, "ANC4000", "공지사항 관련 에러"),
1515
ANNOUNCEMENT_ALREADY_DELETED(HttpStatus.BAD_REQUEST, "ANC4001", "이미 삭제된 공지사항입니다."),
16+
INVALID_ORGANIZATION(HttpStatus.BAD_REQUEST, "ANC4002", "해당 단체의 공고가 아닙니다."),
1617
ANNOUNCEMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "ANC4040", "해당 공지사항이 존재하지 않습니다.");
1718

1819
private final HttpStatus httpStatus;

src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementService.java

+19
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementCreateRequest;
77
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementCreateResponse;
88
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementResponse;
9+
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementUpdateRequest;
10+
import com.sponus.sponusbe.domain.announcement.dto.AnnouncementUpdateResponse;
911
import com.sponus.sponusbe.domain.announcement.entity.Announcement;
1012
import com.sponus.sponusbe.domain.announcement.exception.AnnouncementErrorCode;
1113
import com.sponus.sponusbe.domain.announcement.exception.AnnouncementException;
@@ -46,4 +48,21 @@ public void deleteAnnouncement(Organization organization, Long announcementId) {
4648
announcementRepository.delete(announcement);
4749
}
4850

51+
public AnnouncementUpdateResponse updateAnnouncement(Organization authOrganization, Long proposeId,
52+
AnnouncementUpdateRequest request) {
53+
final Announcement announcement = announcementRepository.findById(proposeId)
54+
.orElseThrow(() -> new AnnouncementException(AnnouncementErrorCode.ANNOUNCEMENT_NOT_FOUND));
55+
56+
if (!isOrganizationsAnnouncement(authOrganization.getId(), announcement))
57+
throw new AnnouncementException(AnnouncementErrorCode.INVALID_ORGANIZATION);
58+
59+
announcement.update(request.title(), request.type(), request.category(), request.content());
60+
announcementRepository.save(announcement);
61+
return AnnouncementUpdateResponse.from(announcement);
62+
}
63+
64+
private boolean isOrganizationsAnnouncement(Long organizationId, Announcement announcement) {
65+
return announcement.getWriter().getId().equals(organizationId);
66+
}
67+
4968
}

0 commit comments

Comments
 (0)