Bỏ qua điều hướng

Prompt miễn phí

GraphQL: Thiết kế schema cho danh mục sản phẩm

Xây dựng schema GraphQL cho danh mục sản phẩm, gồm query, mutation, resolver và lưu ý tối ưu truy vấn.

Onter AdminCập nhật 09/10/2026 Mới · Chưa có đánh giá 0 lượt copy
CodingChatGPTClaudeCodex

Prompt dùng để làm gì?

Xây dựng schema GraphQL cho danh mục sản phẩm, gồm query, mutation, resolver và lưu ý tối ưu truy vấn.

Điền thông tin của bạn

Prompt

Thiết kế schema GraphQL danh mục phân cấp, kèm query/mutation và resolver kiểm slug, cycle, pagination. ĐẦU VÀO - Yêu cầu dữ liệu cần truy xuất: {{yeu_cau_du_lieu}} CÁCH LÀM VÀ OUTPUT SDL thực parse; create/update/delete có resolver; delete chặn child/product. GIỚI HẠN 8 graphql-core in-memory cases đã chạy. Resolver list không phải production DB, chưa benchmark N+1, auth/depth/cost và pagination lớn.
Xem đã lưu

Input mẫu

{
  "yeu_cau_du_lieu": "Category id/slug/name/parentId/status; slug unique; filter/search/order/offset limit1..10; create/update/delete; chặn cycle, xóa category có child/product"
}

Output mẫu

from graphql import build_schema,graphql_sync
SDL='''enum Status { ACTIVE DRAFT }
enum Sort { ID_ASC NAME_ASC NAME_DESC }
type Category { id: ID!, slug: String!, name: String!, parentId: ID, status: Status! }
input CategoryInput { id: ID!, slug: String!, name: String!, parentId: ID, status: Status = ACTIVE }
input CategoryUpdateInput { slug: String, name: String, parentId: ID, status: Status }
type CategoryPayload { category: Category! }
type Product { id: ID!, name: String!, categoryId: ID!, status: Status! }
type ProductPage { items: [Product!]!, nextOffset: Int }
type Query { categories(search: String, status: Status, offset: Int = 0, limit: Int = 10, order: Sort = ID_ASC): [Category!]!, products(search: String, status: Status, offset: Int = 0, limit: Int = 2): ProductPage! }
type Mutation { createProduct(id: ID!, name: String!, categoryId: ID!, status: Status!): Product!
 createCategory(input: CategoryInput!): CategoryPayload!
 updateCategory(id: ID!, input: CategoryUpdateInput!): CategoryPayload!
 deleteCategory(id: ID!): Boolean! }
'''

