conditional-operations.json•7.24 kB
{
  "schema": "memory_document_v1",
  "metadata": {
    "title": "conditional-operations.json",
    "documentType": "generic",
    "path": "usecases/conditional-operations.json",
    "tags": [],
    "lastModified": "2025-03-24T12:42:38.385Z"
  },
  "content": {
    "text": "{\n  \"schema\": \"memory_document_v2\",\n  \"metadata\": {\n    \"id\": \"diff-edit-usecases-conditional\",\n    \"title\": \"JSONパッチ - 条件付き操作ユースケース\",\n    \"documentType\": \"usecases\",\n    \"path\": \"usecases/conditional-operations.json\",\n    \"tags\": [\n      \"json-patch\",\n      \"usecases\",\n      \"rfc6902\",\n      \"document-editing\",\n      \"conditional-operations\"\n    ],\n    \"lastModified\": \"2025-03-24T22:05:00.000Z\",\n    \"createdAt\": \"2025-03-24T22:05:00.000Z\",\n    \"version\": 1\n  },\n  \"content\": {\n    \"usecases\": [\n      {\n        \"id\": \"UC-6\",\n        \"title\": \"条件付きパッチ操作の実行\",\n        \"description\": \"ドキュメントの現在の状態をテストした上でパッチを適用し、特定の条件が満たされている場合のみ更新を行います。\",\n        \"actors\": [\"開発者\", \"APIクライアント\"],\n        \"preconditions\": [\n          \"対象のJSONドキュメントが存在していること\",\n          \"ユーザーが対象ドキュメントへの書き込み権限を持っていること\"\n        ],\n        \"mainFlow\": [\n          \"1. ユーザーがドキュメントID、テスト条件、更新操作を指定\",\n          \"2. システムが対象ドキュメントを取得\",\n          \"3. まずテスト操作(test)を適用して条件をチェック\",\n          \"4. テストが成功した場合、残りの更新操作を適用\",\n          \"5. 更新されたドキュメントの保存\",\n          \"6. 結果の返却\"\n        ],\n        \"alternativeFlows\": [\n          {\n            \"id\": \"UC-6-A1\",\n            \"title\": \"テスト条件が失敗した場合\",\n            \"steps\": [\n              \"3a. 指定されたテスト条件が現在のドキュメント状態と一致しない\",\n              \"3b. TestFailedErrorを返却\",\n              \"3c. 更新操作は実行されず、ドキュメントは変更されない\"\n            ]\n          }\n        ],\n        \"postconditions\": [\n          \"テスト条件が満たされた場合のみ更新操作が適用されている\",\n          \"条件が満たされなかった場合はドキュメントが変更されていない\",\n          \"操作の結果とテスト条件が記録されている\"\n        ],\n        \"examples\": [\n          {\n            \"description\": \"ドキュメントのバージョンを確認してから更新するケース\",\n            \"request\": {\n              \"documentId\": \"system-patterns-123\",\n              \"operations\": [\n                {\"op\": \"test\", \"path\": \"/metadata/version\", \"value\": 3},\n                {\"op\": \"replace\", \"path\": \"/metadata/version\", \"value\": 4},\n                {\"op\": \"add\", \"path\": \"/content/technicalDecisions/-\", \"value\": {\"id\": \"new-decision\"}}\n              ]\n            },\n            \"response\": {\n              \"success\": true,\n              \"document\": {\n                \"metadata\": {\n                  \"version\": 4\n                },\n                \"content\": {\n                  \"technicalDecisions\": [\n                    \"...\": \"既存の決定事項\",\n                    {\"id\": \"new-decision\"}\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"description\": \"バージョンチェックが失敗した場合\",\n            \"request\": {\n              \"documentId\": \"system-patterns-123\",\n              \"operations\": [\n                {\"op\": \"test\", \"path\": \"/metadata/version\", \"value\": 3},\n                {\"op\": \"replace\", \"path\": \"/metadata/version\", \"value\": 4}\n              ]\n            },\n            \"response\": {\n              \"success\": false,\n              \"error\": {\n                \"code\": \"TEST_FAILED\",\n                \"message\": \"テスト操作が失敗しました: パス '/metadata/version' の値が期待値 '3' と一致しません(実際の値: '2')\",\n                \"operationIndex\": 0\n              }\n            }\n          }\n        ]\n      }\n    ],\n    \"implementationNotes\": {\n      \"keyPoints\": [\n        \"RFC 6902で定義されているテスト操作('test')を使用して条件付き更新を実装\",\n        \"複数のテスト条件を組み合わせることも可能\",\n        \"テスト条件と更新操作を一つのアトミックな操作セットとして扱う\"\n      ],\n      \"testOperation\": {\n        \"description\": \"テスト操作は指定されたパスの値が期待値と厳密に等しいかどうかを検証します\",\n        \"syntax\": \"{ op: 'test', path: '/path/to/property', value: expectedValue }\",\n        \"behavior\": [\n          \"JSON値の厳密な等価性(===ではなくdeep equality)を使用\",\n          \"配列要素やネストされたオブジェクトもテスト可能\",\n          \"指定されたパスが存在しない場合はテスト失敗\",\n          \"配列では位置(インデックス)を指定してテスト\"\n        ]\n      },\n      \"commonUsePatterns\": {\n        \"optimisticConcurrency\": {\n          \"description\": \"楽観的並行制御による競合回避\",\n          \"pattern\": \"バージョン番号や最終更新日時をテストして、他のクライアントによる更新がないことを確認してから更新する\"\n        },\n        \"conditionalUpdate\": {\n          \"description\": \"特定の条件を満たす場合のみ更新\",\n          \"pattern\": \"状態やフラグをテストして、特定の条件下でのみ更新を許可する\"\n        },\n        \"complexConditions\": {\n          \"description\": \"複雑な条件によるロジック\",\n          \"pattern\": \"複数のテスト操作を組み合わせて、AND条件を表現(いずれかのテストが失敗すると全体が失敗)\"\n        }\n      },\n      \"limitationsAndConsiderations\": [\n        \"OR条件(いずれかが真)を直接表現する方法はない(複数のリクエストに分割する必要がある)\",\n        \"否定条件(値が特定の値でない)を直接表現できない\",\n        \"大規模なドキュメントでは、パスが深く複雑になる可能性がある\",\n        \"テスト操作はJSONの厳密な等価性を使用するため、数値型(例:整数 vs 浮動小数点)などに注意が必要\"\n      ],\n      \"securityConsiderations\": [\n        \"条件付き更新を使用して権限や所有権の確認を行うことも可能\",\n        \"例:ドキュメントの所有者IDが現在のユーザーIDと一致することをテスト\"\n      ]\n    }\n  }\n}"
  }
}