- 공개범위 설정 기능 개발(ALL/ORG/PRIVATE) - 게시물/댓글 정교화 - 요청 및 DB 처리 확장 - UI, DTO, Service 계층 업데이트 - 감사 로그 및 조회수 처리 로직 추가
This commit is contained in:
@@ -86,4 +86,23 @@ public class Inquiry extends Auditable {
|
||||
|
||||
@Column(name = "ATTACH_FILE")
|
||||
private String attachFile;
|
||||
|
||||
/**
|
||||
* 공개범위 (전체공개/법인공개/비공개). 기본값 ORG.
|
||||
* PTL_PROPERTY 기관 기본값이 상한(ceiling)이며 읽기/쓰기 시 clamp 된다.
|
||||
*/
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "VISIBILITY", length = 16)
|
||||
private VisibilityScope visibility = VisibilityScope.ORG;
|
||||
|
||||
/**
|
||||
* 조회수. sessionStorage 기반 dedup 후 POST 요청으로만 증가한다.
|
||||
*/
|
||||
@Column(name = "VIEW_COUNT")
|
||||
private long viewCount = 0L;
|
||||
|
||||
/** 조회수 1 증가. */
|
||||
public void increaseViewCount() {
|
||||
this.viewCount++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,18 @@ public class InquiryComment extends Auditable implements Serializable {
|
||||
@Column(name = "ADMIN_YN", length = 1)
|
||||
private String adminYn = "N";
|
||||
|
||||
/**
|
||||
* 댓글 공개범위. 개념상 공개(ALL)/비공개(PRIVATE) 2단계.
|
||||
* 비공개 댓글은 작성자·같은 법인 corp-manager·관리자만 열람 가능.
|
||||
*/
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "VISIBILITY", length = 16)
|
||||
private VisibilityScope visibility = VisibilityScope.ALL;
|
||||
|
||||
public boolean isPrivate() {
|
||||
return this.visibility == VisibilityScope.PRIVATE;
|
||||
}
|
||||
|
||||
public void markDeleted() {
|
||||
this.delYn = "Y";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.eactive.apim.portal.qna.entity;
|
||||
|
||||
/**
|
||||
* 문의(Q&A) 게시물/댓글의 공개범위.
|
||||
*
|
||||
* <p>{@code width}는 공개 범위의 넓이 랭크로, 값이 클수록 더 넓게 공개된다.
|
||||
* {@code PTL_PROPERTY}에 설정된 기관 기본값이 상한(ceiling)이 되며, 게시물이 상한보다
|
||||
* 넓게 설정될 수 없다({@link #clampTo}). property가 항상 우선한다.</p>
|
||||
*
|
||||
* <ul>
|
||||
* <li>{@code ALL} : 전체 로그인 사용자 공개</li>
|
||||
* <li>{@code ORG} : 같은 법인 소속 사용자 공개 (게시물 기본값)</li>
|
||||
* <li>{@code PRIVATE} : 작성자 본인만 (댓글의 "비공개")</li>
|
||||
* </ul>
|
||||
*/
|
||||
public enum VisibilityScope {
|
||||
|
||||
ALL(3, "전체공개"),
|
||||
ORG(2, "법인공개"),
|
||||
PRIVATE(1, "비공개");
|
||||
|
||||
private final int width;
|
||||
private final String label;
|
||||
|
||||
VisibilityScope(int width, String label) {
|
||||
this.width = width;
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
/** 공개 범위 넓이 랭크. 클수록 넓게 공개. */
|
||||
public int width() {
|
||||
return width;
|
||||
}
|
||||
|
||||
/** 화면 표기용 한글 라벨. */
|
||||
public String label() {
|
||||
return label;
|
||||
}
|
||||
|
||||
/**
|
||||
* 문자열을 enum으로 안전 변환. null/빈값/미해당은 defaultScope 반환.
|
||||
*/
|
||||
public static VisibilityScope fromString(String value, VisibilityScope defaultScope) {
|
||||
if (value == null || value.trim().isEmpty()) {
|
||||
return defaultScope;
|
||||
}
|
||||
try {
|
||||
return VisibilityScope.valueOf(value.trim().toUpperCase());
|
||||
} catch (IllegalArgumentException e) {
|
||||
return defaultScope;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 요청 공개범위를 상한으로 clamp 한다. 요청이 상한보다 넓으면 상한으로 낮춘다.
|
||||
* (property가 항상 우선하므로, 저장값이 옛 상한이라 더 넓더라도 읽기 시 재-clamp 한다.)
|
||||
*/
|
||||
public static VisibilityScope clampTo(VisibilityScope requested, VisibilityScope ceiling) {
|
||||
if (requested == null) {
|
||||
return ceiling;
|
||||
}
|
||||
if (ceiling == null) {
|
||||
return requested;
|
||||
}
|
||||
return requested.width() > ceiling.width() ? ceiling : requested;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user