Skip to content
16 changes: 14 additions & 2 deletions src/main/java/org/websoso/WSSServer/domain/Notice.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -28,20 +31,29 @@ public class Notice extends BaseEntity {
@Column(columnDefinition = "varchar(2000)", nullable = false)
private String noticeContent;

@Column(columnDefinition = "text", nullable = false)
private String noticeIcon;

@Column
private Long userId;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "notice_category_id", nullable = false)
private NoticeCategory noticeCategory;

@Builder
private Notice(String noticeTitle, String noticeContent, Long userId) {
private Notice(String noticeTitle, String noticeContent, Long userId, NoticeCategory noticeCategory) {
this.noticeTitle = noticeTitle;
this.noticeContent = noticeContent;
this.userId = userId;
this.noticeCategory = noticeCategory;
}

public void updateNotice(String noticeTitle, String noticeContent, Long userId) {
public void updateNotice(String noticeTitle, String noticeContent, Long userId, NoticeCategory noticeCategory) {
this.noticeTitle = noticeTitle;
this.noticeContent = noticeContent;
this.userId = userId;
this.noticeCategory = noticeCategory;
}

}
28 changes: 28 additions & 0 deletions src/main/java/org/websoso/WSSServer/domain/NoticeCategory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.websoso.WSSServer.domain;

import static jakarta.persistence.GenerationType.IDENTITY;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class NoticeCategory {

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(nullable = false)
private Byte noticeCategoryId;

@Column(columnDefinition = "varchar(10)", nullable = false)
private String noticeCategoryName;

@Column(columnDefinition = "text", nullable = false)
private String noticeCategoryImage;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public record NoticeEditRequest(
String noticeContent,

@ZeroAllowedUserIdConstraint
Long userId
Long userId,

Byte noticeCategoryId
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
public record NoticeGetResponse(
String noticeTitle,
String noticeContent,
String noticeCategoryImage,
String createdDate
) {

public static NoticeGetResponse from(Notice notice) {
return new NoticeGetResponse(
notice.getNoticeTitle(),
notice.getNoticeContent(),
notice.getNoticeCategory().getNoticeCategoryImage(),
formatDateString(notice.getCreatedDate())
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public record NoticePostRequest(
String noticeContent,

@ZeroAllowedUserIdConstraint
Long userId
Long userId,

Byte noticeCategoryId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.websoso.WSSServer.exception.error;

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

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;
import org.websoso.WSSServer.exception.common.ICustomError;

@AllArgsConstructor
@Getter
public enum CustomNoticeCategoryError implements ICustomError {

NOTICE_CATEGORY_NOT_FOUND("NOTICE_CATEGORY-001", "해당 아이디를 가진 공지 카테고리를 찾을 수 없습니다.", NOT_FOUND);

private final String code;
private final String description;
private final HttpStatus statusCode;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.websoso.WSSServer.exception.exception;

import lombok.Getter;
import org.websoso.WSSServer.exception.common.AbstractCustomException;
import org.websoso.WSSServer.exception.error.CustomNoticeCategoryError;

@Getter
public class CustomNoticeCategoryException extends AbstractCustomException {

public CustomNoticeCategoryException(CustomNoticeCategoryError customNoticeCategoryError, String message) {
super(customNoticeCategoryError, message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.websoso.WSSServer.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.websoso.WSSServer.domain.NoticeCategory;

@Repository
public interface NoticeCategoryRepository extends JpaRepository<NoticeCategory, Byte> {
}
15 changes: 14 additions & 1 deletion src/main/java/org/websoso/WSSServer/service/NoticeService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.websoso.WSSServer.service;

import static org.websoso.WSSServer.domain.common.Role.ADMIN;
import static org.websoso.WSSServer.exception.error.CustomNoticeCategoryError.NOTICE_CATEGORY_NOT_FOUND;
import static org.websoso.WSSServer.exception.error.CustomNoticeError.NOTICE_FORBIDDEN;
import static org.websoso.WSSServer.exception.error.CustomNoticeError.NOTICE_NOT_FOUND;

Expand All @@ -9,12 +10,15 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.websoso.WSSServer.domain.Notice;
import org.websoso.WSSServer.domain.NoticeCategory;
import org.websoso.WSSServer.domain.User;
import org.websoso.WSSServer.domain.common.Role;
import org.websoso.WSSServer.dto.notice.NoticeEditRequest;
import org.websoso.WSSServer.dto.notice.NoticePostRequest;
import org.websoso.WSSServer.dto.notice.NoticesGetResponse;
import org.websoso.WSSServer.exception.exception.CustomNoticeCategoryException;
import org.websoso.WSSServer.exception.exception.CustomNoticeException;
import org.websoso.WSSServer.repository.NoticeCategoryRepository;
import org.websoso.WSSServer.repository.NoticeRepository;

@Service
Expand All @@ -23,6 +27,8 @@
public class NoticeService {

private final NoticeRepository noticeRepository;
private final NoticeCategoryRepository noticeCategoryRepository;

private static final Role ADMIN_ROLE = ADMIN;

public void createNotice(User user, NoticePostRequest noticePostRequest) {
Expand All @@ -31,14 +37,15 @@ public void createNotice(User user, NoticePostRequest noticePostRequest) {
.noticeTitle(noticePostRequest.noticeTitle())
.noticeContent(noticePostRequest.noticeContent())
.userId(noticePostRequest.userId())
.noticeCategory(getNoticeCategoryOrException(noticePostRequest.noticeCategoryId()))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3; 해당 로직에서 공지 카테고리 ID를 받아 공지 카테고리 엔티티를 조회하도록 구현하셨는데, NoticeCategory 엔티티의 noticeCategoryName 컬럼을 활용해보는 건 어떨까요? 현재 방식은 카테고리 ID를 이용해서 카테고리 종류가 많아질 경우 클라이언트가 각 ID를 일일이 외워야 한다는 점에서 다소 불편할 수 있을 것 같다는 생각이 듭니당
카테고리 이름을 활용하면 클라이언트 입장에서 더 유연한 접근이 가능해질 것 같아요!

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하! 클라에서 사용하지 않는 api라 그냥 이렇게 만들었는데 저희가 그냥 포스트맨에서 쓰기에도 그게 편하겠네요. 수정하겠슴다~!👍🏻👍🏻

.build());
}

public void editNotice(User user, Long noticeId, NoticeEditRequest noticeEditRequest) {
validateAuthorization(user);
Notice notice = getNoticeOrException(noticeId);
notice.updateNotice(noticeEditRequest.noticeTitle(), noticeEditRequest.noticeContent(),
noticeEditRequest.userId());
noticeEditRequest.userId(), getNoticeCategoryOrException(noticeEditRequest.noticeCategoryId()));
}

private static void validateAuthorization(User user) {
Expand All @@ -64,4 +71,10 @@ private Notice getNoticeOrException(Long noticeId) {
return noticeRepository.findById(noticeId).orElseThrow(() ->
new CustomNoticeException(NOTICE_NOT_FOUND, "notice with given noticeId was not found"));
}

private NoticeCategory getNoticeCategoryOrException(Byte noticeCategoryId) {
return noticeCategoryRepository.findById(noticeCategoryId).orElseThrow(
() -> new CustomNoticeCategoryException(NOTICE_CATEGORY_NOT_FOUND,
"notice category with given noticeCategoryId was not found"));
}
}