ウィッシュリストグループ管理

説明

ウィッシュリストグループ管理機能は、高度なサブスクリプション検証、クォータ強制、グループベースアクセス制御を備えた公式ウィッシュリストグループの包括的なCRUD操作を提供します。このシステムは本番ウィッシュリスト管理のコア基盤として機能し、適切なサブスクリプション課金統合と協力的なチームアクセスを確保します。

一時ウィッシュリスト管理とは異なり、この機能は厳格なサブスクリプションクォータを強制し、グループメンバーシップを検証し、完全な監査証跡を持つ永続的なレコードを維持します。システムはサブスクリプション課金サービスと統合して使用量を追跡し、サブスクリプション階層に基づく制限を強制します。

主要機能には以下が含まれます:

  • サブスクリプション検証付きの公式ウィッシュリストグループの作成
  • データ移行を伴う一時ウィッシュリストから公式ステータスへの変換
  • グループベースアクセス制御と協力の管理
  • サブスクリプションクォータと使用量追跡の強制
  • ページネーションとフィルタリングを備えた包括的な一覧表示
  • 監査証跡とステータス管理の維持

アクティビティ図

---
config:
  theme: base
  layout: dagre
  flowchart:
    curve: linear
    htmlLabels: true
  themeVariables:
    edgeLabelBackground: "transparent"
---
flowchart TB
    %% Main components
    UserRequest[ユーザーリクエスト]
    Database[(Database)]
    StripeAPI((Stripe API))
    
    subgraph Controllers
        WishlistController[WishlistToGroupController]
    end
    
    subgraph Services
        WishlistService(WishlistToGroupService)
        SubscriptionService(SubscriptionService)
        TempWishlistService(TempWishlistService)
    end
    
    subgraph Middleware
        AuthMiddleware{AuthMiddleware}
        GroupMiddleware{GroupMiddleware}
    end
    
    UserRequest --- Step1[
        <div style='text-align: center'>
            <span style='display: inline-block; background-color: #6699cc !important; color:white; width: 28px; height: 28px; line-height: 28px; border-radius: 50%; font-weight: bold'>1</span>
            <p style='margin-top: 8px'>認証・認可</p>
        </div>
    ]
    Step1 --> AuthMiddleware
    Step1 --> GroupMiddleware

    AuthMiddleware --- Step2[
        <div style='text-align: center'>
            <span style='display: inline-block; background-color: #6699cc !important; color:white; width: 28px; height: 28px; line-height: 28px; border-radius: 50%; font-weight: bold'>2</span>
            <p style='margin-top: 8px'>サブスクリプション検証・クォータチェック</p>
        </div>
    ]
    Step2 --> WishlistController
    WishlistController --> SubscriptionService
    SubscriptionService -.-> StripeAPI

    SubscriptionService --- Step3[
        <div style='text-align: center'>
            <span style='display: inline-block; background-color: #6699cc !important; color:white; width: 28px; height: 28px; line-height: 28px; border-radius: 50%; font-weight: bold'>3</span>
            <p style='margin-top: 8px'>データ処理・検証</p>
        </div>
    ]
    Step3 --> WishlistService
    WishlistService -.-> TempWishlistService

    WishlistService --- Step4[
        <div style='text-align: center'>
            <span style='display: inline-block; background-color: #6699cc !important; color:white; width: 28px; height: 28px; line-height: 28px; border-radius: 50%; font-weight: bold'>4</span>
            <p style='margin-top: 8px'>データベース操作・レスポンス</p>
        </div>
    ]
    Step4 --> Database

    %% Styling
    style UserRequest fill:#e6f3ff,stroke:#0066cc,stroke-width:2px
    style Database fill:#ffe6cc,stroke:#ff9900,stroke-width:2px
    style StripeAPI fill:#fcd9d9,stroke:#cc3333,stroke-width:2px
    style Controllers fill:#e6f3ff
    style Services fill:#f0f8e6
    style Middleware fill:#f5f0ff
    style Step1 fill:transparent,stroke:transparent,stroke-width:1px
    style Step2 fill:transparent,stroke:transparent,stroke-width:1px
    style Step3 fill:transparent,stroke:transparent,stroke-width:1px
    style Step4 fill:transparent,stroke:transparent,stroke-width:1px

