Blue의 레코드(할 일)에 리치 텍스트 콘텐츠, 파일 첨부 및 @멘션을 사용하여 댓글을 추가합니다.
댓글 추가
createComment 뮤테이션을 사용하면 Blue의 레코드에 댓글을 추가할 수 있습니다. 댓글은 리치 HTML 콘텐츠, 파일 첨부, @멘션을 지원하며, 활동 피드 및 알림 시스템과 자동으로 통합됩니다.
기본 예제
레코드에 간단한 텍스트 댓글을 추가합니다:
mutation AddComment {
createComment(
input: {
html: "<p>This task is progressing well!</p>"
text: "This task is progressing well!"
category: TODO
categoryId: "clm4n8qwx000008l0g4oxdqn7"
}
) {
id
html
text
createdAt
user {
id
name
}
}
}
고급 예제
리치 포맷팅, 이미지 및 TipTap 편집기 처리를 포함한 댓글을 추가합니다:
mutation AddCommentAdvanced {
createComment(
input: {
html: "<p>Here's my <strong>feedback</strong> on this task:</p><ul><li>Great progress on the design</li><li>Need to review the API integration</li></ul><p>Attaching screenshot:</p><img src='data:image/png;base64,iVBOR...' />"
text: "Here's my feedback on this task: - Great progress on the design - Need to review the API integration Attaching screenshot:"
category: TODO
categoryId: "clm4n8qwx000008l0g4oxdqn7"
tiptap: true
}
) {
id
html
text
createdAt
user {
id
name
avatar
}
activity {
id
}
isRead
isSeen
}
}
입력 매개변수
CreateCommentInput
매개변수 | 유형 | 필수 | 설명 |
---|---|---|---|
html |
String! | ✅ 예 | 댓글의 HTML 콘텐츠 (보안을 위해 정리됩니다) |
text |
String! | ✅ 예 | 댓글 콘텐츠의 일반 텍스트 버전 |
category |
CommentCategory! | ✅ 예 | 댓글이 달리는 엔터티의 유형 (레코드에는 TODO 사용) |
categoryId |
String! | ✅ 예 | 댓글이 달리는 엔터티(레코드)의 ID |
tiptap |
Boolean | 아니오 | TipTap 편집기 전용 HTML 정리 및 처리 활성화 |
CommentCategory 값
값 | 설명 |
---|---|
TODO |
레코드/할 일 항목에 대한 댓글 |
DISCUSSION |
토론 스레드에 대한 댓글 |
STATUS_UPDATE |
상태 업데이트에 대한 댓글 |
응답 필드
뮤테이션은 포괄적인 세부정보가 포함된 Comment 객체를 반환합니다:
필드 | 유형 | 설명 |
---|---|---|
id |
ID! | 댓글의 고유 식별자 |
uid |
String! | 대체 고유 식별자 |
html |
String! | 댓글의 HTML 콘텐츠 |
text |
String! | 댓글의 일반 텍스트 버전 |
category |
CommentCategory! | 댓글이 달린 엔터티의 유형 |
createdAt |
DateTime! | 댓글이 생성된 시간 |
updatedAt |
DateTime! | 댓글이 마지막으로 업데이트된 시간 |
deletedAt |
DateTime | 댓글이 삭제된 시간 (활성인 경우 null) |
deletedBy |
User | 댓글을 삭제한 사용자 |
user |
User! | 댓글을 생성한 사용자 |
activity |
Activity | 관련 활동 레코드 |
discussion |
Discussion | 관련 토론 (카테고리가 DISCUSSION인 경우) |
statusUpdate |
StatusUpdate | 관련 상태 업데이트 (카테고리가 STATUS_UPDATE인 경우) |
todo |
Todo | 관련 레코드 (카테고리가 TODO인 경우) |
isRead |
Boolean | 현재 사용자가 이 댓글을 읽었는지 여부 |
isSeen |
Boolean | 현재 사용자가 이 댓글을 보았는지 여부 |
aiSummary |
Boolean | 이 댓글이 AI에 의해 생성되었는지 여부 |
필수 권한
사용자는 레코드에 댓글을 달기 위해 적절한 프로젝트 접근 권한을 가져야 합니다:
접근 수준 | 댓글 추가 가능 |
---|---|
OWNER |
✅ 예 |
ADMIN |
✅ 예 |
MEMBER |
✅ 예 |
CLIENT |
✅ 예 |
COMMENT_ONLY |
✅ 예 |
VIEW_ONLY |
❌ 아니오 |
중요: 사용자는 레코드가 포함된 프로젝트의 구성원이어야 하며 VIEW_ONLY
접근 수준을 가져서는 안 됩니다.
오류 응답
UnauthorizedError
{
"errors": [{
"message": "You don't have permission to comment on this record",
"extensions": {
"code": "FORBIDDEN"
}
}]
}
언제: 사용자가 지정된 레코드/엔터티에 댓글을 달 권한이 없습니다.
ValidationError
{
"errors": [{
"message": "Invalid input parameters",
"extensions": {
"code": "BAD_USER_INPUT"
}
}]
}
언제: 필수 필드가 누락되었거나 잘못된 데이터가 포함되어 있습니다.
CommentNotFoundError
{
"errors": [{
"message": "Record not found",
"extensions": {
"code": "COMMENT_NOT_FOUND"
}
}]
}
언제: 지정된 categoryId
가 기존 레코드에 해당하지 않습니다.
UserInputError
{
"errors": [{
"message": "Content validation failed",
"extensions": {
"code": "BAD_USER_INPUT"
}
}]
}
언제: HTML 콘텐츠의 정리가 실패했거나 악성 코드가 포함되어 있습니다.
중요 사항
콘텐츠 처리
- HTML 정리: 모든 HTML 콘텐츠는 XSS 공격을 방지하기 위해 자동으로 정리됩니다.
- 파일 추출: HTML에 포함된 이미지 및 첨부 파일은 추출되어 S3에 저장됩니다.
- TipTap 모드:
tiptap: true
일 때, TipTap 편집기 콘텐츠에 대한 전문 정리를 사용합니다. - @멘션: 댓글에서 사용자 멘션은 자동으로 처리되며 알림을 트리거합니다.
성능 고려 사항
- 댓글은 자동으로 검색을 위해 인덱싱됩니다.
- 큰 이미지 첨부 파일은 비동기적으로 처리됩니다.
- 각 댓글은 프로젝트 타임라인에 대한 활동 레코드를 생성합니다.
부작용
댓글을 추가하면 여러 자동화된 프로세스가 트리거됩니다:
- 활동 생성: 프로젝트 타임라인에 표시되는 활동 레코드를 생성합니다.
- 검색 인덱싱: 댓글 콘텐츠가 프로젝트 검색 인덱스에 추가됩니다.
- 알림: 관련 사용자에게 이메일, 푸시 및 앱 내 알림을 보냅니다.
- 실시간 업데이트: 댓글이 GraphQL 구독에 게시되어 실시간 업데이트를 제공합니다.
- 웹훅: 프로젝트에 대해 구성된 경우 외부 웹훅을 트리거합니다.
- @멘션 처리: 사용자 멘션을 처리하고 대상 알림을 보냅니다.
- 파일 처리: HTML 콘텐츠에서 포함된 이미지나 파일을 추출하고 처리합니다.
콘텐츠 보안
- 모든 HTML은 업계 표준 라이브러리를 사용하여 정리됩니다.
- 파일 업로드는 유형 및 크기에 대해 검증됩니다.
- 악성 콘텐츠는 자동으로 제거됩니다.
- 사용자 생성 콘텐츠는 모든 컨텍스트에서 적절하게 이스케이프됩니다.
통합 기능
- 활동 피드: 댓글은 프로젝트 활동 타임라인에 표시됩니다.
- 검색: 댓글 콘텐츠는 프로젝트 내에서 검색 가능합니다.
- 알림: 다양한 댓글 유형에 대한 구성 가능한 알림 기본 설정이 있습니다.
- 실시간: 댓글은 동일한 레코드를 보는 다른 사용자에게 즉시 표시됩니다.
- 모바일 지원: 댓글은 모바일 애플리케이션에서 완전히 지원됩니다.
관련 엔드포인트
- 댓글 목록: 레코드에 대한 기존 댓글을 검색합니다.
- 댓글 업데이트: 기존 댓글 콘텐츠를 수정합니다.
- 댓글 삭제: 적절한 권한으로 댓글을 제거합니다.
- 레코드 목록: 댓글을 달 수 있는 레코드를 찾기 위해 할 일을 검색합니다.