تعریف ساده Schemaهای GraphQL برای User و Task
ابتدا Typeهای GraphQL را بدون هیچ ولیدیشنی تعریف میکنیم. هدف این است که ساختار دادهها مشخص شود و توسعهدهنده Frontend بداند چه فیلدهایی در دسترس است.
# graphql/users.py
import strawberry
@strawberry.type
class UserType:
"""
GraphQL Type برای کاربران
فیلدها:
- id: شناسه یکتا
- email: ایمیل کاربر
- password: رمز عبور (در برخی سناریوها ممکن است به دلایل امنیتی حذف شود)
- created_at: تاریخ ایجاد کاربر
- updated_at: تاریخ آخرین تغییر
"""
id: int
email: str
password: str
created_at: str
updated_at: str | None
# graphql/tasks.py
import strawberry
@strawberry.type
class TaskType:
"""
GraphQL Type برای تسکها
فیلدها:
- id: شناسه یکتا
- title: عنوان تسک
- description: توضیحات (اختیاری)
- is_completed: وضعیت تکمیل شدن
- created_at: تاریخ ایجاد تسک
- updated_at: تاریخ آخرین تغییر
- owner_id: شناسه کاربری که تسک را ایجاد کرده
"""
id: int
title: str
description: str | None
is_completed: bool
created_at: str
updated_at: str | None
owner_id: int
این تعریف ساده است و در مراحل بعد میتوانیم Query و Mutation اضافه کنیم تا دادهها از دیتابیس خوانده یا ایجاد شوند.
افزودن ولیدیشن ساده به Schemaها
حالا همان Typeها را با ولیدیشنهای ابتدایی تکمیل میکنیم تا مطمئن شویم دادههای ورودی حداقل قوانین اولیه را رعایت میکنند. این ولیدیشنها در Strawberry میتوانند با استفاده از strawberry.field
و resolver اعمال شوند.
# graphql/users.py
import strawberry
def validate_email(email: str) -> str:
if "@" not in email:
raise ValueError("Email must contain '@'")
return email
def validate_password(password: str) -> str:
if len(password) < 6:
raise ValueError("Password must be at least 6 characters long")
return password
@strawberry.type
class UserType:
id: int
email: strawberry.field(resolver=validate_email)
password: strawberry.field(resolver=validate_password)
created_at: str
updated_at: str | None
# graphql/tasks.py
import strawberry
def validate_title(title: str) -> str:
if not title or len(title.strip()) == 0:
raise ValueError("Title cannot be empty")
return title
@strawberry.type
class TaskType:
id: int
title: strawberry.field(resolver=validate_title)
description: str | None
is_completed: bool
created_at: str
updated_at: str | None
owner_id: int
با این روش، Schemaها ابتدا ساده و قابل فهم هستند و سپس ولیدیشن ابتدایی روی فیلدهای مهم اضافه شد تا دادههای ورودی حداقل شرایط اولیه را داشته باشند. این کار پایه را برای مراحل بعدی، مانند افزودن Query و Mutation آماده میکند.