詳細データフロー依存関係

ステップバイステッププロセス

ステップ1: 認証・認可

  • 説明: ウィッシュリスト操作のためのユーザー認証とグループメンバーシップを検証
  • アクション: ユーザーセッション認証、グループメンバーシップ検証、アクセス権限チェック
  • 入力: ユーザー認証情報、グループメンバーシップデータ、要求された操作タイプ
  • 出力: グループアクセス検証付きの認証されたユーザーコンテキスト
  • 依存関係: ユーザー認証サービス、グループメンバーシップ検証
  • 外部サービス: 認証プロバイダー、グループ管理サービス

ステップ2: サブスクリプション検証・クォータ強制

  • 説明: サブスクリプションステータスを検証し、ウィッシュリスト作成のクォータ制限を強制
  • アクション: サブスクリプション有効性チェック、現在の使用量計算、クォータ制限検証
  • 入力: サブスクリプション詳細、現在の使用量データ、要求されたリソース数
  • 出力: クォータ可用性付きのサブスクリプション検証結果
  • 依存関係: サブスクリプションサービス、クォータ計算サービス
  • 外部サービス: サブスクリプション課金システム、使用量追跡サービス

ステップ3: データ処理・検証

  • 説明: 一時変換または手動入力からのウィッシュリストデータを処理・検証
  • アクション: データ構造検証、一時データ変換、手動入力処理、データ整合性チェック
  • 入力: 一時ウィッシュリストデータまたは手動入力、検証ルール、データ制約
  • 出力: 作成準備完了の検証・構造化されたウィッシュリストデータ
  • 依存関係: データ検証サービス、一時ウィッシュリストサービス、サマリーテーブルサービス
  • 外部サービス: データ検証API、商品検証サービス

ステップ4: ウィッシュリスト作成・データベース操作

  • 説明: トランザクション安全性と関係管理を備えた公式ウィッシュリストを作成
  • アクション: ウィッシュリストレコード作成、関係確立、サマリーテーブル更新、スケジュール管理
  • 入力: 検証されたウィッシュリストデータ、グループコンテキスト、サブスクリプションバインディング
  • 出力: すべての関係とメタデータを持つ作成されたウィッシュリスト
  • 依存関係: データベーストランザクションサービス、関係管理、スケジュールサービス
  • 外部サービス: データベースクラスター、バックアップサービス、監査ログ

データベース関連テーブル・フィールド

データベース: gb_console

erDiagram
    wishlist_to_groups {
        bigint id PK
        bigint group_id FK
        bigint created_by FK
        bigint subscription_id FK
        string name "ウィッシュリストの名前"
        string slug "ウィッシュリストのスラッグ"
        integer status "0: 非アクティブ, 1: アクティブ, 3: キャンセル"
    }
    
    groups {
        bigint id PK
        string name
    }
    
    users {
        bigint id PK
        string name
    }
    
    subscriptions {
        bigint id PK
        string name
    }
    
    wishlist_to_groups }|--|| groups : "所属"
    wishlist_to_groups }|--|| users : "作成者"
    wishlist_to_groups }|--|| subscriptions : "所属"

ケースドキュメント

ケース1: ウィッシュリストグループ一覧

API: ウィッシュリストグループ一覧

シーケンス図