def schema_fixture():
 cats=[{'id':'c1','slug':'books','name':'Books','parentId':None,'status':'ACTIVE'},{'id':'c2','slug':'children','name':'Children','parentId':'c1','status':'ACTIVE'}]
 products=[{'id':'p1','name':'Blue Book','categoryId':'c2','status':'ACTIVE'},{'id':'p2','name':'Green Book','categoryId':'c1','status':'DRAFT'},{'id':'p3','name':'Red Book','categoryId':'c2','status':'ACTIVE'}]
 schema=build_schema(SDL)
 def query(_source,info,search=None,status=None,offset=0,limit=2):
  if offset<0 or not 1<=limit<=10:raise ValueError('INVALID_PAGINATION')
  rows=sorted([p for p in products if (not search or search.lower()in p['name'].lower())and(not status or p['status']==status)],key=lambda p:p['id']);end=offset+limit
  return {'items':rows[offset:end],'nextOffset':end if end<len(rows)else None}
 def create(_source,info,id,name,categoryId,status):
  if any(p['id']==id for p in products):raise ValueError('DUPLICATE_ID')
  if not any(c['id']==categoryId for c in cats):raise ValueError('CATEGORY_NOT_FOUND')
  if not name.strip():raise ValueError('EMPTY_NAME')
  p=dict(id=id,name=name,categoryId=categoryId,status=status);products.append(p);return p
 def categories(s,i,search=None,status=None,offset=0,limit=10,order='ID_ASC'):
  if offset<0 or not 1<=limit<=10:raise ValueError('INVALID_PAGINATION')
  rows=[c for c in cats if(not search or search.lower()in c['name'].lower())and(not status or c['status']==status)]
  rows=sorted(rows,key=lambda c:c['id']if order=='ID_ASC'else c['name'],reverse=order=='NAME_DESC');return rows[offset:offset+limit]
 def check_category(candidate):
  import re
  if not candidate['name'].strip():raise ValueError('EMPTY_NAME')
  if not re.fullmatch('[a-z0-9]+(?:-[a-z0-9]+)*',candidate['slug']):raise ValueError('INVALID_SLUG')
  if any(c['slug']==candidate['slug']and c['id']!=candidate['id']for c in cats):raise ValueError('DUPLICATE_SLUG')
  parent=candidate.get('parentId');seen={candidate['id']}
  while parent:
   if parent in seen:raise ValueError('PARENT_CYCLE')
   seen.add(parent);record=next((c for c in cats if c['id']==parent),None)
   if record is None:raise ValueError('PARENT_NOT_FOUND')
   parent=record.get('parentId')
 def create_category(s,i,input):
  if any(c['id']==input['id']for c in cats):raise ValueError('DUPLICATE_ID')
  candidate={'parentId':None,'status':'ACTIVE'};candidate.update(input);check_category(candidate);cats.append(candidate);return {'category':candidate}
 def update_category(s,i,id,input):
  old=next((c for c in cats if c['id']==id),None)
  if old is None:raise ValueError('CATEGORY_NOT_FOUND')
  candidate=dict(old);candidate.update(input);check_category(candidate);old.update(candidate);return {'category':old}
 def delete_category(s,i,id):
  old=next((c for c in cats if c['id']==id),None)
  if old is None:raise ValueError('CATEGORY_NOT_FOUND')
  if any(c.get('parentId')==id for c in cats):raise ValueError('HAS_CHILDREN')
  if any(p['categoryId']==id for p in products):raise ValueError('HAS_PRODUCTS')
  cats.remove(old);return True
 schema.get_type('Query').fields['categories'].resolve=categories
 schema.get_type('Query').fields['products'].resolve=query
 schema.get_type('Mutation').fields['createProduct'].resolve=create
 schema.get_type('Mutation').fields['createCategory'].resolve=create_category
 schema.get_type('Mutation').fields['updateCategory'].resolve=update_category
 schema.get_type('Mutation').fields['deleteCategory'].resolve=delete_category
 return schema

# Query thực thi:
# {categories(status:ACTIVE,order:NAME_ASC){id slug parentId}}
# c1/books/null; c2/children/c1
# create c3/tools ->OK; duplicate slug ->DUPLICATE_SLUG; parent cycle ->PARENT_CYCLE.

Cách sử dụng

Thiết kế schema GraphQL danh mục phân cấp, kèm query/mutation và resolver kiểm slug, cycle, pagination. Điền tất cả input bắt buộc; ví dụ bên dưới là dữ liệu synthetic. Đối chiếu output với hợp đồng: SDL thực parse; create/update/delete có resolver; delete chặn child/product. 8 graphql-core in-memory cases đã chạy. Resolver list không phải production DB, chưa benchmark N+1, auth/depth/cost và pagination lớn.

Giải thích cấu trúc

Task
Thiết kế schema GraphQL danh mục phân cấp, kèm query/mutation và resolver kiểm slug, cycle, pagination.
Verification
SDL thực parse; create/update/delete có resolver; delete chặn child/product.
Limitations
8 graphql-core in-memory cases đã chạy. Resolver list không phải production DB, chưa benchmark N+1, auth/depth/cost và pagination lớn.
Model metadata
Các model tag hiện hữu là môi trường gợi ý, không chứng nhận đã benchmark từng model/version. Kiểm availability và capability trước dùng.

Mẹo sử dụng

  • SDL thực parse; create/update/delete có resolver; delete chặn child/product.
  • 8 graphql-core in-memory cases đã chạy. Resolver list không phải production DB, chưa benchmark N+1, auth/depth/cost và pagination lớn.
  • Dữ liệu ví dụ là synthetic; không đưa token, PII hay dữ liệu khách hàng vào input công khai.

Nguồn và giấy phép

ONTER biên tập · original

Đánh giá prompt

Chọn số sao theo trải nghiệm của bạn. Bạn có thể sửa đánh giá sau một phút.

Prompt liên quan

KHÁM PHÁ ONTER

Tìm kiếm trên Onter

Nhập từ khóa để tìm nội dung phù hợp

↑ ↓ chọn · Enter mở · Esc đóngXem tất cả kết quả →

Tài khoản Onter

Đăng nhập rồi tiếp tục việc đang làm.

Mở trang đăng nhập riêng nếu trình duyệt chưa hiển thị biểu mẫu.

Contact Me on Zalo