GraphQL スキーマ設計¶
概要¶
VendureのGraphQL APIスキーマとカスタム拡張の設計書です。
スキーマ設計原則¶
- 型安全性: TypeScript型定義との完全な一致
- 効率性: N+1問題を避けるDataLoaderパターンの活用
- セキュリティ: 適切な認可制御とレート制限
- 拡張性: プラグインによる段階的なスキーマ拡張
主要なカスタムタイプ¶
B2B顧客管理¶
type B2BCustomer {
id: ID!
company: String!
customerStatus: CustomerStatusType!
discountRate: Float!
creditLimit: Float!
purchaseRestrictions: [PurchaseRestriction!]!
}
enum CustomerStatusType {
PREMIUM
STANDARD
LIMITED
# ... 他12種類
}
キャンペーン管理¶
type Campaign {
id: ID!
name: String!
type: CampaignType!
conditions: [CampaignCondition!]!
benefits: [CampaignBenefit!]!
startDate: DateTime!
endDate: DateTime!
isActive: Boolean!
}
enum CampaignType {
PERCENTAGE_DISCOUNT
FIXED_AMOUNT_DISCOUNT
FREE_SHIPPING
GIFT_PRODUCT
VOLUME_DISCOUNT
LOYALTY_POINTS
}
直送モード¶
type DirectShippingMode {
isEnabled: Boolean!
surchargeRate: Float! # 10%
applicableProducts: [Product!]!
restrictions: [ShippingRestriction!]!
}
カスタムResolver¶
顧客別価格計算¶
extend type Product {
customerSpecificPrice(customerId: ID!): Money!
volumeDiscountTiers: [VolumeTier!]!
}
type VolumeTier {
minQuantity: Int!
discountRate: Float!
}
月次割戻金計算¶
type MonthlyRebate {
customerId: ID!
period: String!
totalPurchaseAmount: Money!
rebateAmount: Money!
rebateRate: Float!
}
extend type Query {
calculateMonthlyRebate(customerId: ID!, period: String!): MonthlyRebate!
}
セキュリティとパフォーマンス¶
認証・認可¶
- JWT トークンベース認証
- 顧客ステータスに基づく権限制御
- 商品・価格情報への顧客別アクセス制御
レート制限¶
- IPアドレス単位: 1000 requests/hour
- 認証済みユーザー: 5000 requests/hour
- 管理者: 無制限
キャッシュ戦略¶
- Redis を使用した結果キャッシュ
- 商品情報: 30分キャッシュ
- 価格情報: 10分キャッシュ
- 在庫情報: リアルタイム
スキーマ生成¶
Vendure CLI v3.5.0 による自動生成¶
# 全スキーマ生成
pnpm run schema:generate
# 個別生成
pnpm run schema:admin
pnpm run schema:shop
出力先: packages/contract/schema/
admin.graphql- Admin API スキーマshop.graphql- Shop API スキーマ
新機能 (v3.5.0)¶
- サーバー起動不要: 設定ファイルから直接スキーマ生成
- Monorepo対応: 複数設定ファイルの自動検出
- IDE統合: GraphQLプラグインでの自動補完
今後の作業¶
- 完全なスキーマ定義ファイルの作成 (Vendure CLI自動生成)
- Resolver実装仕様書の作成
- API テストスイートの作成
- パフォーマンステスト計画書の作成