sequenceDiagram
    participant Client
    participant Controller as WishlistToGroupController
    participant Service as WishlistToGroupService
    participant Repository as WishlistToGroupRepository
    participant Database
    
    Note over Client,Database: ウィッシュリストグループ一覧フロー
    
    rect rgb(255, 255, 200)
    Note right of Client: 認証フェーズ
    Client->>Controller: GET /api/v1/wishlist-to-group
    Controller->>Controller: ユーザー認証
    Controller->>Controller: グループメンバーシップ検証
    end
    
    rect rgb(200, 230, 255)
    Note right of Controller: 検証フェーズ
    Controller->>Service: list(params)
    Service->>Service: クエリパラメータ検証
    Service->>Service: デフォルトフィルタ適用
    end
    
    rect rgb(200, 255, 255)
    Note right of Service: ビジネスロジックフェーズ
    Service->>Repository: findWhere(conditions)
    Service->>Service: グループフィルタ適用
    Service->>Service: ステータスフィルタ適用
    Service->>Service: ページネーション適用
    end
    
    rect rgb(230, 200, 255)
    Note right of Repository: データベースフェーズ
    Repository->>Database: JOINを含むSELECT
    Database-->>Repository: ウィッシュリストレコード
    Repository-->>Service: ページネーションコレクション
    end
    
    rect rgb(200, 255, 200)
    Note right of Service: 成功レスポンス
    Service-->>Controller: LengthAwarePaginator
    Controller->>Controller: リソースに変換
    Controller-->>Client: ページネーション付きJSONレスポンス
    end

ステップ

  1. 認証: ユーザーセッションとグループメンバーシップを検証
  2. パラメータ検証: クエリパラメータ(page, per_page, status)を検証
  3. フィルタ適用: グループベースフィルタリングとステータスフィルタリングを適用
  4. データベースクエリ: 適切なJOINを含むページネーションクエリを実行
  5. レスポンスフォーマット: ページネーションメタデータ付きのAPIリソースに結果を変換

エラーハンドリング

  • 401 Unauthorized: 無効または欠落した認証
  • 403 Forbidden: ユーザーがどのグループのメンバーでもない
  • 400 Bad Request: 無効なクエリパラメータ
  • 500 Internal Server Error: データベースまたはシステムエラー

ケース2: ウィッシュリストグループ作成

API: ウィッシュリストグループ作成

シーケンス図

sequenceDiagram
    participant Client
    participant Controller as WishlistToGroupController
    participant Service as WishlistToGroupService
    participant SubService as SubscriptionService
    participant TempService as TempWishlistService
    participant Repository as WishlistToGroupRepository
    participant Database
    
    Note over Client,Database: ウィッシュリストグループ作成フロー
    
    rect rgb(255, 255, 200)
    Note right of Client: 認証フェーズ
    Client->>Controller: POST /api/v1/wishlist-to-group
    Controller->>Controller: ユーザー認証
    Controller->>Controller: グループメンバーシップ検証
    end
    
    rect rgb(200, 230, 255)
    Note right of Controller: 検証フェーズ
    Controller->>Controller: リクエストデータ検証
    Controller->>Service: create(validatedData)
    Service->>Service: リクエストからデータ準備
    end
    
    rect rgb(255, 230, 200)
    Note right of Service: サブスクリプション検証
    Service->>SubService: validateSubscription(group)
    SubService->>SubService: サブスクリプションステータスチェック
    SubService->>SubService: クォータ制限チェック
    SubService-->>Service: 検証結果
    end
    
    rect rgb(200, 255, 255)
    Note right of Service: データ処理
    alt 一時ウィッシュリスト変換
        Service->>TempService: loadTempWishlist(id)
        TempService-->>Service: 一時ウィッシュリストデータ
        Service->>Service: convertTempToOfficial(data)
    else 手動作成
        Service->>Service: processManualData(data)
    end
    end
    
    rect rgb(230, 200, 255)
    Note right of Service: データベーストランザクション
    Service->>Repository: beginTransaction()
    Service->>Repository: create(wishlistData)
    Repository->>Database: INSERT wishlist_to_groups
    Service->>Service: createRelatedData(products, categories, queries)
    Service->>SubService: updateUsageQuota(subscription)
    Service->>Repository: commit()
    end
    
    rect rgb(200, 255, 200)
    Note right of Repository: 成功レスポンス
    Repository-->>Service: 作成されたウィッシュリスト
    Service-->>Controller: 成功結果
    Controller->>Controller: リソースに変換
    Controller-->>Client: 作成データ付きJSONレスポンス
    end
    
    rect rgb(255, 200, 200)
    Note right of Service: エラーハンドリング
    alt サブスクリプションエラー
        SubService-->>Service: サブスクリプション無効
        Service-->>Controller: サブスクリプションエラー
    else クォータ超過
        SubService-->>Service: クォータ超過
        Service-->>Controller: クォータエラー
    else データベースエラー
        Repository-->>Service: データベースエラー
        Service->>Repository: rollback()
        Service-->>Controller: 作成エラー
    end
    Controller-->>Client: エラーレスポンス
    end

