Tài liệu

Blog có bình luận

Blog có bình luận Ví dụ này xây dựng luồng đọc bài viết công khai, bình luận của người dùng đã xác thực và đường dẫn kiểm duyệt dành cho quản trị viên. Table Tạo blog_post . Field hoặc relation Kiểu Ghi chú title string Bắt buộc slug string Duy nhất body rich text hoặc text Bắt b

Blog có bình luận

Ví dụ này xây dựng luồng đọc bài viết công khai, bình luận của người dùng đã xác thực và đường dẫn kiểm duyệt dành cho quản trị viên.

Table

Tạo blog_post.

Field hoặc relation Kiểu Ghi chú
title string Bắt buộc
slug string Duy nhất
body rich text hoặc text Bắt buộc
status select draft, published, archived
publishedAt datetime Không bắt buộc
author relation many-to-one tới enfyra_user Không cần inverse relation

Tạo blog_comment.

Field hoặc relation Kiểu Ghi chú
post relation many-to-one tới blog_post Bắt buộc
author relation many-to-one tới enfyra_user Bắt buộc
body text Bắt buộc
status select pending, approved, rejected

Thêm index cho blog_post.status,publishedAtblog_comment.post,status,createdAt.

Danh sách bài viết công khai

Cho phép công khai GET /blog_post, rồi thêm pre-hook để giới hạn người chưa đăng nhập chỉ đọc được bài đã publish.

if (@USER?.isRootAdmin) {
  return;
}

@QUERY.filter = {
  _and: [
    @QUERY.filter || {},
    { status: { _eq: 'published' } }
  ]
};

Đọc bài viết kèm bình luận đã duyệt

curl "$ENFYRA_API_URL/blog_post?filter={\"slug\":{\"_eq\":\"hello-enfyra\"}}&limit=1&fields=id,title,body,publishedAt,author.email&deep={\"comments\":{\"fields\":\"id,body,createdAt,author.email\",\"filter\":{\"status\":{\"_eq\":\"approved\"}},\"sort\":\"createdAt\"}}"

Relation key bên trong deep phải khớp với tên inverse relation đã cấu hình trên blog_comment.post. Nếu không tạo inverse relation, hãy tải bình luận bằng một lệnh GET /blog_comment riêng, lọc theo post.

Tạo bình luận

Thêm pre-hook cho POST /blog_comment.

if (!@USER?.id) {
  @THROW401();
}

if ([email protected]) {
  @THROW400('post is required');
}

@BODY.author = { id: @USER.id };
@BODY.status = 'pending';

Sau đó gọi table route.

curl "$ENFYRA_API_URL/blog_comment" \
  -X POST \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"post":{"id":12},"body":"This helped me understand hooks."}'

Kiểm duyệt bình luận

Cấp quyền PATCH /blog_comment cho moderator và giới hạn người dùng thông thường ở các bình luận của chính họ bằng PATCH pre-hook.

if (@USER?.isRootAdmin || @USER?.role?.name === 'moderator') {
  return;
}

@QUERY.filter = {
  _and: [
    @QUERY.filter || {},
    { author: { id: { _eq: @USER.id } } }
  ]
};