{
  "title": "CQRS Pattern",
  "description": "Command Query Responsibility Segregation pattern with separate read and write models",
  "type": "architecture-pattern",
  "data": {
    "nodes": [
      {
        "id": "query-get-user",
        "type": "query",
        "position": {
          "x": 50,
          "y": 100
        },
        "data": {
          "mode": "full",
          "message": {
            "id": "get-user-query",
            "name": "GET /users/{id}",
            "version": "1.0.0",
            "summary": "Query to retrieve user information from read model"
          },
          "editor": {
            "title": "Query",
            "subtitle": "Edit the details of the query",
            "schema": {
              "type": "object",
              "required": ["message", "mode"],
              "properties": {
                "message": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "Random value", "description": "The name of the service"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the service"}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 98},
        "selected": false,
        "dragging": false
      },
      {
        "id": "command-create-user",
        "type": "command",
        "position": {
          "x": 50,
          "y": 300
        },
        "data": {
          "mode": "full",
          "message": {
            "id": "create-user-command",
            "name": "CreateUser",
            "version": "1.0.0",
            "summary": "Command to create a new user in the write model"
          },
          "editor": {
            "title": "Command",
            "subtitle": "Edit the details of the command",
            "schema": {
              "type": "object",
              "required": ["message", "mode"],
              "properties": {
                "message": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "Random value", "description": "The name of the command"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the command"}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 98},
        "selected": false,
        "dragging": false
      },
      {
        "id": "service-query-handler",
        "type": "service",
        "position": {
          "x": 400,
          "y": 100
        },
        "data": {
          "mode": "full",
          "service": {
            "id": "query-handler",
            "name": "Query Handler",
            "owners": ["read-team"],
            "sends": [],
            "receives": ["GetUser", "GetUserList"],
            "version": "1.0.0",
            "summary": "Handles read queries and returns data from read model"
          },
          "editor": {
            "title": "Service",
            "subtitle": "Edit the details of the service",
            "schema": {
              "type": "object",
              "required": ["service", "mode"],
              "properties": {
                "service": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "Random value", "description": "The name of the service"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the service"}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 113},
        "selected": false,
        "dragging": false
      },
      {
        "id": "service-command-handler",
        "type": "service",
        "position": {
          "x": 400,
          "y": 300
        },
        "data": {
          "mode": "full",
          "service": {
            "id": "command-handler",
            "name": "Command Handler",
            "owners": ["write-team"],
            "sends": ["UserCreated", "UserUpdated", "UserDeleted"],
            "receives": ["CreateUser", "UpdateUser", "DeleteUser"],
            "version": "1.0.0",
            "summary": "Handles write commands and publishes domain events"
          },
          "editor": {
            "title": "Service",
            "subtitle": "Edit the details of the service",
            "schema": {
              "type": "object",
              "required": ["service", "mode"],
              "properties": {
                "service": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "Random value", "description": "The name of the service"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the service"}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 113},
        "selected": false,
        "dragging": false
      },
      {
        "id": "data-read-model",
        "type": "data",
        "position": {
          "x": 750,
          "y": 100
        },
        "data": {
          "mode": "full",
          "data": {
            "id": "read-model-db",
            "name": "Read Model (MongoDB)",
            "owners": ["read-team"],
            "schemas": [],
            "version": "1.0.0",
            "summary": "Optimized read database with denormalized views for fast queries",
            "type": "Database"
          },
          "editor": {
            "title": "Data Store",
            "subtitle": "Edit the details of the data store",
            "schema": {
              "type": "object",
              "required": ["data", "mode"],
              "properties": {
                "data": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "UserDatabase", "description": "The name of the data store"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the data store"},
                    "type": {"type": "string", "title": "Type", "default": "Database", "description": "The type of data store", "enum": ["Database", "Cache", "Queue", "File System", "Data Lake", "Data Warehouse"]}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 98},
        "selected": false,
        "dragging": false
      },
      {
        "id": "data-write-model",
        "type": "data",
        "position": {
          "x": 750,
          "y": 300
        },
        "data": {
          "mode": "full",
          "data": {
            "id": "write-model-db",
            "name": "Write Model (PostgreSQL)",
            "owners": ["write-team"],
            "schemas": [],
            "version": "1.0.0",
            "summary": "Transactional write database with normalized schema for consistency",
            "type": "Database"
          },
          "editor": {
            "title": "Data Store",
            "subtitle": "Edit the details of the data store",
            "schema": {
              "type": "object",
              "required": ["data", "mode"],
              "properties": {
                "data": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "UserDatabase", "description": "The name of the data store"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the data store"},
                    "type": {"type": "string", "title": "Type", "default": "Database", "description": "The type of data store", "enum": ["Database", "Cache", "Queue", "File System", "Data Lake", "Data Warehouse"]}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 98},
        "selected": false,
        "dragging": false
      },
      {
        "id": "event-user-created",
        "type": "event",
        "position": {
          "x": 1100,
          "y": 250
        },
        "data": {
          "mode": "full",
          "message": {
            "id": "user-created-event",
            "name": "UserCreated",
            "version": "1.0.0",
            "summary": "Domain event published after successful user creation"
          },
          "editor": {
            "title": "Event",
            "subtitle": "Edit the details of the event",
            "schema": {
              "type": "object",
              "required": ["message", "mode"],
              "properties": {
                "message": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "Random value", "description": "The name of the event"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the event"}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 98},
        "selected": false,
        "dragging": false
      },
      {
        "id": "service-projection",
        "type": "service",
        "position": {
          "x": 1100,
          "y": 50
        },
        "data": {
          "mode": "full",
          "service": {
            "id": "projection-service",
            "name": "Projection Service",
            "owners": ["read-team"],
            "sends": [],
            "receives": ["UserCreated", "UserUpdated", "UserDeleted"],
            "version": "1.0.0",
            "summary": "Updates read models based on domain events from write side"
          },
          "editor": {
            "title": "Service",
            "subtitle": "Edit the details of the service",
            "schema": {
              "type": "object",
              "required": ["service", "mode"],
              "properties": {
                "service": {
                  "type": "object",
                  "required": ["name", "version"],
                  "properties": {
                    "name": {"type": "string", "title": "Name", "default": "Random value", "description": "The name of the service"},
                    "version": {"type": "string", "title": "Version", "default": "1.0.0", "description": "The version number (e.g., 1.0.0)", "pattern": "^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[\\\\w.-]+)?(?:\\\\+[\\\\w.-]+)?$"},
                    "summary": {"type": "string", "title": "Summary", "default": "", "description": "A brief summary of the service"}
                  }
                }
              }
            }
          }
        },
        "measured": {"width": 262, "height": 98},
        "selected": false,
        "dragging": false
      },
      {
        "id": "note-cqrs-instructions",
        "type": "note",
        "position": {
          "x": 50,
          "y": 450
        },
        "data": {
          "text": "⚡ **CQRS Pattern**\n\nCommand Query Responsibility Segregation - separate read and write models:\n\n**📖 Read Side:** **Queries** → **Query Handler** → **Read Model (MongoDB)**\n**✏️ Write Side:** **Commands** → **Command Handler** → **Write Model (PostgreSQL)** → **Events** → **Projections**\n\n**Key Benefits:**\n• **Optimized models** - Read/write databases optimized for their use cases\n• **Scalability** - Independent scaling of read and write workloads\n• **Flexibility** - Different technologies for different needs\n• **Complex queries** - Rich read models with denormalized views\n\n**How it works:**\n1. **Commands** modify state via Command Handler\n2. **Write Model** stores normalized data\n3. **Domain Events** published after state changes\n4. **Projection Service** updates Read Models\n5. **Queries** served from optimized Read Models\n\n**💡 Pro tip:** Start simple - add CQRS when read/write patterns diverge significantly!",
          "color": "orange"
        },
        "measured": {"width": 350, "height": 280},
        "selected": false,
        "dragging": false,
        "width": 350,
        "height": 280,
        "resizing": false
      }
    ],
    "edges": [
      {
        "source": "query-get-user",
        "target": "service-query-handler",
        "label": "Query Request",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "data": {"source": "query", "target": "service", "message": {"collection": "queries", "opacity": 1}},
        "id": "xy-edge__query-get-user-service-query-handler"
      },
      {
        "source": "command-create-user",
        "target": "service-command-handler",
        "label": "Command Request",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "data": {"source": "command", "target": "service", "message": {"collection": "commands", "opacity": 1}},
        "id": "xy-edge__command-create-user-service-command-handler"
      },
      {
        "source": "service-query-handler",
        "target": "data-read-model",
        "label": "Reads From",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "data": {"source": "service", "target": "data", "message": {"collection": "data", "opacity": 1}},
        "id": "xy-edge__service-query-handler-data-read-model"
      },
      {
        "source": "service-command-handler",
        "target": "data-write-model",
        "label": "Writes To",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "data": {"source": "service", "target": "data", "message": {"collection": "data", "opacity": 1}},
        "id": "xy-edge__service-command-handler-data-write-model"
      },
      {
        "source": "service-command-handler",
        "target": "event-user-created",
        "label": "Publishes",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": true,
        "type": "animatedMessage",
        "data": {"source": "service", "target": "event", "message": {"collection": "events", "opacity": 1}},
        "id": "xy-edge__service-command-handler-event-user-created"
      },
      {
        "source": "event-user-created",
        "target": "service-projection",
        "label": "Consumed by",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": true,
        "type": "animatedMessage",
        "data": {"source": "event", "target": "service", "message": {"collection": "events", "opacity": 1}},
        "id": "xy-edge__event-user-created-service-projection"
      },
      {
        "source": "service-projection",
        "target": "data-read-model",
        "label": "Updates",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "data": {"source": "service", "target": "data", "message": {"collection": "data", "opacity": 1}},
        "id": "xy-edge__service-projection-data-read-model"
      }
    ],
    "viewport": {"x": 50, "y": 50, "zoom": 0.7},
    "creationDate": "2025-01-01T00:00:00.000Z",
    "name": "CQRS Pattern",
    "version": "1.0.0",
    "source": "https://eventcatalog.dev",
    "appState": {},
    "id": "cqrs-pattern"
  },
  "usecase": "Design CQRS Architecture",
  "mermaid": "flowchart LR\n    Q[Query] --> QH[Query Handler]\n    QH --> R[(Read DB)]\n    C[Command] --> CH[Command Handler]\n    CH --> W[(Write DB)]\n    CH --> E[Events]",
  "tags": ["Data Management"]
}