ステップ

  1. 認証・認可: ユーザーとグループメンバーシップを検証
  2. リクエスト検証: 入力データ構造と制約を検証
  3. サブスクリプション検証: サブスクリプションステータスとクォータ制限をチェック
  4. データ準備: 一時変換または手動入力データを処理
  5. クォータ計算: リソース使用量を計算し制限に対して検証
  6. データベーストランザクション: トランザクション安全性でウィッシュリストと関連データを作成
  7. 使用量更新: サブスクリプション使用量カウンターを更新
  8. レスポンス生成: 適切なフォーマットで作成されたウィッシュリストを返却

エラーハンドリング

  • 401 Unauthorized: 無効な認証
  • 403 Forbidden: グループアクセス拒否
  • 400 Bad Request: 無効な入力データまたは検証エラー
  • 402 Payment Required: サブスクリプション期限切れまたは無効
  • 409 Conflict: クォータ超過またはリソース制限
  • 500 Internal Server Error: データベースまたはシステムエラー

ケース3: ウィッシュリストグループ表示

API: ウィッシュリストグループ表示

シーケンス図

sequenceDiagram
    participant Client
    participant Controller as WishlistToGroupController
    participant Repository as WishlistToGroupRepository
    participant Database
    
    Note over Client,Database: ウィッシュリストグループ表示フロー
    
    rect rgb(255, 255, 200)
    Note right of Client: 認証フェーズ
    Client->>Controller: GET /api/v1/wishlist-to-group/{slug}
    Controller->>Controller: ユーザー認証
    Controller->>Controller: グループメンバーシップ検証
    end
    
    rect rgb(200, 230, 255)
    Note right of Controller: 検証フェーズ
    Controller->>Repository: findBySlug(slug)
    Repository->>Database: スラッグでSELECT
    Database-->>Repository: ウィッシュリストレコード
    Repository-->>Controller: ウィッシュリストまたはnull
    end
    
    rect rgb(200, 255, 255)
    Note right of Controller: 認可チェック
    alt ウィッシュリスト見つかった
        Controller->>Controller: グループアクセスチェック
        alt アクセス許可
            Controller->>Controller: 関連データ読み込み
        else アクセス拒否
            Controller-->>Client: 404 Not Found
        end
    else ウィッシュリスト見つからない
        Controller-->>Client: 404 Not Found
    end
    end
    
    rect rgb(200, 255, 200)
    Note right of Controller: 成功レスポンス
    Controller->>Controller: リソースに変換
    Controller-->>Client: ウィッシュリストデータ付きJSONレスポンス
    end

ステップ

  1. 認証: ユーザーセッションを検証
  2. ウィッシュリスト検索: スラッグでウィッシュリストを検索
  3. 認可: ユーザーがウィッシュリストのグループにアクセス権を持つことを確認
  4. データ読み込み: 関連データと関係を読み込み
  5. レスポンスフォーマット: APIリソース形式に変換

エラーハンドリング

  • 401 Unauthorized: 無効な認証
  • 404 Not Found: ウィッシュリストが見つからないまたはアクセス拒否
  • 500 Internal Server Error: データベースまたはシステムエラー