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.
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
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
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
Thiết kế kiến trúc tách lớp cho ứng dụng nhỏ dễ bảo trì
Đề xuất cách tách controller, service, repository, cấu trúc thư mục và luồng gọi cho một ứng dụng nhỏ.
Phân tích và giảm thiểu rủi ro từ dữ liệu đầu vào
Rà soát mã xử lý input để phát hiện chèn lệnh, path traversal và đề xuất chỉnh sửa an toàn theo bối cảnh thực tế.
Soát lỗi logic trong chuỗi if-else phức tạp
Kiểm tra khối điều kiện dài để tìm lỗi logic, làm rõ nhánh biên và đề xuất viết lại dễ hiểu hơn kèm test liên quan.
Viết hàm xử lý dữ liệu đầu vào không tin cậy
Tạo hàm an toàn để kiểm tra, làm sạch, chuẩn hóa và bắt lỗi dữ liệu từ nguồn ngoài trước khi xử lý.
