[{"data":1,"prerenderedAt":23604},["ShallowReactive",2],{"navigation":3,"/advanced-and-expert-topics/system-architecture-patterns":1016,"/advanced-and-expert-topics/system-architecture-patterns-surround":23599},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":807,"body":1018,"description":1028,"extension":23594,"links":23595,"meta":23596,"navigation":1228,"path":808,"seo":23597,"stem":809,"__hash__":23598},"docs/22.advanced-and-expert-topics/02.system-architecture-patterns.md",{"type":1019,"value":1020,"toc":23570},"minimark",[1021,1025,1029,1034,1037,1042,1048,1064,1069,1083,1088,1102,1107,1121,1125,1128,1132,4246,4250,4253,4257,9320,9324,9327,9331,12577,12581,12584,12588,18574,18578,18581,18585,23098,23102,23106,23111,23125,23130,23144,23148,23162,23167,23181,23185,23199,23203,23560,23563,23566],[1022,1023,807],"h1",{"id":1024},"system-architecture-patterns",[1026,1027,1028],"p",{},"System architecture patterns provide proven solutions for organizing complex Django applications. These patterns help create maintainable, scalable, and testable systems by defining clear boundaries between components and establishing consistent communication patterns. This comprehensive guide covers the most important architectural patterns for Django applications.",[1030,1031,1033],"h2",{"id":1032},"understanding-architecture-patterns","Understanding Architecture Patterns",[1026,1035,1036],{},"Architecture patterns are high-level design templates that provide structure for organizing application components. They define how different parts of your system interact, where business logic resides, and how to manage dependencies between components.",[1038,1039,1041],"h3",{"id":1040},"why-architecture-patterns-matter","Why Architecture Patterns Matter",[1026,1043,1044],{},[1045,1046,1047],"strong",{},"Maintainability",[1049,1050,1051,1055,1058,1061],"ul",{},[1052,1053,1054],"li",{},"Clear separation of concerns",[1052,1056,1057],{},"Predictable code organization",[1052,1059,1060],{},"Easier to understand and modify",[1052,1062,1063],{},"Reduced coupling between components",[1026,1065,1066],{},[1045,1067,1068],{},"Scalability",[1049,1070,1071,1074,1077,1080],{},[1052,1072,1073],{},"Components can be scaled independently",[1052,1075,1076],{},"Clear boundaries enable distributed systems",[1052,1078,1079],{},"Performance bottlenecks are isolated",[1052,1081,1082],{},"Team scaling becomes manageable",[1026,1084,1085],{},[1045,1086,1087],{},"Testability",[1049,1089,1090,1093,1096,1099],{},[1052,1091,1092],{},"Business logic is isolated and testable",[1052,1094,1095],{},"Dependencies can be mocked easily",[1052,1097,1098],{},"Unit tests focus on specific concerns",[1052,1100,1101],{},"Integration testing is more targeted",[1026,1103,1104],{},[1045,1105,1106],{},"Flexibility",[1049,1108,1109,1112,1115,1118],{},[1052,1110,1111],{},"Easy to swap implementations",[1052,1113,1114],{},"New features don't break existing code",[1052,1116,1117],{},"Technology changes are contained",[1052,1119,1120],{},"Business rules are protected from infrastructure changes",[1030,1122,1124],{"id":1123},"layered-architecture-pattern","Layered Architecture Pattern",[1026,1126,1127],{},"The layered architecture pattern organizes code into horizontal layers, each with specific responsibilities. This is the most common pattern in Django applications.",[1038,1129,1131],{"id":1130},"traditional-django-layers","Traditional Django Layers",[1133,1134,1139],"pre",{"className":1135,"code":1136,"language":1137,"meta":1138,"style":1138},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Presentation Layer (Views)\nfrom django.http import JsonResponse\nfrom django.views import View\nfrom .services import ProductService\nfrom .serializers import ProductSerializer\n\nclass ProductView(View):\n    \"\"\"Presentation layer - handles HTTP concerns\"\"\"\n    \n    def __init__(self):\n        self.product_service = ProductService()\n        self.serializer = ProductSerializer()\n    \n    def get(self, request, product_id):\n        \"\"\"Handle GET request for product details\"\"\"\n        try:\n            product = self.product_service.get_product(product_id)\n            data = self.serializer.serialize(product)\n            return JsonResponse(data)\n        except ProductNotFound:\n            return JsonResponse({'error': 'Product not found'}, status=404)\n    \n    def post(self, request):\n        \"\"\"Handle POST request for product creation\"\"\"\n        try:\n            data = self.serializer.deserialize(request.body)\n            product = self.product_service.create_product(data)\n            response_data = self.serializer.serialize(product)\n            return JsonResponse(response_data, status=201)\n        except ValidationError as e:\n            return JsonResponse({'errors': e.messages}, status=400)\n\n# Business Logic Layer (Services)\nfrom .models import Product, Category\nfrom .repositories import ProductRepository\nfrom django.db import transaction\n\nclass ProductService:\n    \"\"\"Business logic layer - contains use cases and business rules\"\"\"\n    \n    def __init__(self):\n        self.product_repo = ProductRepository()\n    \n    def get_product(self, product_id: int) -> Product:\n        \"\"\"Get product with business logic\"\"\"\n        product = self.product_repo.get_by_id(product_id)\n        if not product:\n            raise ProductNotFound(f\"Product {product_id} not found\")\n        \n        # Apply business rules\n        if not product.is_active:\n            raise ProductNotAvailable(\"Product is not available\")\n        \n        return product\n    \n    @transaction.atomic\n    def create_product(self, data: dict) -> Product:\n        \"\"\"Create product with business validation\"\"\"\n        # Validate business rules\n        if self.product_repo.exists_by_name(data['name']):\n            raise BusinessRuleError(\"Product name must be unique\")\n        \n        category = Category.objects.get(id=data['category_id'])\n        if not category.allows_products:\n            raise BusinessRuleError(\"Category does not allow products\")\n        \n        # Create product\n        product = Product(\n            name=data['name'],\n            description=data['description'],\n            price=data['price'],\n            category=category\n        )\n        \n        # Apply business logic\n        product.calculate_pricing()\n        product.set_initial_status()\n        \n        return self.product_repo.save(product)\n    \n    def update_product_price(self, product_id: int, new_price: Decimal) -> Product:\n        \"\"\"Update product price with business rules\"\"\"\n        product = self.get_product(product_id)\n        \n        # Business rule: price changes require approval for expensive items\n        if product.price > 1000 and new_price != product.price:\n            product.requires_approval = True\n        \n        # Business rule: cannot decrease price by more than 50%\n        if new_price \u003C product.price * Decimal('0.5'):\n            raise BusinessRuleError(\"Cannot decrease price by more than 50%\")\n        \n        product.price = new_price\n        product.price_updated_at = timezone.now()\n        \n        return self.product_repo.save(product)\n\n# Data Access Layer (Repository Pattern)\nfrom typing import Optional, List\nfrom django.db.models import Q\n\nclass ProductRepository:\n    \"\"\"Data access layer - abstracts database operations\"\"\"\n    \n    def get_by_id(self, product_id: int) -> Optional[Product]:\n        \"\"\"Get product by ID\"\"\"\n        try:\n            return Product.objects.select_related('category').get(id=product_id)\n        except Product.DoesNotExist:\n            return None\n    \n    def get_by_name(self, name: str) -> Optional[Product]:\n        \"\"\"Get product by name\"\"\"\n        try:\n            return Product.objects.get(name=name)\n        except Product.DoesNotExist:\n            return None\n    \n    def exists_by_name(self, name: str) -> bool:\n        \"\"\"Check if product exists by name\"\"\"\n        return Product.objects.filter(name=name).exists()\n    \n    def find_by_category(self, category_id: int) -> List[Product]:\n        \"\"\"Find products by category\"\"\"\n        return list(\n            Product.objects.filter(category_id=category_id, is_active=True)\n            .select_related('category')\n            .order_by('name')\n        )\n    \n    def search(self, query: str) -> List[Product]:\n        \"\"\"Search products by name or description\"\"\"\n        return list(\n            Product.objects.filter(\n                Q(name__icontains=query) | Q(description__icontains=query),\n                is_active=True\n            ).select_related('category')\n        )\n    \n    def save(self, product: Product) -> Product:\n        \"\"\"Save product to database\"\"\"\n        product.save()\n        return product\n    \n    def delete(self, product: Product) -> None:\n        \"\"\"Delete product from database\"\"\"\n        product.delete()\n\n# Domain Layer (Models with Business Logic)\nfrom django.db import models\nfrom decimal import Decimal\n\nclass Product(models.Model):\n    \"\"\"Product model with business logic\"\"\"\n    \n    name = models.CharField(max_length=200, unique=True)\n    description = models.TextField()\n    price = models.DecimalField(max_digits=10, decimal_places=2)\n    category = models.ForeignKey('Category', on_delete=models.CASCADE)\n    is_active = models.BooleanField(default=True)\n    requires_approval = models.BooleanField(default=False)\n    created_at = models.DateTimeField(auto_now_add=True)\n    price_updated_at = models.DateTimeField(auto_now=True)\n    \n    def calculate_pricing(self):\n        \"\"\"Business logic for pricing calculation\"\"\"\n        # Apply category-based pricing rules\n        if self.category.premium_category:\n            self.price *= Decimal('1.2')  # 20% premium\n        \n        # Apply volume-based pricing\n        if self.price > 100:\n            self.price = self.price.quantize(Decimal('0.99'))  # Psychological pricing\n    \n    def set_initial_status(self):\n        \"\"\"Business logic for initial status\"\"\"\n        # New products start as inactive for review\n        self.is_active = False\n        \n        # Expensive products require approval\n        if self.price > 1000:\n            self.requires_approval = True\n    \n    def can_be_deleted(self) -> bool:\n        \"\"\"Business rule for deletion\"\"\"\n        # Cannot delete products with orders\n        return not self.orderitem_set.exists()\n    \n    def apply_discount(self, percentage: Decimal) -> Decimal:\n        \"\"\"Business logic for discount application\"\"\"\n        if percentage \u003C 0 or percentage > 50:\n            raise ValueError(\"Discount must be between 0% and 50%\")\n        \n        discount_amount = self.price * (percentage / 100)\n        return self.price - discount_amount\n    \n    class Meta:\n        indexes = [\n            models.Index(fields=['category', 'is_active']),\n            models.Index(fields=['name']),\n        ]\n","python","",[1140,1141,1142,1151,1175,1192,1208,1223,1230,1251,1265,1271,1289,1312,1329,1334,1361,1372,1381,1410,1436,1452,1463,1509,1514,1532,1542,1549,1579,1603,1627,1650,1666,1702,1707,1713,1733,1748,1765,1770,1779,1789,1794,1807,1824,1829,1861,1871,1896,1911,1941,1947,1953,1969,1989,1994,2003,2008,2022,2052,2062,2068,2101,2120,2125,2167,2184,2202,2207,2213,2225,2246,2267,2288,2299,2305,2310,2316,2329,2341,2346,2368,2373,2411,2421,2440,2445,2451,2485,2502,2507,2513,2545,2563,2568,2582,2604,2609,2630,2635,2641,2659,2680,2685,2694,2704,2709,2743,2753,2760,2800,2814,2822,2827,2861,2871,2878,2903,2916,2923,2928,2957,2967,2998,3003,3037,3047,3057,3091,3109,3127,3132,3137,3170,3180,3189,3204,3240,3251,3269,3274,3279,3307,3317,3328,3335,3340,3369,3379,3391,3396,3402,3418,3431,3436,3455,3465,3470,3507,3524,3561,3602,3628,3653,3679,3704,3709,3723,3733,3739,3757,3786,3791,3797,3815,3857,3862,3876,3886,3892,3906,3911,3917,3934,3947,3952,3972,3982,3988,4008,4013,4042,4052,4078,4103,4108,4137,4154,4159,4170,4181,4217,4240],"code",{"__ignoreMap":1138},[1143,1144,1147],"span",{"class":1145,"line":1146},"line",1,[1143,1148,1150],{"class":1149},"s9Tkl","# Presentation Layer (Views)\n",[1143,1152,1154,1158,1162,1166,1169,1172],{"class":1145,"line":1153},2,[1143,1155,1157],{"class":1156},"siDh9","from",[1143,1159,1161],{"class":1160},"sftqT"," django",[1143,1163,1165],{"class":1164},"soVBu",".",[1143,1167,1168],{"class":1160},"http ",[1143,1170,1171],{"class":1156},"import",[1143,1173,1174],{"class":1160}," JsonResponse\n",[1143,1176,1178,1180,1182,1184,1187,1189],{"class":1145,"line":1177},3,[1143,1179,1157],{"class":1156},[1143,1181,1161],{"class":1160},[1143,1183,1165],{"class":1164},[1143,1185,1186],{"class":1160},"views ",[1143,1188,1171],{"class":1156},[1143,1190,1191],{"class":1160}," View\n",[1143,1193,1195,1197,1200,1203,1205],{"class":1145,"line":1194},4,[1143,1196,1157],{"class":1156},[1143,1198,1199],{"class":1164}," .",[1143,1201,1202],{"class":1160},"services ",[1143,1204,1171],{"class":1156},[1143,1206,1207],{"class":1160}," ProductService\n",[1143,1209,1211,1213,1215,1218,1220],{"class":1145,"line":1210},5,[1143,1212,1157],{"class":1156},[1143,1214,1199],{"class":1164},[1143,1216,1217],{"class":1160},"serializers ",[1143,1219,1171],{"class":1156},[1143,1221,1222],{"class":1160}," ProductSerializer\n",[1143,1224,1226],{"class":1145,"line":1225},6,[1143,1227,1229],{"emptyLinePlaceholder":1228},true,"\n",[1143,1231,1233,1237,1241,1244,1248],{"class":1145,"line":1232},7,[1143,1234,1236],{"class":1235},"s5Kfy","class",[1143,1238,1240],{"class":1239},"sD-vU"," ProductView",[1143,1242,1243],{"class":1164},"(",[1143,1245,1247],{"class":1246},"sYn-s","View",[1143,1249,1250],{"class":1164},"):\n",[1143,1252,1254,1258,1262],{"class":1145,"line":1253},8,[1143,1255,1257],{"class":1256},"sm7ve","    \"\"\"",[1143,1259,1261],{"class":1260},"sVyVU","Presentation layer - handles HTTP concerns",[1143,1263,1264],{"class":1256},"\"\"\"\n",[1143,1266,1268],{"class":1145,"line":1267},9,[1143,1269,1270],{"class":1160},"    \n",[1143,1272,1274,1277,1281,1283,1287],{"class":1145,"line":1273},10,[1143,1275,1276],{"class":1235},"    def",[1143,1278,1280],{"class":1279},"sJdAF"," __init__",[1143,1282,1243],{"class":1164},[1143,1284,1286],{"class":1285},"sRjD_","self",[1143,1288,1250],{"class":1164},[1143,1290,1292,1296,1298,1302,1305,1309],{"class":1145,"line":1291},11,[1143,1293,1295],{"class":1294},"se3Ec","        self",[1143,1297,1165],{"class":1164},[1143,1299,1301],{"class":1300},"sBPpx","product_service",[1143,1303,1304],{"class":1164}," =",[1143,1306,1308],{"class":1307},"siWMO"," ProductService",[1143,1310,1311],{"class":1164},"()\n",[1143,1313,1315,1317,1319,1322,1324,1327],{"class":1145,"line":1314},12,[1143,1316,1295],{"class":1294},[1143,1318,1165],{"class":1164},[1143,1320,1321],{"class":1300},"serializer",[1143,1323,1304],{"class":1164},[1143,1325,1326],{"class":1307}," ProductSerializer",[1143,1328,1311],{"class":1164},[1143,1330,1332],{"class":1145,"line":1331},13,[1143,1333,1270],{"class":1160},[1143,1335,1337,1339,1343,1345,1347,1350,1354,1356,1359],{"class":1145,"line":1336},14,[1143,1338,1276],{"class":1235},[1143,1340,1342],{"class":1341},"sljsM"," get",[1143,1344,1243],{"class":1164},[1143,1346,1286],{"class":1285},[1143,1348,1349],{"class":1164},",",[1143,1351,1353],{"class":1352},"sCyAa"," request",[1143,1355,1349],{"class":1164},[1143,1357,1358],{"class":1352}," product_id",[1143,1360,1250],{"class":1164},[1143,1362,1364,1367,1370],{"class":1145,"line":1363},15,[1143,1365,1366],{"class":1256},"        \"\"\"",[1143,1368,1369],{"class":1260},"Handle GET request for product details",[1143,1371,1264],{"class":1256},[1143,1373,1375,1378],{"class":1145,"line":1374},16,[1143,1376,1377],{"class":1156},"        try",[1143,1379,1380],{"class":1164},":\n",[1143,1382,1384,1387,1390,1393,1395,1397,1399,1402,1404,1407],{"class":1145,"line":1383},17,[1143,1385,1386],{"class":1160},"            product ",[1143,1388,1389],{"class":1164},"=",[1143,1391,1392],{"class":1294}," self",[1143,1394,1165],{"class":1164},[1143,1396,1301],{"class":1300},[1143,1398,1165],{"class":1164},[1143,1400,1401],{"class":1307},"get_product",[1143,1403,1243],{"class":1164},[1143,1405,1406],{"class":1307},"product_id",[1143,1408,1409],{"class":1164},")\n",[1143,1411,1413,1416,1418,1420,1422,1424,1426,1429,1431,1434],{"class":1145,"line":1412},18,[1143,1414,1415],{"class":1160},"            data ",[1143,1417,1389],{"class":1164},[1143,1419,1392],{"class":1294},[1143,1421,1165],{"class":1164},[1143,1423,1321],{"class":1300},[1143,1425,1165],{"class":1164},[1143,1427,1428],{"class":1307},"serialize",[1143,1430,1243],{"class":1164},[1143,1432,1433],{"class":1307},"product",[1143,1435,1409],{"class":1164},[1143,1437,1439,1442,1445,1447,1450],{"class":1145,"line":1438},19,[1143,1440,1441],{"class":1156},"            return",[1143,1443,1444],{"class":1307}," JsonResponse",[1143,1446,1243],{"class":1164},[1143,1448,1449],{"class":1307},"data",[1143,1451,1409],{"class":1164},[1143,1453,1455,1458,1461],{"class":1145,"line":1454},20,[1143,1456,1457],{"class":1156},"        except",[1143,1459,1460],{"class":1160}," ProductNotFound",[1143,1462,1380],{"class":1164},[1143,1464,1466,1468,1470,1473,1477,1481,1483,1486,1489,1492,1494,1497,1501,1503,1507],{"class":1145,"line":1465},21,[1143,1467,1441],{"class":1156},[1143,1469,1444],{"class":1307},[1143,1471,1472],{"class":1164},"({",[1143,1474,1476],{"class":1475},"sbYkP","'",[1143,1478,1480],{"class":1479},"sTbE_","error",[1143,1482,1476],{"class":1475},[1143,1484,1485],{"class":1164},":",[1143,1487,1488],{"class":1475}," '",[1143,1490,1491],{"class":1479},"Product not found",[1143,1493,1476],{"class":1475},[1143,1495,1496],{"class":1164},"},",[1143,1498,1500],{"class":1499},"sqOPj"," status",[1143,1502,1389],{"class":1164},[1143,1504,1506],{"class":1505},"s7CZa","404",[1143,1508,1409],{"class":1164},[1143,1510,1512],{"class":1145,"line":1511},22,[1143,1513,1270],{"class":1160},[1143,1515,1517,1519,1522,1524,1526,1528,1530],{"class":1145,"line":1516},23,[1143,1518,1276],{"class":1235},[1143,1520,1521],{"class":1341}," post",[1143,1523,1243],{"class":1164},[1143,1525,1286],{"class":1285},[1143,1527,1349],{"class":1164},[1143,1529,1353],{"class":1352},[1143,1531,1250],{"class":1164},[1143,1533,1535,1537,1540],{"class":1145,"line":1534},24,[1143,1536,1366],{"class":1256},[1143,1538,1539],{"class":1260},"Handle POST request for product creation",[1143,1541,1264],{"class":1256},[1143,1543,1545,1547],{"class":1145,"line":1544},25,[1143,1546,1377],{"class":1156},[1143,1548,1380],{"class":1164},[1143,1550,1552,1554,1556,1558,1560,1562,1564,1567,1569,1572,1574,1577],{"class":1145,"line":1551},26,[1143,1553,1415],{"class":1160},[1143,1555,1389],{"class":1164},[1143,1557,1392],{"class":1294},[1143,1559,1165],{"class":1164},[1143,1561,1321],{"class":1300},[1143,1563,1165],{"class":1164},[1143,1565,1566],{"class":1307},"deserialize",[1143,1568,1243],{"class":1164},[1143,1570,1571],{"class":1307},"request",[1143,1573,1165],{"class":1164},[1143,1575,1576],{"class":1300},"body",[1143,1578,1409],{"class":1164},[1143,1580,1582,1584,1586,1588,1590,1592,1594,1597,1599,1601],{"class":1145,"line":1581},27,[1143,1583,1386],{"class":1160},[1143,1585,1389],{"class":1164},[1143,1587,1392],{"class":1294},[1143,1589,1165],{"class":1164},[1143,1591,1301],{"class":1300},[1143,1593,1165],{"class":1164},[1143,1595,1596],{"class":1307},"create_product",[1143,1598,1243],{"class":1164},[1143,1600,1449],{"class":1307},[1143,1602,1409],{"class":1164},[1143,1604,1606,1609,1611,1613,1615,1617,1619,1621,1623,1625],{"class":1145,"line":1605},28,[1143,1607,1608],{"class":1160},"            response_data ",[1143,1610,1389],{"class":1164},[1143,1612,1392],{"class":1294},[1143,1614,1165],{"class":1164},[1143,1616,1321],{"class":1300},[1143,1618,1165],{"class":1164},[1143,1620,1428],{"class":1307},[1143,1622,1243],{"class":1164},[1143,1624,1433],{"class":1307},[1143,1626,1409],{"class":1164},[1143,1628,1630,1632,1634,1636,1639,1641,1643,1645,1648],{"class":1145,"line":1629},29,[1143,1631,1441],{"class":1156},[1143,1633,1444],{"class":1307},[1143,1635,1243],{"class":1164},[1143,1637,1638],{"class":1307},"response_data",[1143,1640,1349],{"class":1164},[1143,1642,1500],{"class":1499},[1143,1644,1389],{"class":1164},[1143,1646,1647],{"class":1505},"201",[1143,1649,1409],{"class":1164},[1143,1651,1653,1655,1658,1661,1664],{"class":1145,"line":1652},30,[1143,1654,1457],{"class":1156},[1143,1656,1657],{"class":1160}," ValidationError ",[1143,1659,1660],{"class":1156},"as",[1143,1662,1663],{"class":1160}," e",[1143,1665,1380],{"class":1164},[1143,1667,1669,1671,1673,1675,1677,1680,1682,1684,1686,1688,1691,1693,1695,1697,1700],{"class":1145,"line":1668},31,[1143,1670,1441],{"class":1156},[1143,1672,1444],{"class":1307},[1143,1674,1472],{"class":1164},[1143,1676,1476],{"class":1475},[1143,1678,1679],{"class":1479},"errors",[1143,1681,1476],{"class":1475},[1143,1683,1485],{"class":1164},[1143,1685,1663],{"class":1307},[1143,1687,1165],{"class":1164},[1143,1689,1690],{"class":1300},"messages",[1143,1692,1496],{"class":1164},[1143,1694,1500],{"class":1499},[1143,1696,1389],{"class":1164},[1143,1698,1699],{"class":1505},"400",[1143,1701,1409],{"class":1164},[1143,1703,1705],{"class":1145,"line":1704},32,[1143,1706,1229],{"emptyLinePlaceholder":1228},[1143,1708,1710],{"class":1145,"line":1709},33,[1143,1711,1712],{"class":1149},"# Business Logic Layer (Services)\n",[1143,1714,1716,1718,1720,1723,1725,1728,1730],{"class":1145,"line":1715},34,[1143,1717,1157],{"class":1156},[1143,1719,1199],{"class":1164},[1143,1721,1722],{"class":1160},"models ",[1143,1724,1171],{"class":1156},[1143,1726,1727],{"class":1160}," Product",[1143,1729,1349],{"class":1164},[1143,1731,1732],{"class":1160}," Category\n",[1143,1734,1736,1738,1740,1743,1745],{"class":1145,"line":1735},35,[1143,1737,1157],{"class":1156},[1143,1739,1199],{"class":1164},[1143,1741,1742],{"class":1160},"repositories ",[1143,1744,1171],{"class":1156},[1143,1746,1747],{"class":1160}," ProductRepository\n",[1143,1749,1751,1753,1755,1757,1760,1762],{"class":1145,"line":1750},36,[1143,1752,1157],{"class":1156},[1143,1754,1161],{"class":1160},[1143,1756,1165],{"class":1164},[1143,1758,1759],{"class":1160},"db ",[1143,1761,1171],{"class":1156},[1143,1763,1764],{"class":1160}," transaction\n",[1143,1766,1768],{"class":1145,"line":1767},37,[1143,1769,1229],{"emptyLinePlaceholder":1228},[1143,1771,1773,1775,1777],{"class":1145,"line":1772},38,[1143,1774,1236],{"class":1235},[1143,1776,1308],{"class":1239},[1143,1778,1380],{"class":1164},[1143,1780,1782,1784,1787],{"class":1145,"line":1781},39,[1143,1783,1257],{"class":1256},[1143,1785,1786],{"class":1260},"Business logic layer - contains use cases and business rules",[1143,1788,1264],{"class":1256},[1143,1790,1792],{"class":1145,"line":1791},40,[1143,1793,1270],{"class":1160},[1143,1795,1797,1799,1801,1803,1805],{"class":1145,"line":1796},41,[1143,1798,1276],{"class":1235},[1143,1800,1280],{"class":1279},[1143,1802,1243],{"class":1164},[1143,1804,1286],{"class":1285},[1143,1806,1250],{"class":1164},[1143,1808,1810,1812,1814,1817,1819,1822],{"class":1145,"line":1809},42,[1143,1811,1295],{"class":1294},[1143,1813,1165],{"class":1164},[1143,1815,1816],{"class":1300},"product_repo",[1143,1818,1304],{"class":1164},[1143,1820,1821],{"class":1307}," ProductRepository",[1143,1823,1311],{"class":1164},[1143,1825,1827],{"class":1145,"line":1826},43,[1143,1828,1270],{"class":1160},[1143,1830,1832,1834,1837,1839,1841,1843,1845,1847,1851,1854,1857,1859],{"class":1145,"line":1831},44,[1143,1833,1276],{"class":1235},[1143,1835,1836],{"class":1341}," get_product",[1143,1838,1243],{"class":1164},[1143,1840,1286],{"class":1285},[1143,1842,1349],{"class":1164},[1143,1844,1358],{"class":1352},[1143,1846,1485],{"class":1164},[1143,1848,1850],{"class":1849},"sa2tF"," int",[1143,1852,1853],{"class":1164},")",[1143,1855,1856],{"class":1164}," ->",[1143,1858,1727],{"class":1160},[1143,1860,1380],{"class":1164},[1143,1862,1864,1866,1869],{"class":1145,"line":1863},45,[1143,1865,1366],{"class":1256},[1143,1867,1868],{"class":1260},"Get product with business logic",[1143,1870,1264],{"class":1256},[1143,1872,1874,1877,1879,1881,1883,1885,1887,1890,1892,1894],{"class":1145,"line":1873},46,[1143,1875,1876],{"class":1160},"        product ",[1143,1878,1389],{"class":1164},[1143,1880,1392],{"class":1294},[1143,1882,1165],{"class":1164},[1143,1884,1816],{"class":1300},[1143,1886,1165],{"class":1164},[1143,1888,1889],{"class":1307},"get_by_id",[1143,1891,1243],{"class":1164},[1143,1893,1406],{"class":1307},[1143,1895,1409],{"class":1164},[1143,1897,1899,1902,1906,1909],{"class":1145,"line":1898},47,[1143,1900,1901],{"class":1156},"        if",[1143,1903,1905],{"class":1904},"sVsLi"," not",[1143,1907,1908],{"class":1160}," product",[1143,1910,1380],{"class":1164},[1143,1912,1914,1917,1919,1921,1924,1927,1931,1933,1936,1939],{"class":1145,"line":1913},48,[1143,1915,1916],{"class":1156},"            raise",[1143,1918,1460],{"class":1307},[1143,1920,1243],{"class":1164},[1143,1922,1923],{"class":1235},"f",[1143,1925,1926],{"class":1479},"\"Product ",[1143,1928,1930],{"class":1929},"s3h35","{",[1143,1932,1406],{"class":1307},[1143,1934,1935],{"class":1929},"}",[1143,1937,1938],{"class":1479}," not found\"",[1143,1940,1409],{"class":1164},[1143,1942,1944],{"class":1145,"line":1943},49,[1143,1945,1946],{"class":1160},"        \n",[1143,1948,1950],{"class":1145,"line":1949},50,[1143,1951,1952],{"class":1149},"        # Apply business rules\n",[1143,1954,1956,1958,1960,1962,1964,1967],{"class":1145,"line":1955},51,[1143,1957,1901],{"class":1156},[1143,1959,1905],{"class":1904},[1143,1961,1908],{"class":1160},[1143,1963,1165],{"class":1164},[1143,1965,1966],{"class":1300},"is_active",[1143,1968,1380],{"class":1164},[1143,1970,1972,1974,1977,1979,1982,1985,1987],{"class":1145,"line":1971},52,[1143,1973,1916],{"class":1156},[1143,1975,1976],{"class":1307}," ProductNotAvailable",[1143,1978,1243],{"class":1164},[1143,1980,1981],{"class":1475},"\"",[1143,1983,1984],{"class":1479},"Product is not available",[1143,1986,1981],{"class":1475},[1143,1988,1409],{"class":1164},[1143,1990,1992],{"class":1145,"line":1991},53,[1143,1993,1946],{"class":1160},[1143,1995,1997,2000],{"class":1145,"line":1996},54,[1143,1998,1999],{"class":1156},"        return",[1143,2001,2002],{"class":1160}," product\n",[1143,2004,2006],{"class":1145,"line":2005},55,[1143,2007,1270],{"class":1160},[1143,2009,2011,2014,2017,2019],{"class":1145,"line":2010},56,[1143,2012,2013],{"class":1164},"    @",[1143,2015,2016],{"class":1341},"transaction",[1143,2018,1165],{"class":1164},[1143,2020,2021],{"class":1341},"atomic\n",[1143,2023,2025,2027,2030,2032,2034,2036,2039,2041,2044,2046,2048,2050],{"class":1145,"line":2024},57,[1143,2026,1276],{"class":1235},[1143,2028,2029],{"class":1341}," create_product",[1143,2031,1243],{"class":1164},[1143,2033,1286],{"class":1285},[1143,2035,1349],{"class":1164},[1143,2037,2038],{"class":1352}," data",[1143,2040,1485],{"class":1164},[1143,2042,2043],{"class":1849}," dict",[1143,2045,1853],{"class":1164},[1143,2047,1856],{"class":1164},[1143,2049,1727],{"class":1160},[1143,2051,1380],{"class":1164},[1143,2053,2055,2057,2060],{"class":1145,"line":2054},58,[1143,2056,1366],{"class":1256},[1143,2058,2059],{"class":1260},"Create product with business validation",[1143,2061,1264],{"class":1256},[1143,2063,2065],{"class":1145,"line":2064},59,[1143,2066,2067],{"class":1149},"        # Validate business rules\n",[1143,2069,2071,2073,2075,2077,2079,2081,2084,2086,2088,2091,2093,2096,2098],{"class":1145,"line":2070},60,[1143,2072,1901],{"class":1156},[1143,2074,1392],{"class":1294},[1143,2076,1165],{"class":1164},[1143,2078,1816],{"class":1300},[1143,2080,1165],{"class":1164},[1143,2082,2083],{"class":1307},"exists_by_name",[1143,2085,1243],{"class":1164},[1143,2087,1449],{"class":1307},[1143,2089,2090],{"class":1164},"[",[1143,2092,1476],{"class":1475},[1143,2094,2095],{"class":1479},"name",[1143,2097,1476],{"class":1475},[1143,2099,2100],{"class":1164},"]):\n",[1143,2102,2104,2106,2109,2111,2113,2116,2118],{"class":1145,"line":2103},61,[1143,2105,1916],{"class":1156},[1143,2107,2108],{"class":1307}," BusinessRuleError",[1143,2110,1243],{"class":1164},[1143,2112,1981],{"class":1475},[1143,2114,2115],{"class":1479},"Product name must be unique",[1143,2117,1981],{"class":1475},[1143,2119,1409],{"class":1164},[1143,2121,2123],{"class":1145,"line":2122},62,[1143,2124,1946],{"class":1160},[1143,2126,2128,2131,2133,2136,2138,2141,2143,2146,2148,2151,2153,2155,2157,2159,2162,2164],{"class":1145,"line":2127},63,[1143,2129,2130],{"class":1160},"        category ",[1143,2132,1389],{"class":1164},[1143,2134,2135],{"class":1160}," Category",[1143,2137,1165],{"class":1164},[1143,2139,2140],{"class":1300},"objects",[1143,2142,1165],{"class":1164},[1143,2144,2145],{"class":1307},"get",[1143,2147,1243],{"class":1164},[1143,2149,2150],{"class":1499},"id",[1143,2152,1389],{"class":1164},[1143,2154,1449],{"class":1307},[1143,2156,2090],{"class":1164},[1143,2158,1476],{"class":1475},[1143,2160,2161],{"class":1479},"category_id",[1143,2163,1476],{"class":1475},[1143,2165,2166],{"class":1164},"])\n",[1143,2168,2170,2172,2174,2177,2179,2182],{"class":1145,"line":2169},64,[1143,2171,1901],{"class":1156},[1143,2173,1905],{"class":1904},[1143,2175,2176],{"class":1160}," category",[1143,2178,1165],{"class":1164},[1143,2180,2181],{"class":1300},"allows_products",[1143,2183,1380],{"class":1164},[1143,2185,2187,2189,2191,2193,2195,2198,2200],{"class":1145,"line":2186},65,[1143,2188,1916],{"class":1156},[1143,2190,2108],{"class":1307},[1143,2192,1243],{"class":1164},[1143,2194,1981],{"class":1475},[1143,2196,2197],{"class":1479},"Category does not allow products",[1143,2199,1981],{"class":1475},[1143,2201,1409],{"class":1164},[1143,2203,2205],{"class":1145,"line":2204},66,[1143,2206,1946],{"class":1160},[1143,2208,2210],{"class":1145,"line":2209},67,[1143,2211,2212],{"class":1149},"        # Create product\n",[1143,2214,2216,2218,2220,2222],{"class":1145,"line":2215},68,[1143,2217,1876],{"class":1160},[1143,2219,1389],{"class":1164},[1143,2221,1727],{"class":1307},[1143,2223,2224],{"class":1164},"(\n",[1143,2226,2228,2231,2233,2235,2237,2239,2241,2243],{"class":1145,"line":2227},69,[1143,2229,2230],{"class":1499},"            name",[1143,2232,1389],{"class":1164},[1143,2234,1449],{"class":1307},[1143,2236,2090],{"class":1164},[1143,2238,1476],{"class":1475},[1143,2240,2095],{"class":1479},[1143,2242,1476],{"class":1475},[1143,2244,2245],{"class":1164},"],\n",[1143,2247,2249,2252,2254,2256,2258,2260,2263,2265],{"class":1145,"line":2248},70,[1143,2250,2251],{"class":1499},"            description",[1143,2253,1389],{"class":1164},[1143,2255,1449],{"class":1307},[1143,2257,2090],{"class":1164},[1143,2259,1476],{"class":1475},[1143,2261,2262],{"class":1479},"description",[1143,2264,1476],{"class":1475},[1143,2266,2245],{"class":1164},[1143,2268,2270,2273,2275,2277,2279,2281,2284,2286],{"class":1145,"line":2269},71,[1143,2271,2272],{"class":1499},"            price",[1143,2274,1389],{"class":1164},[1143,2276,1449],{"class":1307},[1143,2278,2090],{"class":1164},[1143,2280,1476],{"class":1475},[1143,2282,2283],{"class":1479},"price",[1143,2285,1476],{"class":1475},[1143,2287,2245],{"class":1164},[1143,2289,2291,2294,2296],{"class":1145,"line":2290},72,[1143,2292,2293],{"class":1499},"            category",[1143,2295,1389],{"class":1164},[1143,2297,2298],{"class":1307},"category\n",[1143,2300,2302],{"class":1145,"line":2301},73,[1143,2303,2304],{"class":1164},"        )\n",[1143,2306,2308],{"class":1145,"line":2307},74,[1143,2309,1946],{"class":1160},[1143,2311,2313],{"class":1145,"line":2312},75,[1143,2314,2315],{"class":1149},"        # Apply business logic\n",[1143,2317,2319,2322,2324,2327],{"class":1145,"line":2318},76,[1143,2320,2321],{"class":1160},"        product",[1143,2323,1165],{"class":1164},[1143,2325,2326],{"class":1307},"calculate_pricing",[1143,2328,1311],{"class":1164},[1143,2330,2332,2334,2336,2339],{"class":1145,"line":2331},77,[1143,2333,2321],{"class":1160},[1143,2335,1165],{"class":1164},[1143,2337,2338],{"class":1307},"set_initial_status",[1143,2340,1311],{"class":1164},[1143,2342,2344],{"class":1145,"line":2343},78,[1143,2345,1946],{"class":1160},[1143,2347,2349,2351,2353,2355,2357,2359,2362,2364,2366],{"class":1145,"line":2348},79,[1143,2350,1999],{"class":1156},[1143,2352,1392],{"class":1294},[1143,2354,1165],{"class":1164},[1143,2356,1816],{"class":1300},[1143,2358,1165],{"class":1164},[1143,2360,2361],{"class":1307},"save",[1143,2363,1243],{"class":1164},[1143,2365,1433],{"class":1307},[1143,2367,1409],{"class":1164},[1143,2369,2371],{"class":1145,"line":2370},80,[1143,2372,1270],{"class":1160},[1143,2374,2376,2378,2381,2383,2385,2387,2389,2391,2393,2395,2398,2400,2403,2405,2407,2409],{"class":1145,"line":2375},81,[1143,2377,1276],{"class":1235},[1143,2379,2380],{"class":1341}," update_product_price",[1143,2382,1243],{"class":1164},[1143,2384,1286],{"class":1285},[1143,2386,1349],{"class":1164},[1143,2388,1358],{"class":1352},[1143,2390,1485],{"class":1164},[1143,2392,1850],{"class":1849},[1143,2394,1349],{"class":1164},[1143,2396,2397],{"class":1352}," new_price",[1143,2399,1485],{"class":1164},[1143,2401,2402],{"class":1160}," Decimal",[1143,2404,1853],{"class":1164},[1143,2406,1856],{"class":1164},[1143,2408,1727],{"class":1160},[1143,2410,1380],{"class":1164},[1143,2412,2414,2416,2419],{"class":1145,"line":2413},82,[1143,2415,1366],{"class":1256},[1143,2417,2418],{"class":1260},"Update product price with business rules",[1143,2420,1264],{"class":1256},[1143,2422,2424,2426,2428,2430,2432,2434,2436,2438],{"class":1145,"line":2423},83,[1143,2425,1876],{"class":1160},[1143,2427,1389],{"class":1164},[1143,2429,1392],{"class":1294},[1143,2431,1165],{"class":1164},[1143,2433,1401],{"class":1307},[1143,2435,1243],{"class":1164},[1143,2437,1406],{"class":1307},[1143,2439,1409],{"class":1164},[1143,2441,2443],{"class":1145,"line":2442},84,[1143,2444,1946],{"class":1160},[1143,2446,2448],{"class":1145,"line":2447},85,[1143,2449,2450],{"class":1149},"        # Business rule: price changes require approval for expensive items\n",[1143,2452,2454,2456,2458,2460,2462,2465,2468,2471,2474,2477,2479,2481,2483],{"class":1145,"line":2453},86,[1143,2455,1901],{"class":1156},[1143,2457,1908],{"class":1160},[1143,2459,1165],{"class":1164},[1143,2461,2283],{"class":1300},[1143,2463,2464],{"class":1904}," >",[1143,2466,2467],{"class":1505}," 1000",[1143,2469,2470],{"class":1904}," and",[1143,2472,2473],{"class":1160}," new_price ",[1143,2475,2476],{"class":1904},"!=",[1143,2478,1908],{"class":1160},[1143,2480,1165],{"class":1164},[1143,2482,2283],{"class":1300},[1143,2484,1380],{"class":1164},[1143,2486,2488,2491,2493,2496,2498],{"class":1145,"line":2487},87,[1143,2489,2490],{"class":1160},"            product",[1143,2492,1165],{"class":1164},[1143,2494,2495],{"class":1300},"requires_approval",[1143,2497,1304],{"class":1164},[1143,2499,2501],{"class":2500},"s8XtY"," True\n",[1143,2503,2505],{"class":1145,"line":2504},88,[1143,2506,1946],{"class":1160},[1143,2508,2510],{"class":1145,"line":2509},89,[1143,2511,2512],{"class":1149},"        # Business rule: cannot decrease price by more than 50%\n",[1143,2514,2516,2518,2520,2523,2525,2527,2529,2532,2534,2536,2538,2541,2543],{"class":1145,"line":2515},90,[1143,2517,1901],{"class":1156},[1143,2519,2473],{"class":1160},[1143,2521,2522],{"class":1904},"\u003C",[1143,2524,1908],{"class":1160},[1143,2526,1165],{"class":1164},[1143,2528,2283],{"class":1300},[1143,2530,2531],{"class":1904}," *",[1143,2533,2402],{"class":1307},[1143,2535,1243],{"class":1164},[1143,2537,1476],{"class":1475},[1143,2539,2540],{"class":1479},"0.5",[1143,2542,1476],{"class":1475},[1143,2544,1250],{"class":1164},[1143,2546,2548,2550,2552,2554,2556,2559,2561],{"class":1145,"line":2547},91,[1143,2549,1916],{"class":1156},[1143,2551,2108],{"class":1307},[1143,2553,1243],{"class":1164},[1143,2555,1981],{"class":1475},[1143,2557,2558],{"class":1479},"Cannot decrease price by more than 50%",[1143,2560,1981],{"class":1475},[1143,2562,1409],{"class":1164},[1143,2564,2566],{"class":1145,"line":2565},92,[1143,2567,1946],{"class":1160},[1143,2569,2571,2573,2575,2577,2579],{"class":1145,"line":2570},93,[1143,2572,2321],{"class":1160},[1143,2574,1165],{"class":1164},[1143,2576,2283],{"class":1300},[1143,2578,1304],{"class":1164},[1143,2580,2581],{"class":1160}," new_price\n",[1143,2583,2585,2587,2589,2592,2594,2597,2599,2602],{"class":1145,"line":2584},94,[1143,2586,2321],{"class":1160},[1143,2588,1165],{"class":1164},[1143,2590,2591],{"class":1300},"price_updated_at",[1143,2593,1304],{"class":1164},[1143,2595,2596],{"class":1160}," timezone",[1143,2598,1165],{"class":1164},[1143,2600,2601],{"class":1307},"now",[1143,2603,1311],{"class":1164},[1143,2605,2607],{"class":1145,"line":2606},95,[1143,2608,1946],{"class":1160},[1143,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628],{"class":1145,"line":2611},96,[1143,2613,1999],{"class":1156},[1143,2615,1392],{"class":1294},[1143,2617,1165],{"class":1164},[1143,2619,1816],{"class":1300},[1143,2621,1165],{"class":1164},[1143,2623,2361],{"class":1307},[1143,2625,1243],{"class":1164},[1143,2627,1433],{"class":1307},[1143,2629,1409],{"class":1164},[1143,2631,2633],{"class":1145,"line":2632},97,[1143,2634,1229],{"emptyLinePlaceholder":1228},[1143,2636,2638],{"class":1145,"line":2637},98,[1143,2639,2640],{"class":1149},"# Data Access Layer (Repository Pattern)\n",[1143,2642,2644,2646,2649,2651,2654,2656],{"class":1145,"line":2643},99,[1143,2645,1157],{"class":1156},[1143,2647,2648],{"class":1160}," typing ",[1143,2650,1171],{"class":1156},[1143,2652,2653],{"class":1160}," Optional",[1143,2655,1349],{"class":1164},[1143,2657,2658],{"class":1160}," List\n",[1143,2660,2662,2664,2666,2668,2671,2673,2675,2677],{"class":1145,"line":2661},100,[1143,2663,1157],{"class":1156},[1143,2665,1161],{"class":1160},[1143,2667,1165],{"class":1164},[1143,2669,2670],{"class":1160},"db",[1143,2672,1165],{"class":1164},[1143,2674,1722],{"class":1160},[1143,2676,1171],{"class":1156},[1143,2678,2679],{"class":1160}," Q\n",[1143,2681,2683],{"class":1145,"line":2682},101,[1143,2684,1229],{"emptyLinePlaceholder":1228},[1143,2686,2688,2690,2692],{"class":1145,"line":2687},102,[1143,2689,1236],{"class":1235},[1143,2691,1821],{"class":1239},[1143,2693,1380],{"class":1164},[1143,2695,2697,2699,2702],{"class":1145,"line":2696},103,[1143,2698,1257],{"class":1256},[1143,2700,2701],{"class":1260},"Data access layer - abstracts database operations",[1143,2703,1264],{"class":1256},[1143,2705,2707],{"class":1145,"line":2706},104,[1143,2708,1270],{"class":1160},[1143,2710,2712,2714,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2740],{"class":1145,"line":2711},105,[1143,2713,1276],{"class":1235},[1143,2715,2716],{"class":1341}," get_by_id",[1143,2718,1243],{"class":1164},[1143,2720,1286],{"class":1285},[1143,2722,1349],{"class":1164},[1143,2724,1358],{"class":1352},[1143,2726,1485],{"class":1164},[1143,2728,1850],{"class":1849},[1143,2730,1853],{"class":1164},[1143,2732,1856],{"class":1164},[1143,2734,2653],{"class":1160},[1143,2736,2090],{"class":1164},[1143,2738,2739],{"class":1160},"Product",[1143,2741,2742],{"class":1164},"]:\n",[1143,2744,2746,2748,2751],{"class":1145,"line":2745},106,[1143,2747,1366],{"class":1256},[1143,2749,2750],{"class":1260},"Get product by ID",[1143,2752,1264],{"class":1256},[1143,2754,2756,2758],{"class":1145,"line":2755},107,[1143,2757,1377],{"class":1156},[1143,2759,1380],{"class":1164},[1143,2761,2763,2765,2767,2769,2771,2773,2776,2778,2780,2783,2785,2788,2790,2792,2794,2796,2798],{"class":1145,"line":2762},108,[1143,2764,1441],{"class":1156},[1143,2766,1727],{"class":1160},[1143,2768,1165],{"class":1164},[1143,2770,2140],{"class":1300},[1143,2772,1165],{"class":1164},[1143,2774,2775],{"class":1307},"select_related",[1143,2777,1243],{"class":1164},[1143,2779,1476],{"class":1475},[1143,2781,2782],{"class":1479},"category",[1143,2784,1476],{"class":1475},[1143,2786,2787],{"class":1164},").",[1143,2789,2145],{"class":1307},[1143,2791,1243],{"class":1164},[1143,2793,2150],{"class":1499},[1143,2795,1389],{"class":1164},[1143,2797,1406],{"class":1307},[1143,2799,1409],{"class":1164},[1143,2801,2803,2805,2807,2809,2812],{"class":1145,"line":2802},109,[1143,2804,1457],{"class":1156},[1143,2806,1727],{"class":1160},[1143,2808,1165],{"class":1164},[1143,2810,2811],{"class":1300},"DoesNotExist",[1143,2813,1380],{"class":1164},[1143,2815,2817,2819],{"class":1145,"line":2816},110,[1143,2818,1441],{"class":1156},[1143,2820,2821],{"class":2500}," None\n",[1143,2823,2825],{"class":1145,"line":2824},111,[1143,2826,1270],{"class":1160},[1143,2828,2830,2832,2835,2837,2839,2841,2844,2846,2849,2851,2853,2855,2857,2859],{"class":1145,"line":2829},112,[1143,2831,1276],{"class":1235},[1143,2833,2834],{"class":1341}," get_by_name",[1143,2836,1243],{"class":1164},[1143,2838,1286],{"class":1285},[1143,2840,1349],{"class":1164},[1143,2842,2843],{"class":1352}," name",[1143,2845,1485],{"class":1164},[1143,2847,2848],{"class":1849}," str",[1143,2850,1853],{"class":1164},[1143,2852,1856],{"class":1164},[1143,2854,2653],{"class":1160},[1143,2856,2090],{"class":1164},[1143,2858,2739],{"class":1160},[1143,2860,2742],{"class":1164},[1143,2862,2864,2866,2869],{"class":1145,"line":2863},113,[1143,2865,1366],{"class":1256},[1143,2867,2868],{"class":1260},"Get product by name",[1143,2870,1264],{"class":1256},[1143,2872,2874,2876],{"class":1145,"line":2873},114,[1143,2875,1377],{"class":1156},[1143,2877,1380],{"class":1164},[1143,2879,2881,2883,2885,2887,2889,2891,2893,2895,2897,2899,2901],{"class":1145,"line":2880},115,[1143,2882,1441],{"class":1156},[1143,2884,1727],{"class":1160},[1143,2886,1165],{"class":1164},[1143,2888,2140],{"class":1300},[1143,2890,1165],{"class":1164},[1143,2892,2145],{"class":1307},[1143,2894,1243],{"class":1164},[1143,2896,2095],{"class":1499},[1143,2898,1389],{"class":1164},[1143,2900,2095],{"class":1307},[1143,2902,1409],{"class":1164},[1143,2904,2906,2908,2910,2912,2914],{"class":1145,"line":2905},116,[1143,2907,1457],{"class":1156},[1143,2909,1727],{"class":1160},[1143,2911,1165],{"class":1164},[1143,2913,2811],{"class":1300},[1143,2915,1380],{"class":1164},[1143,2917,2919,2921],{"class":1145,"line":2918},117,[1143,2920,1441],{"class":1156},[1143,2922,2821],{"class":2500},[1143,2924,2926],{"class":1145,"line":2925},118,[1143,2927,1270],{"class":1160},[1143,2929,2931,2933,2936,2938,2940,2942,2944,2946,2948,2950,2952,2955],{"class":1145,"line":2930},119,[1143,2932,1276],{"class":1235},[1143,2934,2935],{"class":1341}," exists_by_name",[1143,2937,1243],{"class":1164},[1143,2939,1286],{"class":1285},[1143,2941,1349],{"class":1164},[1143,2943,2843],{"class":1352},[1143,2945,1485],{"class":1164},[1143,2947,2848],{"class":1849},[1143,2949,1853],{"class":1164},[1143,2951,1856],{"class":1164},[1143,2953,2954],{"class":1849}," bool",[1143,2956,1380],{"class":1164},[1143,2958,2960,2962,2965],{"class":1145,"line":2959},120,[1143,2961,1366],{"class":1256},[1143,2963,2964],{"class":1260},"Check if product exists by name",[1143,2966,1264],{"class":1256},[1143,2968,2970,2972,2974,2976,2978,2980,2983,2985,2987,2989,2991,2993,2996],{"class":1145,"line":2969},121,[1143,2971,1999],{"class":1156},[1143,2973,1727],{"class":1160},[1143,2975,1165],{"class":1164},[1143,2977,2140],{"class":1300},[1143,2979,1165],{"class":1164},[1143,2981,2982],{"class":1307},"filter",[1143,2984,1243],{"class":1164},[1143,2986,2095],{"class":1499},[1143,2988,1389],{"class":1164},[1143,2990,2095],{"class":1307},[1143,2992,2787],{"class":1164},[1143,2994,2995],{"class":1307},"exists",[1143,2997,1311],{"class":1164},[1143,2999,3001],{"class":1145,"line":3000},122,[1143,3002,1270],{"class":1160},[1143,3004,3006,3008,3011,3013,3015,3017,3020,3022,3024,3026,3028,3031,3033,3035],{"class":1145,"line":3005},123,[1143,3007,1276],{"class":1235},[1143,3009,3010],{"class":1341}," find_by_category",[1143,3012,1243],{"class":1164},[1143,3014,1286],{"class":1285},[1143,3016,1349],{"class":1164},[1143,3018,3019],{"class":1352}," category_id",[1143,3021,1485],{"class":1164},[1143,3023,1850],{"class":1849},[1143,3025,1853],{"class":1164},[1143,3027,1856],{"class":1164},[1143,3029,3030],{"class":1160}," List",[1143,3032,2090],{"class":1164},[1143,3034,2739],{"class":1160},[1143,3036,2742],{"class":1164},[1143,3038,3040,3042,3045],{"class":1145,"line":3039},124,[1143,3041,1366],{"class":1256},[1143,3043,3044],{"class":1260},"Find products by category",[1143,3046,1264],{"class":1256},[1143,3048,3050,3052,3055],{"class":1145,"line":3049},125,[1143,3051,1999],{"class":1156},[1143,3053,3054],{"class":1849}," list",[1143,3056,2224],{"class":1164},[1143,3058,3060,3063,3065,3067,3069,3071,3073,3075,3077,3079,3081,3084,3086,3089],{"class":1145,"line":3059},126,[1143,3061,3062],{"class":1307},"            Product",[1143,3064,1165],{"class":1164},[1143,3066,2140],{"class":1300},[1143,3068,1165],{"class":1164},[1143,3070,2982],{"class":1307},[1143,3072,1243],{"class":1164},[1143,3074,2161],{"class":1499},[1143,3076,1389],{"class":1164},[1143,3078,2161],{"class":1307},[1143,3080,1349],{"class":1164},[1143,3082,3083],{"class":1499}," is_active",[1143,3085,1389],{"class":1164},[1143,3087,3088],{"class":2500},"True",[1143,3090,1409],{"class":1164},[1143,3092,3094,3097,3099,3101,3103,3105,3107],{"class":1145,"line":3093},127,[1143,3095,3096],{"class":1164},"            .",[1143,3098,2775],{"class":1307},[1143,3100,1243],{"class":1164},[1143,3102,1476],{"class":1475},[1143,3104,2782],{"class":1479},[1143,3106,1476],{"class":1475},[1143,3108,1409],{"class":1164},[1143,3110,3112,3114,3117,3119,3121,3123,3125],{"class":1145,"line":3111},128,[1143,3113,3096],{"class":1164},[1143,3115,3116],{"class":1307},"order_by",[1143,3118,1243],{"class":1164},[1143,3120,1476],{"class":1475},[1143,3122,2095],{"class":1479},[1143,3124,1476],{"class":1475},[1143,3126,1409],{"class":1164},[1143,3128,3130],{"class":1145,"line":3129},129,[1143,3131,2304],{"class":1164},[1143,3133,3135],{"class":1145,"line":3134},130,[1143,3136,1270],{"class":1160},[1143,3138,3140,3142,3145,3147,3149,3151,3154,3156,3158,3160,3162,3164,3166,3168],{"class":1145,"line":3139},131,[1143,3141,1276],{"class":1235},[1143,3143,3144],{"class":1341}," search",[1143,3146,1243],{"class":1164},[1143,3148,1286],{"class":1285},[1143,3150,1349],{"class":1164},[1143,3152,3153],{"class":1352}," query",[1143,3155,1485],{"class":1164},[1143,3157,2848],{"class":1849},[1143,3159,1853],{"class":1164},[1143,3161,1856],{"class":1164},[1143,3163,3030],{"class":1160},[1143,3165,2090],{"class":1164},[1143,3167,2739],{"class":1160},[1143,3169,2742],{"class":1164},[1143,3171,3173,3175,3178],{"class":1145,"line":3172},132,[1143,3174,1366],{"class":1256},[1143,3176,3177],{"class":1260},"Search products by name or description",[1143,3179,1264],{"class":1256},[1143,3181,3183,3185,3187],{"class":1145,"line":3182},133,[1143,3184,1999],{"class":1156},[1143,3186,3054],{"class":1849},[1143,3188,2224],{"class":1164},[1143,3190,3192,3194,3196,3198,3200,3202],{"class":1145,"line":3191},134,[1143,3193,3062],{"class":1307},[1143,3195,1165],{"class":1164},[1143,3197,2140],{"class":1300},[1143,3199,1165],{"class":1164},[1143,3201,2982],{"class":1307},[1143,3203,2224],{"class":1164},[1143,3205,3207,3210,3212,3215,3217,3220,3222,3225,3228,3230,3233,3235,3237],{"class":1145,"line":3206},135,[1143,3208,3209],{"class":1307},"                Q",[1143,3211,1243],{"class":1164},[1143,3213,3214],{"class":1499},"name__icontains",[1143,3216,1389],{"class":1164},[1143,3218,3219],{"class":1307},"query",[1143,3221,1853],{"class":1164},[1143,3223,3224],{"class":1904}," |",[1143,3226,3227],{"class":1307}," Q",[1143,3229,1243],{"class":1164},[1143,3231,3232],{"class":1499},"description__icontains",[1143,3234,1389],{"class":1164},[1143,3236,3219],{"class":1307},[1143,3238,3239],{"class":1164},"),\n",[1143,3241,3243,3246,3248],{"class":1145,"line":3242},136,[1143,3244,3245],{"class":1499},"                is_active",[1143,3247,1389],{"class":1164},[1143,3249,3250],{"class":2500},"True\n",[1143,3252,3254,3257,3259,3261,3263,3265,3267],{"class":1145,"line":3253},137,[1143,3255,3256],{"class":1164},"            ).",[1143,3258,2775],{"class":1307},[1143,3260,1243],{"class":1164},[1143,3262,1476],{"class":1475},[1143,3264,2782],{"class":1479},[1143,3266,1476],{"class":1475},[1143,3268,1409],{"class":1164},[1143,3270,3272],{"class":1145,"line":3271},138,[1143,3273,2304],{"class":1164},[1143,3275,3277],{"class":1145,"line":3276},139,[1143,3278,1270],{"class":1160},[1143,3280,3282,3284,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305],{"class":1145,"line":3281},140,[1143,3283,1276],{"class":1235},[1143,3285,3286],{"class":1341}," save",[1143,3288,1243],{"class":1164},[1143,3290,1286],{"class":1285},[1143,3292,1349],{"class":1164},[1143,3294,1908],{"class":1352},[1143,3296,1485],{"class":1164},[1143,3298,1727],{"class":1160},[1143,3300,1853],{"class":1164},[1143,3302,1856],{"class":1164},[1143,3304,1727],{"class":1160},[1143,3306,1380],{"class":1164},[1143,3308,3310,3312,3315],{"class":1145,"line":3309},141,[1143,3311,1366],{"class":1256},[1143,3313,3314],{"class":1260},"Save product to database",[1143,3316,1264],{"class":1256},[1143,3318,3320,3322,3324,3326],{"class":1145,"line":3319},142,[1143,3321,2321],{"class":1160},[1143,3323,1165],{"class":1164},[1143,3325,2361],{"class":1307},[1143,3327,1311],{"class":1164},[1143,3329,3331,3333],{"class":1145,"line":3330},143,[1143,3332,1999],{"class":1156},[1143,3334,2002],{"class":1160},[1143,3336,3338],{"class":1145,"line":3337},144,[1143,3339,1270],{"class":1160},[1143,3341,3343,3345,3348,3350,3352,3354,3356,3358,3360,3362,3364,3367],{"class":1145,"line":3342},145,[1143,3344,1276],{"class":1235},[1143,3346,3347],{"class":1341}," delete",[1143,3349,1243],{"class":1164},[1143,3351,1286],{"class":1285},[1143,3353,1349],{"class":1164},[1143,3355,1908],{"class":1352},[1143,3357,1485],{"class":1164},[1143,3359,1727],{"class":1160},[1143,3361,1853],{"class":1164},[1143,3363,1856],{"class":1164},[1143,3365,3366],{"class":2500}," None",[1143,3368,1380],{"class":1164},[1143,3370,3372,3374,3377],{"class":1145,"line":3371},146,[1143,3373,1366],{"class":1256},[1143,3375,3376],{"class":1260},"Delete product from database",[1143,3378,1264],{"class":1256},[1143,3380,3382,3384,3386,3389],{"class":1145,"line":3381},147,[1143,3383,2321],{"class":1160},[1143,3385,1165],{"class":1164},[1143,3387,3388],{"class":1307},"delete",[1143,3390,1311],{"class":1164},[1143,3392,3394],{"class":1145,"line":3393},148,[1143,3395,1229],{"emptyLinePlaceholder":1228},[1143,3397,3399],{"class":1145,"line":3398},149,[1143,3400,3401],{"class":1149},"# Domain Layer (Models with Business Logic)\n",[1143,3403,3405,3407,3409,3411,3413,3415],{"class":1145,"line":3404},150,[1143,3406,1157],{"class":1156},[1143,3408,1161],{"class":1160},[1143,3410,1165],{"class":1164},[1143,3412,1759],{"class":1160},[1143,3414,1171],{"class":1156},[1143,3416,3417],{"class":1160}," models\n",[1143,3419,3421,3423,3426,3428],{"class":1145,"line":3420},151,[1143,3422,1157],{"class":1156},[1143,3424,3425],{"class":1160}," decimal ",[1143,3427,1171],{"class":1156},[1143,3429,3430],{"class":1160}," Decimal\n",[1143,3432,3434],{"class":1145,"line":3433},152,[1143,3435,1229],{"emptyLinePlaceholder":1228},[1143,3437,3439,3441,3443,3445,3448,3450,3453],{"class":1145,"line":3438},153,[1143,3440,1236],{"class":1235},[1143,3442,1727],{"class":1239},[1143,3444,1243],{"class":1164},[1143,3446,3447],{"class":1246},"models",[1143,3449,1165],{"class":1164},[1143,3451,3452],{"class":1246},"Model",[1143,3454,1250],{"class":1164},[1143,3456,3458,3460,3463],{"class":1145,"line":3457},154,[1143,3459,1257],{"class":1256},[1143,3461,3462],{"class":1260},"Product model with business logic",[1143,3464,1264],{"class":1256},[1143,3466,3468],{"class":1145,"line":3467},155,[1143,3469,1270],{"class":1160},[1143,3471,3473,3476,3478,3481,3483,3486,3488,3491,3493,3496,3498,3501,3503,3505],{"class":1145,"line":3472},156,[1143,3474,3475],{"class":1160},"    name ",[1143,3477,1389],{"class":1164},[1143,3479,3480],{"class":1160}," models",[1143,3482,1165],{"class":1164},[1143,3484,3485],{"class":1307},"CharField",[1143,3487,1243],{"class":1164},[1143,3489,3490],{"class":1499},"max_length",[1143,3492,1389],{"class":1164},[1143,3494,3495],{"class":1505},"200",[1143,3497,1349],{"class":1164},[1143,3499,3500],{"class":1499}," unique",[1143,3502,1389],{"class":1164},[1143,3504,3088],{"class":2500},[1143,3506,1409],{"class":1164},[1143,3508,3510,3513,3515,3517,3519,3522],{"class":1145,"line":3509},157,[1143,3511,3512],{"class":1160},"    description ",[1143,3514,1389],{"class":1164},[1143,3516,3480],{"class":1160},[1143,3518,1165],{"class":1164},[1143,3520,3521],{"class":1307},"TextField",[1143,3523,1311],{"class":1164},[1143,3525,3527,3530,3532,3534,3536,3539,3541,3544,3546,3549,3551,3554,3556,3559],{"class":1145,"line":3526},158,[1143,3528,3529],{"class":1160},"    price ",[1143,3531,1389],{"class":1164},[1143,3533,3480],{"class":1160},[1143,3535,1165],{"class":1164},[1143,3537,3538],{"class":1307},"DecimalField",[1143,3540,1243],{"class":1164},[1143,3542,3543],{"class":1499},"max_digits",[1143,3545,1389],{"class":1164},[1143,3547,3548],{"class":1505},"10",[1143,3550,1349],{"class":1164},[1143,3552,3553],{"class":1499}," decimal_places",[1143,3555,1389],{"class":1164},[1143,3557,3558],{"class":1505},"2",[1143,3560,1409],{"class":1164},[1143,3562,3564,3567,3569,3571,3573,3576,3578,3580,3583,3585,3587,3590,3592,3594,3596,3600],{"class":1145,"line":3563},159,[1143,3565,3566],{"class":1160},"    category ",[1143,3568,1389],{"class":1164},[1143,3570,3480],{"class":1160},[1143,3572,1165],{"class":1164},[1143,3574,3575],{"class":1307},"ForeignKey",[1143,3577,1243],{"class":1164},[1143,3579,1476],{"class":1475},[1143,3581,3582],{"class":1479},"Category",[1143,3584,1476],{"class":1475},[1143,3586,1349],{"class":1164},[1143,3588,3589],{"class":1499}," on_delete",[1143,3591,1389],{"class":1164},[1143,3593,3447],{"class":1307},[1143,3595,1165],{"class":1164},[1143,3597,3599],{"class":3598},"sFGJz","CASCADE",[1143,3601,1409],{"class":1164},[1143,3603,3605,3608,3610,3612,3614,3617,3619,3622,3624,3626],{"class":1145,"line":3604},160,[1143,3606,3607],{"class":1160},"    is_active ",[1143,3609,1389],{"class":1164},[1143,3611,3480],{"class":1160},[1143,3613,1165],{"class":1164},[1143,3615,3616],{"class":1307},"BooleanField",[1143,3618,1243],{"class":1164},[1143,3620,3621],{"class":1499},"default",[1143,3623,1389],{"class":1164},[1143,3625,3088],{"class":2500},[1143,3627,1409],{"class":1164},[1143,3629,3631,3634,3636,3638,3640,3642,3644,3646,3648,3651],{"class":1145,"line":3630},161,[1143,3632,3633],{"class":1160},"    requires_approval ",[1143,3635,1389],{"class":1164},[1143,3637,3480],{"class":1160},[1143,3639,1165],{"class":1164},[1143,3641,3616],{"class":1307},[1143,3643,1243],{"class":1164},[1143,3645,3621],{"class":1499},[1143,3647,1389],{"class":1164},[1143,3649,3650],{"class":2500},"False",[1143,3652,1409],{"class":1164},[1143,3654,3656,3659,3661,3663,3665,3668,3670,3673,3675,3677],{"class":1145,"line":3655},162,[1143,3657,3658],{"class":1160},"    created_at ",[1143,3660,1389],{"class":1164},[1143,3662,3480],{"class":1160},[1143,3664,1165],{"class":1164},[1143,3666,3667],{"class":1307},"DateTimeField",[1143,3669,1243],{"class":1164},[1143,3671,3672],{"class":1499},"auto_now_add",[1143,3674,1389],{"class":1164},[1143,3676,3088],{"class":2500},[1143,3678,1409],{"class":1164},[1143,3680,3682,3685,3687,3689,3691,3693,3695,3698,3700,3702],{"class":1145,"line":3681},163,[1143,3683,3684],{"class":1160},"    price_updated_at ",[1143,3686,1389],{"class":1164},[1143,3688,3480],{"class":1160},[1143,3690,1165],{"class":1164},[1143,3692,3667],{"class":1307},[1143,3694,1243],{"class":1164},[1143,3696,3697],{"class":1499},"auto_now",[1143,3699,1389],{"class":1164},[1143,3701,3088],{"class":2500},[1143,3703,1409],{"class":1164},[1143,3705,3707],{"class":1145,"line":3706},164,[1143,3708,1270],{"class":1160},[1143,3710,3712,3714,3717,3719,3721],{"class":1145,"line":3711},165,[1143,3713,1276],{"class":1235},[1143,3715,3716],{"class":1341}," calculate_pricing",[1143,3718,1243],{"class":1164},[1143,3720,1286],{"class":1285},[1143,3722,1250],{"class":1164},[1143,3724,3726,3728,3731],{"class":1145,"line":3725},166,[1143,3727,1366],{"class":1256},[1143,3729,3730],{"class":1260},"Business logic for pricing calculation",[1143,3732,1264],{"class":1256},[1143,3734,3736],{"class":1145,"line":3735},167,[1143,3737,3738],{"class":1149},"        # Apply category-based pricing rules\n",[1143,3740,3742,3744,3746,3748,3750,3752,3755],{"class":1145,"line":3741},168,[1143,3743,1901],{"class":1156},[1143,3745,1392],{"class":1294},[1143,3747,1165],{"class":1164},[1143,3749,2782],{"class":1300},[1143,3751,1165],{"class":1164},[1143,3753,3754],{"class":1300},"premium_category",[1143,3756,1380],{"class":1164},[1143,3758,3760,3763,3765,3767,3770,3772,3774,3776,3779,3781,3783],{"class":1145,"line":3759},169,[1143,3761,3762],{"class":1294},"            self",[1143,3764,1165],{"class":1164},[1143,3766,2283],{"class":1300},[1143,3768,3769],{"class":1164}," *=",[1143,3771,2402],{"class":1307},[1143,3773,1243],{"class":1164},[1143,3775,1476],{"class":1475},[1143,3777,3778],{"class":1479},"1.2",[1143,3780,1476],{"class":1475},[1143,3782,1853],{"class":1164},[1143,3784,3785],{"class":1149},"  # 20% premium\n",[1143,3787,3789],{"class":1145,"line":3788},170,[1143,3790,1946],{"class":1160},[1143,3792,3794],{"class":1145,"line":3793},171,[1143,3795,3796],{"class":1149},"        # Apply volume-based pricing\n",[1143,3798,3800,3802,3804,3806,3808,3810,3813],{"class":1145,"line":3799},172,[1143,3801,1901],{"class":1156},[1143,3803,1392],{"class":1294},[1143,3805,1165],{"class":1164},[1143,3807,2283],{"class":1300},[1143,3809,2464],{"class":1904},[1143,3811,3812],{"class":1505}," 100",[1143,3814,1380],{"class":1164},[1143,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3837,3839,3842,3844,3846,3849,3851,3854],{"class":1145,"line":3817},173,[1143,3819,3762],{"class":1294},[1143,3821,1165],{"class":1164},[1143,3823,2283],{"class":1300},[1143,3825,1304],{"class":1164},[1143,3827,1392],{"class":1294},[1143,3829,1165],{"class":1164},[1143,3831,2283],{"class":1300},[1143,3833,1165],{"class":1164},[1143,3835,3836],{"class":1307},"quantize",[1143,3838,1243],{"class":1164},[1143,3840,3841],{"class":1307},"Decimal",[1143,3843,1243],{"class":1164},[1143,3845,1476],{"class":1475},[1143,3847,3848],{"class":1479},"0.99",[1143,3850,1476],{"class":1475},[1143,3852,3853],{"class":1164},"))",[1143,3855,3856],{"class":1149},"  # Psychological pricing\n",[1143,3858,3860],{"class":1145,"line":3859},174,[1143,3861,1270],{"class":1160},[1143,3863,3865,3867,3870,3872,3874],{"class":1145,"line":3864},175,[1143,3866,1276],{"class":1235},[1143,3868,3869],{"class":1341}," set_initial_status",[1143,3871,1243],{"class":1164},[1143,3873,1286],{"class":1285},[1143,3875,1250],{"class":1164},[1143,3877,3879,3881,3884],{"class":1145,"line":3878},176,[1143,3880,1366],{"class":1256},[1143,3882,3883],{"class":1260},"Business logic for initial status",[1143,3885,1264],{"class":1256},[1143,3887,3889],{"class":1145,"line":3888},177,[1143,3890,3891],{"class":1149},"        # New products start as inactive for review\n",[1143,3893,3895,3897,3899,3901,3903],{"class":1145,"line":3894},178,[1143,3896,1295],{"class":1294},[1143,3898,1165],{"class":1164},[1143,3900,1966],{"class":1300},[1143,3902,1304],{"class":1164},[1143,3904,3905],{"class":2500}," False\n",[1143,3907,3909],{"class":1145,"line":3908},179,[1143,3910,1946],{"class":1160},[1143,3912,3914],{"class":1145,"line":3913},180,[1143,3915,3916],{"class":1149},"        # Expensive products require approval\n",[1143,3918,3920,3922,3924,3926,3928,3930,3932],{"class":1145,"line":3919},181,[1143,3921,1901],{"class":1156},[1143,3923,1392],{"class":1294},[1143,3925,1165],{"class":1164},[1143,3927,2283],{"class":1300},[1143,3929,2464],{"class":1904},[1143,3931,2467],{"class":1505},[1143,3933,1380],{"class":1164},[1143,3935,3937,3939,3941,3943,3945],{"class":1145,"line":3936},182,[1143,3938,3762],{"class":1294},[1143,3940,1165],{"class":1164},[1143,3942,2495],{"class":1300},[1143,3944,1304],{"class":1164},[1143,3946,2501],{"class":2500},[1143,3948,3950],{"class":1145,"line":3949},183,[1143,3951,1270],{"class":1160},[1143,3953,3955,3957,3960,3962,3964,3966,3968,3970],{"class":1145,"line":3954},184,[1143,3956,1276],{"class":1235},[1143,3958,3959],{"class":1341}," can_be_deleted",[1143,3961,1243],{"class":1164},[1143,3963,1286],{"class":1285},[1143,3965,1853],{"class":1164},[1143,3967,1856],{"class":1164},[1143,3969,2954],{"class":1849},[1143,3971,1380],{"class":1164},[1143,3973,3975,3977,3980],{"class":1145,"line":3974},185,[1143,3976,1366],{"class":1256},[1143,3978,3979],{"class":1260},"Business rule for deletion",[1143,3981,1264],{"class":1256},[1143,3983,3985],{"class":1145,"line":3984},186,[1143,3986,3987],{"class":1149},"        # Cannot delete products with orders\n",[1143,3989,3991,3993,3995,3997,3999,4002,4004,4006],{"class":1145,"line":3990},187,[1143,3992,1999],{"class":1156},[1143,3994,1905],{"class":1904},[1143,3996,1392],{"class":1294},[1143,3998,1165],{"class":1164},[1143,4000,4001],{"class":1300},"orderitem_set",[1143,4003,1165],{"class":1164},[1143,4005,2995],{"class":1307},[1143,4007,1311],{"class":1164},[1143,4009,4011],{"class":1145,"line":4010},188,[1143,4012,1270],{"class":1160},[1143,4014,4016,4018,4021,4023,4025,4027,4030,4032,4034,4036,4038,4040],{"class":1145,"line":4015},189,[1143,4017,1276],{"class":1235},[1143,4019,4020],{"class":1341}," apply_discount",[1143,4022,1243],{"class":1164},[1143,4024,1286],{"class":1285},[1143,4026,1349],{"class":1164},[1143,4028,4029],{"class":1352}," percentage",[1143,4031,1485],{"class":1164},[1143,4033,2402],{"class":1160},[1143,4035,1853],{"class":1164},[1143,4037,1856],{"class":1164},[1143,4039,2402],{"class":1160},[1143,4041,1380],{"class":1164},[1143,4043,4045,4047,4050],{"class":1145,"line":4044},190,[1143,4046,1366],{"class":1256},[1143,4048,4049],{"class":1260},"Business logic for discount application",[1143,4051,1264],{"class":1256},[1143,4053,4055,4057,4060,4062,4065,4068,4070,4073,4076],{"class":1145,"line":4054},191,[1143,4056,1901],{"class":1156},[1143,4058,4059],{"class":1160}," percentage ",[1143,4061,2522],{"class":1904},[1143,4063,4064],{"class":1505}," 0",[1143,4066,4067],{"class":1904}," or",[1143,4069,4059],{"class":1160},[1143,4071,4072],{"class":1904},">",[1143,4074,4075],{"class":1505}," 50",[1143,4077,1380],{"class":1164},[1143,4079,4081,4083,4086,4088,4090,4093,4096,4099,4101],{"class":1145,"line":4080},192,[1143,4082,1916],{"class":1156},[1143,4084,4085],{"class":1849}," ValueError",[1143,4087,1243],{"class":1164},[1143,4089,1981],{"class":1475},[1143,4091,4092],{"class":1479},"Discount must be between 0",[1143,4094,4095],{"class":1929},"% a",[1143,4097,4098],{"class":1479},"nd 50%",[1143,4100,1981],{"class":1475},[1143,4102,1409],{"class":1164},[1143,4104,4106],{"class":1145,"line":4105},193,[1143,4107,1946],{"class":1160},[1143,4109,4111,4114,4116,4118,4120,4122,4124,4127,4130,4133,4135],{"class":1145,"line":4110},194,[1143,4112,4113],{"class":1160},"        discount_amount ",[1143,4115,1389],{"class":1164},[1143,4117,1392],{"class":1294},[1143,4119,1165],{"class":1164},[1143,4121,2283],{"class":1300},[1143,4123,2531],{"class":1904},[1143,4125,4126],{"class":1164}," (",[1143,4128,4129],{"class":1160},"percentage ",[1143,4131,4132],{"class":1904},"/",[1143,4134,3812],{"class":1505},[1143,4136,1409],{"class":1164},[1143,4138,4140,4142,4144,4146,4148,4151],{"class":1145,"line":4139},195,[1143,4141,1999],{"class":1156},[1143,4143,1392],{"class":1294},[1143,4145,1165],{"class":1164},[1143,4147,2283],{"class":1300},[1143,4149,4150],{"class":1904}," -",[1143,4152,4153],{"class":1160}," discount_amount\n",[1143,4155,4157],{"class":1145,"line":4156},196,[1143,4158,1270],{"class":1160},[1143,4160,4162,4165,4168],{"class":1145,"line":4161},197,[1143,4163,4164],{"class":1235},"    class",[1143,4166,4167],{"class":1239}," Meta",[1143,4169,1380],{"class":1164},[1143,4171,4173,4176,4178],{"class":1145,"line":4172},198,[1143,4174,4175],{"class":1160},"        indexes ",[1143,4177,1389],{"class":1164},[1143,4179,4180],{"class":1164}," [\n",[1143,4182,4184,4187,4189,4192,4194,4197,4200,4202,4204,4206,4208,4210,4212,4214],{"class":1145,"line":4183},199,[1143,4185,4186],{"class":1160},"            models",[1143,4188,1165],{"class":1164},[1143,4190,4191],{"class":1307},"Index",[1143,4193,1243],{"class":1164},[1143,4195,4196],{"class":1499},"fields",[1143,4198,4199],{"class":1164},"=[",[1143,4201,1476],{"class":1475},[1143,4203,2782],{"class":1479},[1143,4205,1476],{"class":1475},[1143,4207,1349],{"class":1164},[1143,4209,1488],{"class":1475},[1143,4211,1966],{"class":1479},[1143,4213,1476],{"class":1475},[1143,4215,4216],{"class":1164},"]),\n",[1143,4218,4220,4222,4224,4226,4228,4230,4232,4234,4236,4238],{"class":1145,"line":4219},200,[1143,4221,4186],{"class":1160},[1143,4223,1165],{"class":1164},[1143,4225,4191],{"class":1307},[1143,4227,1243],{"class":1164},[1143,4229,4196],{"class":1499},[1143,4231,4199],{"class":1164},[1143,4233,1476],{"class":1475},[1143,4235,2095],{"class":1479},[1143,4237,1476],{"class":1475},[1143,4239,4216],{"class":1164},[1143,4241,4243],{"class":1145,"line":4242},201,[1143,4244,4245],{"class":1164},"        ]\n",[1030,4247,4249],{"id":4248},"hexagonal-architecture-ports-and-adapters","Hexagonal Architecture (Ports and Adapters)",[1026,4251,4252],{},"Hexagonal architecture, also known as Ports and Adapters, isolates the core business logic from external concerns. This pattern is excellent for complex Django applications with multiple integrations.",[1038,4254,4256],{"id":4255},"core-concepts","Core Concepts",[1133,4258,4260],{"className":1135,"code":4259,"language":1137,"meta":1138,"style":1138},"# Domain Layer - Pure business logic\nfrom abc import ABC, abstractmethod\nfrom typing import List, Optional\nfrom dataclasses import dataclass\nfrom decimal import Decimal\n\n@dataclass\nclass OrderItem:\n    \"\"\"Value object for order items\"\"\"\n    product_id: int\n    quantity: int\n    price: Decimal\n    \n    def total(self) -> Decimal:\n        return self.quantity * self.price\n\nclass Order:\n    \"\"\"Rich domain model with business logic\"\"\"\n    \n    def __init__(self, customer_id: int):\n        self.customer_id = customer_id\n        self.items: List[OrderItem] = []\n        self.status = 'draft'\n        self.total = Decimal('0.00')\n        self.created_at = None\n        self.id = None\n    \n    def add_item(self, product_id: int, quantity: int, price: Decimal):\n        \"\"\"Add item with business validation\"\"\"\n        if quantity \u003C= 0:\n            raise ValueError(\"Quantity must be positive\")\n        \n        if price \u003C= 0:\n            raise ValueError(\"Price must be positive\")\n        \n        # Check if item already exists\n        existing_item = self._find_item(product_id)\n        if existing_item:\n            existing_item.quantity += quantity\n        else:\n            self.items.append(OrderItem(product_id, quantity, price))\n        \n        self._recalculate_total()\n    \n    def remove_item(self, product_id: int):\n        \"\"\"Remove item from order\"\"\"\n        self.items = [item for item in self.items if item.product_id != product_id]\n        self._recalculate_total()\n    \n    def confirm(self):\n        \"\"\"Confirm order with business rules\"\"\"\n        if not self.items:\n            raise ValueError(\"Cannot confirm empty order\")\n        \n        if self.status != 'draft':\n            raise ValueError(\"Can only confirm draft orders\")\n        \n        self.status = 'confirmed'\n    \n    def cancel(self):\n        \"\"\"Cancel order with business rules\"\"\"\n        if self.status not in ['draft', 'confirmed']:\n            raise ValueError(\"Cannot cancel order in current status\")\n        \n        self.status = 'cancelled'\n    \n    def _find_item(self, product_id: int) -> Optional[OrderItem]:\n        \"\"\"Find item by product ID\"\"\"\n        return next((item for item in self.items if item.product_id == product_id), None)\n    \n    def _recalculate_total(self):\n        \"\"\"Recalculate order total\"\"\"\n        self.total = sum(item.total() for item in self.items)\n\n# Ports (Interfaces) - Define contracts\nclass OrderRepository(ABC):\n    \"\"\"Port for order persistence\"\"\"\n    \n    @abstractmethod\n    def save(self, order: Order) -> Order:\n        pass\n    \n    @abstractmethod\n    def get_by_id(self, order_id: int) -> Optional[Order]:\n        pass\n    \n    @abstractmethod\n    def get_by_customer(self, customer_id: int) -> List[Order]:\n        pass\n\nclass PaymentService(ABC):\n    \"\"\"Port for payment processing\"\"\"\n    \n    @abstractmethod\n    def process_payment(self, order: Order, payment_method: str) -> bool:\n        pass\n\nclass InventoryService(ABC):\n    \"\"\"Port for inventory management\"\"\"\n    \n    @abstractmethod\n    def reserve_items(self, items: List[OrderItem]) -> bool:\n        pass\n    \n    @abstractmethod\n    def release_items(self, items: List[OrderItem]) -> bool:\n        pass\n\nclass NotificationService(ABC):\n    \"\"\"Port for notifications\"\"\"\n    \n    @abstractmethod\n    def send_order_confirmation(self, order: Order) -> bool:\n        pass\n\n# Application Service - Orchestrates use cases\nclass OrderService:\n    \"\"\"Application service using dependency inversion\"\"\"\n    \n    def __init__(self, \n                 order_repo: OrderRepository,\n                 payment_service: PaymentService,\n                 inventory_service: InventoryService,\n                 notification_service: NotificationService):\n        self.order_repo = order_repo\n        self.payment_service = payment_service\n        self.inventory_service = inventory_service\n        self.notification_service = notification_service\n    \n    def create_order(self, customer_id: int, items: List[dict]) -> Order:\n        \"\"\"Create new order use case\"\"\"\n        order = Order(customer_id)\n        \n        # Add items to order\n        for item_data in items:\n            order.add_item(\n                product_id=item_data['product_id'],\n                quantity=item_data['quantity'],\n                price=item_data['price']\n            )\n        \n        # Save order\n        return self.order_repo.save(order)\n    \n    def place_order(self, order_id: int, payment_method: str) -> bool:\n        \"\"\"Place order use case\"\"\"\n        order = self.order_repo.get_by_id(order_id)\n        if not order:\n            raise ValueError(\"Order not found\")\n        \n        # Reserve inventory\n        if not self.inventory_service.reserve_items(order.items):\n            raise ValueError(\"Insufficient inventory\")\n        \n        try:\n            # Process payment\n            if not self.payment_service.process_payment(order, payment_method):\n                # Release inventory if payment fails\n                self.inventory_service.release_items(order.items)\n                raise ValueError(\"Payment processing failed\")\n            \n            # Confirm order\n            order.confirm()\n            self.order_repo.save(order)\n            \n            # Send confirmation\n            self.notification_service.send_order_confirmation(order)\n            \n            return True\n            \n        except Exception:\n            # Release inventory on any failure\n            self.inventory_service.release_items(order.items)\n            raise\n\n# Adapters - Implement the ports\nfrom django.db import models, transaction\n\nclass DjangoOrderRepository(OrderRepository):\n    \"\"\"Django ORM adapter for order repository\"\"\"\n    \n    def save(self, order: Order) -> Order:\n        \"\"\"Save order using Django ORM\"\"\"\n        with transaction.atomic():\n            if order.id:\n                # Update existing order\n                django_order = OrderModel.objects.get(id=order.id)\n                django_order.status = order.status\n                django_order.total = order.total\n                django_order.save()\n                \n                # Update items\n                django_order.items.all().delete()\n            else:\n                # Create new order\n                django_order = OrderModel.objects.create(\n                    customer_id=order.customer_id,\n                    status=order.status,\n                    total=order.total\n                )\n                order.id = django_order.id\n                order.created_at = django_order.created_at\n            \n            # Save items\n            for item in order.items:\n                OrderItemModel.objects.create(\n                    order=django_order,\n                    product_id=item.product_id,\n                    quantity=item.quantity,\n                    price=item.price\n                )\n        \n        return order\n    \n    def get_by_id(self, order_id: int) -> Optional[Order]:\n        \"\"\"Get order by ID\"\"\"\n        try:\n            django_order = OrderModel.objects.prefetch_related('items').get(id=order_id)\n            return self._to_domain_object(django_order)\n        except OrderModel.DoesNotExist:\n            return None\n    \n    def get_by_customer(self, customer_id: int) -> List[Order]:\n        \"\"\"Get orders by customer\"\"\"\n        django_orders = OrderModel.objects.filter(\n            customer_id=customer_id\n        ).prefetch_related('items').order_by('-created_at')\n        \n        return [self._to_domain_object(django_order) for django_order in django_orders]\n    \n    def _to_domain_object(self, django_order) -> Order:\n        \"\"\"Convert Django model to domain object\"\"\"\n        order = Order(django_order.customer_id)\n        order.id = django_order.id\n        order.status = django_order.status\n        order.total = django_order.total\n        order.created_at = django_order.created_at\n        \n        # Add items\n        for django_item in django_order.items.all():\n            order.items.append(OrderItem(\n                product_id=django_item.product_id,\n                quantity=django_item.quantity,\n                price=django_item.price\n            ))\n        \n        return order\n\nclass StripePaymentService(PaymentService):\n    \"\"\"Stripe adapter for payment processing\"\"\"\n    \n    def __init__(self, api_key: str):\n        self.api_key = api_key\n    \n    def process_payment(self, order: Order, payment_method: str) -> bool:\n        \"\"\"Process payment using Stripe\"\"\"\n        try:\n            # Stripe payment processing logic\n            import stripe\n            stripe.api_key = self.api_key\n            \n            charge = stripe.Charge.create(\n                amount=int(order.total * 100),  # Convert to cents\n                currency='usd',\n                source=payment_method,\n                description=f'Order {order.id}'\n            )\n            \n            return charge.paid\n        except Exception as e:\n            logger.error(f\"Payment processing failed: {e}\")\n            return False\n\nclass RedisInventoryService(InventoryService):\n    \"\"\"Redis adapter for inventory management\"\"\"\n    \n    def __init__(self, redis_client):\n        self.redis = redis_client\n    \n    def reserve_items(self, items: List[OrderItem]) -> bool:\n        \"\"\"Reserve items in Redis\"\"\"\n        pipe = self.redis.pipeline()\n        \n        try:\n            # Check availability first\n            for item in items:\n                available = self.redis.get(f\"inventory:{item.product_id}\")\n                if not available or int(available) \u003C item.quantity:\n                    return False\n            \n            # Reserve items\n            for item in items:\n                pipe.decrby(f\"inventory:{item.product_id}\", item.quantity)\n            \n            pipe.execute()\n            return True\n            \n        except Exception as e:\n            logger.error(f\"Inventory reservation failed: {e}\")\n            return False\n    \n    def release_items(self, items: List[OrderItem]) -> bool:\n        \"\"\"Release reserved items\"\"\"\n        pipe = self.redis.pipeline()\n        \n        try:\n            for item in items:\n                pipe.incrby(f\"inventory:{item.product_id}\", item.quantity)\n            \n            pipe.execute()\n            return True\n            \n        except Exception as e:\n            logger.error(f\"Inventory release failed: {e}\")\n            return False\n\n# Django Models (Infrastructure)\nclass OrderModel(models.Model):\n    \"\"\"Django model for order persistence\"\"\"\n    \n    customer_id = models.IntegerField()\n    status = models.CharField(max_length=20, default='draft')\n    total = models.DecimalField(max_digits=10, decimal_places=2, default=0)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n\nclass OrderItemModel(models.Model):\n    \"\"\"Django model for order items\"\"\"\n    \n    order = models.ForeignKey(OrderModel, related_name='items', on_delete=models.CASCADE)\n    product_id = models.IntegerField()\n    quantity = models.IntegerField()\n    price = models.DecimalField(max_digits=10, decimal_places=2)\n\n# Dependency Injection Configuration\nclass DIContainer:\n    \"\"\"Simple dependency injection container\"\"\"\n    \n    def __init__(self):\n        self._services = {}\n    \n    def register(self, interface, implementation):\n        \"\"\"Register service implementation\"\"\"\n        self._services[interface] = implementation\n    \n    def get(self, interface):\n        \"\"\"Get service implementation\"\"\"\n        return self._services.get(interface)\n\n# Configuration\ndef configure_dependencies():\n    \"\"\"Configure dependency injection\"\"\"\n    container = DIContainer()\n    \n    # Register implementations\n    container.register(OrderRepository, DjangoOrderRepository())\n    container.register(PaymentService, StripePaymentService(settings.STRIPE_API_KEY))\n    container.register(InventoryService, RedisInventoryService(redis_client))\n    container.register(NotificationService, EmailNotificationService())\n    \n    return container\n\n# Usage in views\ndef create_order_view(request):\n    \"\"\"View using hexagonal architecture\"\"\"\n    container = configure_dependencies()\n    \n    order_service = OrderService(\n        order_repo=container.get(OrderRepository),\n        payment_service=container.get(PaymentService),\n        inventory_service=container.get(InventoryService),\n        notification_service=container.get(NotificationService)\n    )\n    \n    # Extract data from request\n    customer_id = request.user.id\n    items = request.data.get('items', [])\n    \n    # Create order\n    order = order_service.create_order(customer_id, items)\n    \n    return JsonResponse({\n        'order_id': order.id,\n        'total': str(order.total),\n        'status': order.status\n    })\n",[1140,4261,4262,4267,4284,4299,4311,4321,4325,4333,4342,4351,4361,4370,4379,4383,4402,4422,4426,4435,4444,4448,4469,4483,4509,4528,4552,4565,4577,4581,4620,4629,4643,4660,4664,4677,4694,4698,4703,4723,4732,4747,4754,4786,4790,4801,4805,4826,4835,4884,4894,4898,4911,4920,4934,4951,4955,4975,4992,4996,5013,5017,5030,5039,5072,5089,5093,5110,5114,5145,5154,5198,5202,5215,5224,5264,5268,5273,5287,5296,5300,5307,5334,5339,5343,5349,5381,5385,5389,5395,5426,5430,5434,5447,5456,5460,5466,5502,5506,5510,5523,5532,5536,5542,5575,5579,5583,5589,5620,5624,5628,5641,5650,5654,5660,5687,5691,5695,5700,5709,5718,5722,5737,5749,5760,5771,5782,5796,5810,5824,5838,5842,5882,5891,5906,5910,5915,5929,5941,5961,5980,5999,6004,6008,6013,6034,6038,6073,6082,6105,6115,6132,6136,6141,6168,6185,6189,6195,6200,6228,6233,6257,6275,6280,6285,6296,6314,6318,6323,6342,6346,6352,6356,6365,6370,6392,6397,6401,6406,6424,6428,6442,6451,6455,6481,6490,6506,6518,6523,6555,6573,6590,6600,6605,6610,6630,6637,6642,6661,6676,6691,6704,6709,6728,6746,6751,6757,6775,6791,6804,6820,6836,6850,6855,6860,6868,6873,6904,6914,6921,6962,6980,6993,7000,7005,7036,7046,7066,7077,7108,7113,7144,7149,7173,7183,7202,7220,7237,7254,7271,7276,7282,7304,7323,7339,7354,7367,7373,7378,7385,7390,7405,7415,7420,7442,7457,7462,7497,7507,7514,7520,7529,7548,7553,7575,7603,7620,7633,7658,7663,7668,7681,7695,7723,7730,7735,7750,7760,7765,7783,7798,7803,7834,7844,7865,7870,7877,7883,7896,7935,7969,7977,7982,7988,8001,8040,8045,8058,8065,8070,8083,8109,8116,8121,8152,8162,8181,8186,8193,8206,8244,8249,8260,8267,8272,8285,8311,8318,8323,8329,8346,8356,8361,8378,8416,8457,8480,8504,8509,8527,8537,8542,8588,8604,8620,8651,8656,8662,8672,8682,8687,8700,8715,8720,8744,8754,8775,8780,8797,8807,8828,8833,8839,8850,8860,8872,8877,8883,8905,8934,8958,8979,8984,8993,8998,9004,9018,9028,9039,9044,9056,9077,9097,9117,9137,9143,9148,9154,9172,9203,9208,9214,9239,9244,9254,9274,9297,9314],{"__ignoreMap":1138},[1143,4263,4264],{"class":1145,"line":1146},[1143,4265,4266],{"class":1149},"# Domain Layer - Pure business logic\n",[1143,4268,4269,4271,4274,4276,4279,4281],{"class":1145,"line":1153},[1143,4270,1157],{"class":1156},[1143,4272,4273],{"class":1160}," abc ",[1143,4275,1171],{"class":1156},[1143,4277,4278],{"class":1294}," ABC",[1143,4280,1349],{"class":1164},[1143,4282,4283],{"class":1160}," abstractmethod\n",[1143,4285,4286,4288,4290,4292,4294,4296],{"class":1145,"line":1177},[1143,4287,1157],{"class":1156},[1143,4289,2648],{"class":1160},[1143,4291,1171],{"class":1156},[1143,4293,3030],{"class":1160},[1143,4295,1349],{"class":1164},[1143,4297,4298],{"class":1160}," Optional\n",[1143,4300,4301,4303,4306,4308],{"class":1145,"line":1194},[1143,4302,1157],{"class":1156},[1143,4304,4305],{"class":1160}," dataclasses ",[1143,4307,1171],{"class":1156},[1143,4309,4310],{"class":1160}," dataclass\n",[1143,4312,4313,4315,4317,4319],{"class":1145,"line":1210},[1143,4314,1157],{"class":1156},[1143,4316,3425],{"class":1160},[1143,4318,1171],{"class":1156},[1143,4320,3430],{"class":1160},[1143,4322,4323],{"class":1145,"line":1225},[1143,4324,1229],{"emptyLinePlaceholder":1228},[1143,4326,4327,4330],{"class":1145,"line":1232},[1143,4328,4329],{"class":1164},"@",[1143,4331,4332],{"class":1341},"dataclass\n",[1143,4334,4335,4337,4340],{"class":1145,"line":1253},[1143,4336,1236],{"class":1235},[1143,4338,4339],{"class":1239}," OrderItem",[1143,4341,1380],{"class":1164},[1143,4343,4344,4346,4349],{"class":1145,"line":1267},[1143,4345,1257],{"class":1256},[1143,4347,4348],{"class":1260},"Value object for order items",[1143,4350,1264],{"class":1256},[1143,4352,4353,4356,4358],{"class":1145,"line":1273},[1143,4354,4355],{"class":1160},"    product_id",[1143,4357,1485],{"class":1164},[1143,4359,4360],{"class":1849}," int\n",[1143,4362,4363,4366,4368],{"class":1145,"line":1291},[1143,4364,4365],{"class":1160},"    quantity",[1143,4367,1485],{"class":1164},[1143,4369,4360],{"class":1849},[1143,4371,4372,4375,4377],{"class":1145,"line":1314},[1143,4373,4374],{"class":1160},"    price",[1143,4376,1485],{"class":1164},[1143,4378,3430],{"class":1160},[1143,4380,4381],{"class":1145,"line":1331},[1143,4382,1270],{"class":1160},[1143,4384,4385,4387,4390,4392,4394,4396,4398,4400],{"class":1145,"line":1336},[1143,4386,1276],{"class":1235},[1143,4388,4389],{"class":1341}," total",[1143,4391,1243],{"class":1164},[1143,4393,1286],{"class":1285},[1143,4395,1853],{"class":1164},[1143,4397,1856],{"class":1164},[1143,4399,2402],{"class":1160},[1143,4401,1380],{"class":1164},[1143,4403,4404,4406,4408,4410,4413,4415,4417,4419],{"class":1145,"line":1363},[1143,4405,1999],{"class":1156},[1143,4407,1392],{"class":1294},[1143,4409,1165],{"class":1164},[1143,4411,4412],{"class":1300},"quantity",[1143,4414,2531],{"class":1904},[1143,4416,1392],{"class":1294},[1143,4418,1165],{"class":1164},[1143,4420,4421],{"class":1300},"price\n",[1143,4423,4424],{"class":1145,"line":1374},[1143,4425,1229],{"emptyLinePlaceholder":1228},[1143,4427,4428,4430,4433],{"class":1145,"line":1383},[1143,4429,1236],{"class":1235},[1143,4431,4432],{"class":1239}," Order",[1143,4434,1380],{"class":1164},[1143,4436,4437,4439,4442],{"class":1145,"line":1412},[1143,4438,1257],{"class":1256},[1143,4440,4441],{"class":1260},"Rich domain model with business logic",[1143,4443,1264],{"class":1256},[1143,4445,4446],{"class":1145,"line":1438},[1143,4447,1270],{"class":1160},[1143,4449,4450,4452,4454,4456,4458,4460,4463,4465,4467],{"class":1145,"line":1454},[1143,4451,1276],{"class":1235},[1143,4453,1280],{"class":1279},[1143,4455,1243],{"class":1164},[1143,4457,1286],{"class":1285},[1143,4459,1349],{"class":1164},[1143,4461,4462],{"class":1352}," customer_id",[1143,4464,1485],{"class":1164},[1143,4466,1850],{"class":1849},[1143,4468,1250],{"class":1164},[1143,4470,4471,4473,4475,4478,4480],{"class":1145,"line":1465},[1143,4472,1295],{"class":1294},[1143,4474,1165],{"class":1164},[1143,4476,4477],{"class":1300},"customer_id",[1143,4479,1304],{"class":1164},[1143,4481,4482],{"class":1160}," customer_id\n",[1143,4484,4485,4487,4489,4492,4494,4496,4498,4501,4504,4506],{"class":1145,"line":1511},[1143,4486,1295],{"class":1294},[1143,4488,1165],{"class":1164},[1143,4490,4491],{"class":1300},"items",[1143,4493,1485],{"class":1164},[1143,4495,3030],{"class":1160},[1143,4497,2090],{"class":1164},[1143,4499,4500],{"class":1160},"OrderItem",[1143,4502,4503],{"class":1164},"]",[1143,4505,1304],{"class":1164},[1143,4507,4508],{"class":1164}," []\n",[1143,4510,4511,4513,4515,4518,4520,4522,4525],{"class":1145,"line":1516},[1143,4512,1295],{"class":1294},[1143,4514,1165],{"class":1164},[1143,4516,4517],{"class":1300},"status",[1143,4519,1304],{"class":1164},[1143,4521,1488],{"class":1475},[1143,4523,4524],{"class":1479},"draft",[1143,4526,4527],{"class":1475},"'\n",[1143,4529,4530,4532,4534,4537,4539,4541,4543,4545,4548,4550],{"class":1145,"line":1534},[1143,4531,1295],{"class":1294},[1143,4533,1165],{"class":1164},[1143,4535,4536],{"class":1300},"total",[1143,4538,1304],{"class":1164},[1143,4540,2402],{"class":1307},[1143,4542,1243],{"class":1164},[1143,4544,1476],{"class":1475},[1143,4546,4547],{"class":1479},"0.00",[1143,4549,1476],{"class":1475},[1143,4551,1409],{"class":1164},[1143,4553,4554,4556,4558,4561,4563],{"class":1145,"line":1544},[1143,4555,1295],{"class":1294},[1143,4557,1165],{"class":1164},[1143,4559,4560],{"class":1300},"created_at",[1143,4562,1304],{"class":1164},[1143,4564,2821],{"class":2500},[1143,4566,4567,4569,4571,4573,4575],{"class":1145,"line":1551},[1143,4568,1295],{"class":1294},[1143,4570,1165],{"class":1164},[1143,4572,2150],{"class":1300},[1143,4574,1304],{"class":1164},[1143,4576,2821],{"class":2500},[1143,4578,4579],{"class":1145,"line":1581},[1143,4580,1270],{"class":1160},[1143,4582,4583,4585,4588,4590,4592,4594,4596,4598,4600,4602,4605,4607,4609,4611,4614,4616,4618],{"class":1145,"line":1605},[1143,4584,1276],{"class":1235},[1143,4586,4587],{"class":1341}," add_item",[1143,4589,1243],{"class":1164},[1143,4591,1286],{"class":1285},[1143,4593,1349],{"class":1164},[1143,4595,1358],{"class":1352},[1143,4597,1485],{"class":1164},[1143,4599,1850],{"class":1849},[1143,4601,1349],{"class":1164},[1143,4603,4604],{"class":1352}," quantity",[1143,4606,1485],{"class":1164},[1143,4608,1850],{"class":1849},[1143,4610,1349],{"class":1164},[1143,4612,4613],{"class":1352}," price",[1143,4615,1485],{"class":1164},[1143,4617,2402],{"class":1160},[1143,4619,1250],{"class":1164},[1143,4621,4622,4624,4627],{"class":1145,"line":1629},[1143,4623,1366],{"class":1256},[1143,4625,4626],{"class":1260},"Add item with business validation",[1143,4628,1264],{"class":1256},[1143,4630,4631,4633,4636,4639,4641],{"class":1145,"line":1652},[1143,4632,1901],{"class":1156},[1143,4634,4635],{"class":1160}," quantity ",[1143,4637,4638],{"class":1904},"\u003C=",[1143,4640,4064],{"class":1505},[1143,4642,1380],{"class":1164},[1143,4644,4645,4647,4649,4651,4653,4656,4658],{"class":1145,"line":1668},[1143,4646,1916],{"class":1156},[1143,4648,4085],{"class":1849},[1143,4650,1243],{"class":1164},[1143,4652,1981],{"class":1475},[1143,4654,4655],{"class":1479},"Quantity must be positive",[1143,4657,1981],{"class":1475},[1143,4659,1409],{"class":1164},[1143,4661,4662],{"class":1145,"line":1704},[1143,4663,1946],{"class":1160},[1143,4665,4666,4668,4671,4673,4675],{"class":1145,"line":1709},[1143,4667,1901],{"class":1156},[1143,4669,4670],{"class":1160}," price ",[1143,4672,4638],{"class":1904},[1143,4674,4064],{"class":1505},[1143,4676,1380],{"class":1164},[1143,4678,4679,4681,4683,4685,4687,4690,4692],{"class":1145,"line":1715},[1143,4680,1916],{"class":1156},[1143,4682,4085],{"class":1849},[1143,4684,1243],{"class":1164},[1143,4686,1981],{"class":1475},[1143,4688,4689],{"class":1479},"Price must be positive",[1143,4691,1981],{"class":1475},[1143,4693,1409],{"class":1164},[1143,4695,4696],{"class":1145,"line":1735},[1143,4697,1946],{"class":1160},[1143,4699,4700],{"class":1145,"line":1750},[1143,4701,4702],{"class":1149},"        # Check if item already exists\n",[1143,4704,4705,4708,4710,4712,4714,4717,4719,4721],{"class":1145,"line":1767},[1143,4706,4707],{"class":1160},"        existing_item ",[1143,4709,1389],{"class":1164},[1143,4711,1392],{"class":1294},[1143,4713,1165],{"class":1164},[1143,4715,4716],{"class":1307},"_find_item",[1143,4718,1243],{"class":1164},[1143,4720,1406],{"class":1307},[1143,4722,1409],{"class":1164},[1143,4724,4725,4727,4730],{"class":1145,"line":1772},[1143,4726,1901],{"class":1156},[1143,4728,4729],{"class":1160}," existing_item",[1143,4731,1380],{"class":1164},[1143,4733,4734,4737,4739,4741,4744],{"class":1145,"line":1781},[1143,4735,4736],{"class":1160},"            existing_item",[1143,4738,1165],{"class":1164},[1143,4740,4412],{"class":1300},[1143,4742,4743],{"class":1164}," +=",[1143,4745,4746],{"class":1160}," quantity\n",[1143,4748,4749,4752],{"class":1145,"line":1791},[1143,4750,4751],{"class":1156},"        else",[1143,4753,1380],{"class":1164},[1143,4755,4756,4758,4760,4762,4764,4767,4769,4771,4773,4775,4777,4779,4781,4783],{"class":1145,"line":1796},[1143,4757,3762],{"class":1294},[1143,4759,1165],{"class":1164},[1143,4761,4491],{"class":1300},[1143,4763,1165],{"class":1164},[1143,4765,4766],{"class":1307},"append",[1143,4768,1243],{"class":1164},[1143,4770,4500],{"class":1307},[1143,4772,1243],{"class":1164},[1143,4774,1406],{"class":1307},[1143,4776,1349],{"class":1164},[1143,4778,4604],{"class":1307},[1143,4780,1349],{"class":1164},[1143,4782,4613],{"class":1307},[1143,4784,4785],{"class":1164},"))\n",[1143,4787,4788],{"class":1145,"line":1809},[1143,4789,1946],{"class":1160},[1143,4791,4792,4794,4796,4799],{"class":1145,"line":1826},[1143,4793,1295],{"class":1294},[1143,4795,1165],{"class":1164},[1143,4797,4798],{"class":1307},"_recalculate_total",[1143,4800,1311],{"class":1164},[1143,4802,4803],{"class":1145,"line":1831},[1143,4804,1270],{"class":1160},[1143,4806,4807,4809,4812,4814,4816,4818,4820,4822,4824],{"class":1145,"line":1863},[1143,4808,1276],{"class":1235},[1143,4810,4811],{"class":1341}," remove_item",[1143,4813,1243],{"class":1164},[1143,4815,1286],{"class":1285},[1143,4817,1349],{"class":1164},[1143,4819,1358],{"class":1352},[1143,4821,1485],{"class":1164},[1143,4823,1850],{"class":1849},[1143,4825,1250],{"class":1164},[1143,4827,4828,4830,4833],{"class":1145,"line":1873},[1143,4829,1366],{"class":1256},[1143,4831,4832],{"class":1260},"Remove item from order",[1143,4834,1264],{"class":1256},[1143,4836,4837,4839,4841,4843,4845,4848,4851,4854,4857,4860,4862,4864,4866,4869,4872,4874,4876,4879,4881],{"class":1145,"line":1898},[1143,4838,1295],{"class":1294},[1143,4840,1165],{"class":1164},[1143,4842,4491],{"class":1300},[1143,4844,1304],{"class":1164},[1143,4846,4847],{"class":1164}," [",[1143,4849,4850],{"class":1160},"item ",[1143,4852,4853],{"class":1156},"for",[1143,4855,4856],{"class":1160}," item ",[1143,4858,4859],{"class":1156},"in",[1143,4861,1392],{"class":1294},[1143,4863,1165],{"class":1164},[1143,4865,4491],{"class":1300},[1143,4867,4868],{"class":1156}," if",[1143,4870,4871],{"class":1160}," item",[1143,4873,1165],{"class":1164},[1143,4875,1406],{"class":1300},[1143,4877,4878],{"class":1904}," !=",[1143,4880,1358],{"class":1160},[1143,4882,4883],{"class":1164},"]\n",[1143,4885,4886,4888,4890,4892],{"class":1145,"line":1913},[1143,4887,1295],{"class":1294},[1143,4889,1165],{"class":1164},[1143,4891,4798],{"class":1307},[1143,4893,1311],{"class":1164},[1143,4895,4896],{"class":1145,"line":1943},[1143,4897,1270],{"class":1160},[1143,4899,4900,4902,4905,4907,4909],{"class":1145,"line":1949},[1143,4901,1276],{"class":1235},[1143,4903,4904],{"class":1341}," confirm",[1143,4906,1243],{"class":1164},[1143,4908,1286],{"class":1285},[1143,4910,1250],{"class":1164},[1143,4912,4913,4915,4918],{"class":1145,"line":1955},[1143,4914,1366],{"class":1256},[1143,4916,4917],{"class":1260},"Confirm order with business rules",[1143,4919,1264],{"class":1256},[1143,4921,4922,4924,4926,4928,4930,4932],{"class":1145,"line":1971},[1143,4923,1901],{"class":1156},[1143,4925,1905],{"class":1904},[1143,4927,1392],{"class":1294},[1143,4929,1165],{"class":1164},[1143,4931,4491],{"class":1300},[1143,4933,1380],{"class":1164},[1143,4935,4936,4938,4940,4942,4944,4947,4949],{"class":1145,"line":1991},[1143,4937,1916],{"class":1156},[1143,4939,4085],{"class":1849},[1143,4941,1243],{"class":1164},[1143,4943,1981],{"class":1475},[1143,4945,4946],{"class":1479},"Cannot confirm empty order",[1143,4948,1981],{"class":1475},[1143,4950,1409],{"class":1164},[1143,4952,4953],{"class":1145,"line":1996},[1143,4954,1946],{"class":1160},[1143,4956,4957,4959,4961,4963,4965,4967,4969,4971,4973],{"class":1145,"line":2005},[1143,4958,1901],{"class":1156},[1143,4960,1392],{"class":1294},[1143,4962,1165],{"class":1164},[1143,4964,4517],{"class":1300},[1143,4966,4878],{"class":1904},[1143,4968,1488],{"class":1475},[1143,4970,4524],{"class":1479},[1143,4972,1476],{"class":1475},[1143,4974,1380],{"class":1164},[1143,4976,4977,4979,4981,4983,4985,4988,4990],{"class":1145,"line":2010},[1143,4978,1916],{"class":1156},[1143,4980,4085],{"class":1849},[1143,4982,1243],{"class":1164},[1143,4984,1981],{"class":1475},[1143,4986,4987],{"class":1479},"Can only confirm draft orders",[1143,4989,1981],{"class":1475},[1143,4991,1409],{"class":1164},[1143,4993,4994],{"class":1145,"line":2024},[1143,4995,1946],{"class":1160},[1143,4997,4998,5000,5002,5004,5006,5008,5011],{"class":1145,"line":2054},[1143,4999,1295],{"class":1294},[1143,5001,1165],{"class":1164},[1143,5003,4517],{"class":1300},[1143,5005,1304],{"class":1164},[1143,5007,1488],{"class":1475},[1143,5009,5010],{"class":1479},"confirmed",[1143,5012,4527],{"class":1475},[1143,5014,5015],{"class":1145,"line":2064},[1143,5016,1270],{"class":1160},[1143,5018,5019,5021,5024,5026,5028],{"class":1145,"line":2070},[1143,5020,1276],{"class":1235},[1143,5022,5023],{"class":1341}," cancel",[1143,5025,1243],{"class":1164},[1143,5027,1286],{"class":1285},[1143,5029,1250],{"class":1164},[1143,5031,5032,5034,5037],{"class":1145,"line":2103},[1143,5033,1366],{"class":1256},[1143,5035,5036],{"class":1260},"Cancel order with business rules",[1143,5038,1264],{"class":1256},[1143,5040,5041,5043,5045,5047,5049,5051,5054,5056,5058,5060,5062,5064,5066,5068,5070],{"class":1145,"line":2122},[1143,5042,1901],{"class":1156},[1143,5044,1392],{"class":1294},[1143,5046,1165],{"class":1164},[1143,5048,4517],{"class":1300},[1143,5050,1905],{"class":1904},[1143,5052,5053],{"class":1904}," in",[1143,5055,4847],{"class":1164},[1143,5057,1476],{"class":1475},[1143,5059,4524],{"class":1479},[1143,5061,1476],{"class":1475},[1143,5063,1349],{"class":1164},[1143,5065,1488],{"class":1475},[1143,5067,5010],{"class":1479},[1143,5069,1476],{"class":1475},[1143,5071,2742],{"class":1164},[1143,5073,5074,5076,5078,5080,5082,5085,5087],{"class":1145,"line":2127},[1143,5075,1916],{"class":1156},[1143,5077,4085],{"class":1849},[1143,5079,1243],{"class":1164},[1143,5081,1981],{"class":1475},[1143,5083,5084],{"class":1479},"Cannot cancel order in current status",[1143,5086,1981],{"class":1475},[1143,5088,1409],{"class":1164},[1143,5090,5091],{"class":1145,"line":2169},[1143,5092,1946],{"class":1160},[1143,5094,5095,5097,5099,5101,5103,5105,5108],{"class":1145,"line":2186},[1143,5096,1295],{"class":1294},[1143,5098,1165],{"class":1164},[1143,5100,4517],{"class":1300},[1143,5102,1304],{"class":1164},[1143,5104,1488],{"class":1475},[1143,5106,5107],{"class":1479},"cancelled",[1143,5109,4527],{"class":1475},[1143,5111,5112],{"class":1145,"line":2204},[1143,5113,1270],{"class":1160},[1143,5115,5116,5118,5121,5123,5125,5127,5129,5131,5133,5135,5137,5139,5141,5143],{"class":1145,"line":2209},[1143,5117,1276],{"class":1235},[1143,5119,5120],{"class":1341}," _find_item",[1143,5122,1243],{"class":1164},[1143,5124,1286],{"class":1285},[1143,5126,1349],{"class":1164},[1143,5128,1358],{"class":1352},[1143,5130,1485],{"class":1164},[1143,5132,1850],{"class":1849},[1143,5134,1853],{"class":1164},[1143,5136,1856],{"class":1164},[1143,5138,2653],{"class":1160},[1143,5140,2090],{"class":1164},[1143,5142,4500],{"class":1160},[1143,5144,2742],{"class":1164},[1143,5146,5147,5149,5152],{"class":1145,"line":2215},[1143,5148,1366],{"class":1256},[1143,5150,5151],{"class":1260},"Find item by product ID",[1143,5153,1264],{"class":1256},[1143,5155,5156,5158,5161,5164,5166,5168,5170,5172,5174,5176,5178,5180,5182,5184,5186,5189,5191,5194,5196],{"class":1145,"line":2227},[1143,5157,1999],{"class":1156},[1143,5159,5160],{"class":1279}," next",[1143,5162,5163],{"class":1164},"((",[1143,5165,4850],{"class":1307},[1143,5167,4853],{"class":1156},[1143,5169,4856],{"class":1307},[1143,5171,4859],{"class":1156},[1143,5173,1392],{"class":1294},[1143,5175,1165],{"class":1164},[1143,5177,4491],{"class":1300},[1143,5179,4868],{"class":1156},[1143,5181,4871],{"class":1307},[1143,5183,1165],{"class":1164},[1143,5185,1406],{"class":1300},[1143,5187,5188],{"class":1904}," ==",[1143,5190,1358],{"class":1307},[1143,5192,5193],{"class":1164},"),",[1143,5195,3366],{"class":2500},[1143,5197,1409],{"class":1164},[1143,5199,5200],{"class":1145,"line":2248},[1143,5201,1270],{"class":1160},[1143,5203,5204,5206,5209,5211,5213],{"class":1145,"line":2269},[1143,5205,1276],{"class":1235},[1143,5207,5208],{"class":1341}," _recalculate_total",[1143,5210,1243],{"class":1164},[1143,5212,1286],{"class":1285},[1143,5214,1250],{"class":1164},[1143,5216,5217,5219,5222],{"class":1145,"line":2290},[1143,5218,1366],{"class":1256},[1143,5220,5221],{"class":1260},"Recalculate order total",[1143,5223,1264],{"class":1256},[1143,5225,5226,5228,5230,5232,5234,5237,5239,5242,5244,5246,5249,5252,5254,5256,5258,5260,5262],{"class":1145,"line":2301},[1143,5227,1295],{"class":1294},[1143,5229,1165],{"class":1164},[1143,5231,4536],{"class":1300},[1143,5233,1304],{"class":1164},[1143,5235,5236],{"class":1279}," sum",[1143,5238,1243],{"class":1164},[1143,5240,5241],{"class":1307},"item",[1143,5243,1165],{"class":1164},[1143,5245,4536],{"class":1307},[1143,5247,5248],{"class":1164},"()",[1143,5250,5251],{"class":1156}," for",[1143,5253,4856],{"class":1307},[1143,5255,4859],{"class":1156},[1143,5257,1392],{"class":1294},[1143,5259,1165],{"class":1164},[1143,5261,4491],{"class":1300},[1143,5263,1409],{"class":1164},[1143,5265,5266],{"class":1145,"line":2307},[1143,5267,1229],{"emptyLinePlaceholder":1228},[1143,5269,5270],{"class":1145,"line":2312},[1143,5271,5272],{"class":1149},"# Ports (Interfaces) - Define contracts\n",[1143,5274,5275,5277,5280,5282,5285],{"class":1145,"line":2318},[1143,5276,1236],{"class":1235},[1143,5278,5279],{"class":1239}," OrderRepository",[1143,5281,1243],{"class":1164},[1143,5283,5284],{"class":1294},"ABC",[1143,5286,1250],{"class":1164},[1143,5288,5289,5291,5294],{"class":1145,"line":2331},[1143,5290,1257],{"class":1256},[1143,5292,5293],{"class":1260},"Port for order persistence",[1143,5295,1264],{"class":1256},[1143,5297,5298],{"class":1145,"line":2343},[1143,5299,1270],{"class":1160},[1143,5301,5302,5304],{"class":1145,"line":2348},[1143,5303,2013],{"class":1164},[1143,5305,5306],{"class":1341},"abstractmethod\n",[1143,5308,5309,5311,5313,5315,5317,5319,5322,5324,5326,5328,5330,5332],{"class":1145,"line":2370},[1143,5310,1276],{"class":1235},[1143,5312,3286],{"class":1341},[1143,5314,1243],{"class":1164},[1143,5316,1286],{"class":1285},[1143,5318,1349],{"class":1164},[1143,5320,5321],{"class":1352}," order",[1143,5323,1485],{"class":1164},[1143,5325,4432],{"class":1160},[1143,5327,1853],{"class":1164},[1143,5329,1856],{"class":1164},[1143,5331,4432],{"class":1160},[1143,5333,1380],{"class":1164},[1143,5335,5336],{"class":1145,"line":2375},[1143,5337,5338],{"class":1156},"        pass\n",[1143,5340,5341],{"class":1145,"line":2413},[1143,5342,1270],{"class":1160},[1143,5344,5345,5347],{"class":1145,"line":2423},[1143,5346,2013],{"class":1164},[1143,5348,5306],{"class":1341},[1143,5350,5351,5353,5355,5357,5359,5361,5364,5366,5368,5370,5372,5374,5376,5379],{"class":1145,"line":2442},[1143,5352,1276],{"class":1235},[1143,5354,2716],{"class":1341},[1143,5356,1243],{"class":1164},[1143,5358,1286],{"class":1285},[1143,5360,1349],{"class":1164},[1143,5362,5363],{"class":1352}," order_id",[1143,5365,1485],{"class":1164},[1143,5367,1850],{"class":1849},[1143,5369,1853],{"class":1164},[1143,5371,1856],{"class":1164},[1143,5373,2653],{"class":1160},[1143,5375,2090],{"class":1164},[1143,5377,5378],{"class":1160},"Order",[1143,5380,2742],{"class":1164},[1143,5382,5383],{"class":1145,"line":2447},[1143,5384,5338],{"class":1156},[1143,5386,5387],{"class":1145,"line":2453},[1143,5388,1270],{"class":1160},[1143,5390,5391,5393],{"class":1145,"line":2487},[1143,5392,2013],{"class":1164},[1143,5394,5306],{"class":1341},[1143,5396,5397,5399,5402,5404,5406,5408,5410,5412,5414,5416,5418,5420,5422,5424],{"class":1145,"line":2504},[1143,5398,1276],{"class":1235},[1143,5400,5401],{"class":1341}," get_by_customer",[1143,5403,1243],{"class":1164},[1143,5405,1286],{"class":1285},[1143,5407,1349],{"class":1164},[1143,5409,4462],{"class":1352},[1143,5411,1485],{"class":1164},[1143,5413,1850],{"class":1849},[1143,5415,1853],{"class":1164},[1143,5417,1856],{"class":1164},[1143,5419,3030],{"class":1160},[1143,5421,2090],{"class":1164},[1143,5423,5378],{"class":1160},[1143,5425,2742],{"class":1164},[1143,5427,5428],{"class":1145,"line":2509},[1143,5429,5338],{"class":1156},[1143,5431,5432],{"class":1145,"line":2515},[1143,5433,1229],{"emptyLinePlaceholder":1228},[1143,5435,5436,5438,5441,5443,5445],{"class":1145,"line":2547},[1143,5437,1236],{"class":1235},[1143,5439,5440],{"class":1239}," PaymentService",[1143,5442,1243],{"class":1164},[1143,5444,5284],{"class":1294},[1143,5446,1250],{"class":1164},[1143,5448,5449,5451,5454],{"class":1145,"line":2565},[1143,5450,1257],{"class":1256},[1143,5452,5453],{"class":1260},"Port for payment processing",[1143,5455,1264],{"class":1256},[1143,5457,5458],{"class":1145,"line":2570},[1143,5459,1270],{"class":1160},[1143,5461,5462,5464],{"class":1145,"line":2584},[1143,5463,2013],{"class":1164},[1143,5465,5306],{"class":1341},[1143,5467,5468,5470,5473,5475,5477,5479,5481,5483,5485,5487,5490,5492,5494,5496,5498,5500],{"class":1145,"line":2606},[1143,5469,1276],{"class":1235},[1143,5471,5472],{"class":1341}," process_payment",[1143,5474,1243],{"class":1164},[1143,5476,1286],{"class":1285},[1143,5478,1349],{"class":1164},[1143,5480,5321],{"class":1352},[1143,5482,1485],{"class":1164},[1143,5484,4432],{"class":1160},[1143,5486,1349],{"class":1164},[1143,5488,5489],{"class":1352}," payment_method",[1143,5491,1485],{"class":1164},[1143,5493,2848],{"class":1849},[1143,5495,1853],{"class":1164},[1143,5497,1856],{"class":1164},[1143,5499,2954],{"class":1849},[1143,5501,1380],{"class":1164},[1143,5503,5504],{"class":1145,"line":2611},[1143,5505,5338],{"class":1156},[1143,5507,5508],{"class":1145,"line":2632},[1143,5509,1229],{"emptyLinePlaceholder":1228},[1143,5511,5512,5514,5517,5519,5521],{"class":1145,"line":2637},[1143,5513,1236],{"class":1235},[1143,5515,5516],{"class":1239}," InventoryService",[1143,5518,1243],{"class":1164},[1143,5520,5284],{"class":1294},[1143,5522,1250],{"class":1164},[1143,5524,5525,5527,5530],{"class":1145,"line":2643},[1143,5526,1257],{"class":1256},[1143,5528,5529],{"class":1260},"Port for inventory management",[1143,5531,1264],{"class":1256},[1143,5533,5534],{"class":1145,"line":2661},[1143,5535,1270],{"class":1160},[1143,5537,5538,5540],{"class":1145,"line":2682},[1143,5539,2013],{"class":1164},[1143,5541,5306],{"class":1341},[1143,5543,5544,5546,5549,5551,5553,5555,5558,5560,5562,5564,5566,5569,5571,5573],{"class":1145,"line":2687},[1143,5545,1276],{"class":1235},[1143,5547,5548],{"class":1341}," reserve_items",[1143,5550,1243],{"class":1164},[1143,5552,1286],{"class":1285},[1143,5554,1349],{"class":1164},[1143,5556,5557],{"class":1352}," items",[1143,5559,1485],{"class":1164},[1143,5561,3030],{"class":1160},[1143,5563,2090],{"class":1164},[1143,5565,4500],{"class":1160},[1143,5567,5568],{"class":1164},"])",[1143,5570,1856],{"class":1164},[1143,5572,2954],{"class":1849},[1143,5574,1380],{"class":1164},[1143,5576,5577],{"class":1145,"line":2696},[1143,5578,5338],{"class":1156},[1143,5580,5581],{"class":1145,"line":2706},[1143,5582,1270],{"class":1160},[1143,5584,5585,5587],{"class":1145,"line":2711},[1143,5586,2013],{"class":1164},[1143,5588,5306],{"class":1341},[1143,5590,5591,5593,5596,5598,5600,5602,5604,5606,5608,5610,5612,5614,5616,5618],{"class":1145,"line":2745},[1143,5592,1276],{"class":1235},[1143,5594,5595],{"class":1341}," release_items",[1143,5597,1243],{"class":1164},[1143,5599,1286],{"class":1285},[1143,5601,1349],{"class":1164},[1143,5603,5557],{"class":1352},[1143,5605,1485],{"class":1164},[1143,5607,3030],{"class":1160},[1143,5609,2090],{"class":1164},[1143,5611,4500],{"class":1160},[1143,5613,5568],{"class":1164},[1143,5615,1856],{"class":1164},[1143,5617,2954],{"class":1849},[1143,5619,1380],{"class":1164},[1143,5621,5622],{"class":1145,"line":2755},[1143,5623,5338],{"class":1156},[1143,5625,5626],{"class":1145,"line":2762},[1143,5627,1229],{"emptyLinePlaceholder":1228},[1143,5629,5630,5632,5635,5637,5639],{"class":1145,"line":2802},[1143,5631,1236],{"class":1235},[1143,5633,5634],{"class":1239}," NotificationService",[1143,5636,1243],{"class":1164},[1143,5638,5284],{"class":1294},[1143,5640,1250],{"class":1164},[1143,5642,5643,5645,5648],{"class":1145,"line":2816},[1143,5644,1257],{"class":1256},[1143,5646,5647],{"class":1260},"Port for notifications",[1143,5649,1264],{"class":1256},[1143,5651,5652],{"class":1145,"line":2824},[1143,5653,1270],{"class":1160},[1143,5655,5656,5658],{"class":1145,"line":2829},[1143,5657,2013],{"class":1164},[1143,5659,5306],{"class":1341},[1143,5661,5662,5664,5667,5669,5671,5673,5675,5677,5679,5681,5683,5685],{"class":1145,"line":2863},[1143,5663,1276],{"class":1235},[1143,5665,5666],{"class":1341}," send_order_confirmation",[1143,5668,1243],{"class":1164},[1143,5670,1286],{"class":1285},[1143,5672,1349],{"class":1164},[1143,5674,5321],{"class":1352},[1143,5676,1485],{"class":1164},[1143,5678,4432],{"class":1160},[1143,5680,1853],{"class":1164},[1143,5682,1856],{"class":1164},[1143,5684,2954],{"class":1849},[1143,5686,1380],{"class":1164},[1143,5688,5689],{"class":1145,"line":2873},[1143,5690,5338],{"class":1156},[1143,5692,5693],{"class":1145,"line":2880},[1143,5694,1229],{"emptyLinePlaceholder":1228},[1143,5696,5697],{"class":1145,"line":2905},[1143,5698,5699],{"class":1149},"# Application Service - Orchestrates use cases\n",[1143,5701,5702,5704,5707],{"class":1145,"line":2918},[1143,5703,1236],{"class":1235},[1143,5705,5706],{"class":1239}," OrderService",[1143,5708,1380],{"class":1164},[1143,5710,5711,5713,5716],{"class":1145,"line":2925},[1143,5712,1257],{"class":1256},[1143,5714,5715],{"class":1260},"Application service using dependency inversion",[1143,5717,1264],{"class":1256},[1143,5719,5720],{"class":1145,"line":2930},[1143,5721,1270],{"class":1160},[1143,5723,5724,5726,5728,5730,5732,5734],{"class":1145,"line":2959},[1143,5725,1276],{"class":1235},[1143,5727,1280],{"class":1279},[1143,5729,1243],{"class":1164},[1143,5731,1286],{"class":1285},[1143,5733,1349],{"class":1164},[1143,5735,5736],{"class":1160}," \n",[1143,5738,5739,5742,5744,5746],{"class":1145,"line":2969},[1143,5740,5741],{"class":1352},"                 order_repo",[1143,5743,1485],{"class":1164},[1143,5745,5279],{"class":1160},[1143,5747,5748],{"class":1164},",\n",[1143,5750,5751,5754,5756,5758],{"class":1145,"line":3000},[1143,5752,5753],{"class":1352},"                 payment_service",[1143,5755,1485],{"class":1164},[1143,5757,5440],{"class":1160},[1143,5759,5748],{"class":1164},[1143,5761,5762,5765,5767,5769],{"class":1145,"line":3005},[1143,5763,5764],{"class":1352},"                 inventory_service",[1143,5766,1485],{"class":1164},[1143,5768,5516],{"class":1160},[1143,5770,5748],{"class":1164},[1143,5772,5773,5776,5778,5780],{"class":1145,"line":3039},[1143,5774,5775],{"class":1352},"                 notification_service",[1143,5777,1485],{"class":1164},[1143,5779,5634],{"class":1160},[1143,5781,1250],{"class":1164},[1143,5783,5784,5786,5788,5791,5793],{"class":1145,"line":3049},[1143,5785,1295],{"class":1294},[1143,5787,1165],{"class":1164},[1143,5789,5790],{"class":1300},"order_repo",[1143,5792,1304],{"class":1164},[1143,5794,5795],{"class":1160}," order_repo\n",[1143,5797,5798,5800,5802,5805,5807],{"class":1145,"line":3059},[1143,5799,1295],{"class":1294},[1143,5801,1165],{"class":1164},[1143,5803,5804],{"class":1300},"payment_service",[1143,5806,1304],{"class":1164},[1143,5808,5809],{"class":1160}," payment_service\n",[1143,5811,5812,5814,5816,5819,5821],{"class":1145,"line":3093},[1143,5813,1295],{"class":1294},[1143,5815,1165],{"class":1164},[1143,5817,5818],{"class":1300},"inventory_service",[1143,5820,1304],{"class":1164},[1143,5822,5823],{"class":1160}," inventory_service\n",[1143,5825,5826,5828,5830,5833,5835],{"class":1145,"line":3111},[1143,5827,1295],{"class":1294},[1143,5829,1165],{"class":1164},[1143,5831,5832],{"class":1300},"notification_service",[1143,5834,1304],{"class":1164},[1143,5836,5837],{"class":1160}," notification_service\n",[1143,5839,5840],{"class":1145,"line":3129},[1143,5841,1270],{"class":1160},[1143,5843,5844,5846,5849,5851,5853,5855,5857,5859,5861,5863,5865,5867,5869,5871,5874,5876,5878,5880],{"class":1145,"line":3134},[1143,5845,1276],{"class":1235},[1143,5847,5848],{"class":1341}," create_order",[1143,5850,1243],{"class":1164},[1143,5852,1286],{"class":1285},[1143,5854,1349],{"class":1164},[1143,5856,4462],{"class":1352},[1143,5858,1485],{"class":1164},[1143,5860,1850],{"class":1849},[1143,5862,1349],{"class":1164},[1143,5864,5557],{"class":1352},[1143,5866,1485],{"class":1164},[1143,5868,3030],{"class":1160},[1143,5870,2090],{"class":1164},[1143,5872,5873],{"class":1849},"dict",[1143,5875,5568],{"class":1164},[1143,5877,1856],{"class":1164},[1143,5879,4432],{"class":1160},[1143,5881,1380],{"class":1164},[1143,5883,5884,5886,5889],{"class":1145,"line":3139},[1143,5885,1366],{"class":1256},[1143,5887,5888],{"class":1260},"Create new order use case",[1143,5890,1264],{"class":1256},[1143,5892,5893,5896,5898,5900,5902,5904],{"class":1145,"line":3172},[1143,5894,5895],{"class":1160},"        order ",[1143,5897,1389],{"class":1164},[1143,5899,4432],{"class":1307},[1143,5901,1243],{"class":1164},[1143,5903,4477],{"class":1307},[1143,5905,1409],{"class":1164},[1143,5907,5908],{"class":1145,"line":3182},[1143,5909,1946],{"class":1160},[1143,5911,5912],{"class":1145,"line":3191},[1143,5913,5914],{"class":1149},"        # Add items to order\n",[1143,5916,5917,5920,5923,5925,5927],{"class":1145,"line":3206},[1143,5918,5919],{"class":1156},"        for",[1143,5921,5922],{"class":1160}," item_data ",[1143,5924,4859],{"class":1156},[1143,5926,5557],{"class":1160},[1143,5928,1380],{"class":1164},[1143,5930,5931,5934,5936,5939],{"class":1145,"line":3242},[1143,5932,5933],{"class":1160},"            order",[1143,5935,1165],{"class":1164},[1143,5937,5938],{"class":1307},"add_item",[1143,5940,2224],{"class":1164},[1143,5942,5943,5946,5948,5951,5953,5955,5957,5959],{"class":1145,"line":3253},[1143,5944,5945],{"class":1499},"                product_id",[1143,5947,1389],{"class":1164},[1143,5949,5950],{"class":1307},"item_data",[1143,5952,2090],{"class":1164},[1143,5954,1476],{"class":1475},[1143,5956,1406],{"class":1479},[1143,5958,1476],{"class":1475},[1143,5960,2245],{"class":1164},[1143,5962,5963,5966,5968,5970,5972,5974,5976,5978],{"class":1145,"line":3271},[1143,5964,5965],{"class":1499},"                quantity",[1143,5967,1389],{"class":1164},[1143,5969,5950],{"class":1307},[1143,5971,2090],{"class":1164},[1143,5973,1476],{"class":1475},[1143,5975,4412],{"class":1479},[1143,5977,1476],{"class":1475},[1143,5979,2245],{"class":1164},[1143,5981,5982,5985,5987,5989,5991,5993,5995,5997],{"class":1145,"line":3276},[1143,5983,5984],{"class":1499},"                price",[1143,5986,1389],{"class":1164},[1143,5988,5950],{"class":1307},[1143,5990,2090],{"class":1164},[1143,5992,1476],{"class":1475},[1143,5994,2283],{"class":1479},[1143,5996,1476],{"class":1475},[1143,5998,4883],{"class":1164},[1143,6000,6001],{"class":1145,"line":3281},[1143,6002,6003],{"class":1164},"            )\n",[1143,6005,6006],{"class":1145,"line":3309},[1143,6007,1946],{"class":1160},[1143,6009,6010],{"class":1145,"line":3319},[1143,6011,6012],{"class":1149},"        # Save order\n",[1143,6014,6015,6017,6019,6021,6023,6025,6027,6029,6032],{"class":1145,"line":3330},[1143,6016,1999],{"class":1156},[1143,6018,1392],{"class":1294},[1143,6020,1165],{"class":1164},[1143,6022,5790],{"class":1300},[1143,6024,1165],{"class":1164},[1143,6026,2361],{"class":1307},[1143,6028,1243],{"class":1164},[1143,6030,6031],{"class":1307},"order",[1143,6033,1409],{"class":1164},[1143,6035,6036],{"class":1145,"line":3337},[1143,6037,1270],{"class":1160},[1143,6039,6040,6042,6045,6047,6049,6051,6053,6055,6057,6059,6061,6063,6065,6067,6069,6071],{"class":1145,"line":3342},[1143,6041,1276],{"class":1235},[1143,6043,6044],{"class":1341}," place_order",[1143,6046,1243],{"class":1164},[1143,6048,1286],{"class":1285},[1143,6050,1349],{"class":1164},[1143,6052,5363],{"class":1352},[1143,6054,1485],{"class":1164},[1143,6056,1850],{"class":1849},[1143,6058,1349],{"class":1164},[1143,6060,5489],{"class":1352},[1143,6062,1485],{"class":1164},[1143,6064,2848],{"class":1849},[1143,6066,1853],{"class":1164},[1143,6068,1856],{"class":1164},[1143,6070,2954],{"class":1849},[1143,6072,1380],{"class":1164},[1143,6074,6075,6077,6080],{"class":1145,"line":3371},[1143,6076,1366],{"class":1256},[1143,6078,6079],{"class":1260},"Place order use case",[1143,6081,1264],{"class":1256},[1143,6083,6084,6086,6088,6090,6092,6094,6096,6098,6100,6103],{"class":1145,"line":3381},[1143,6085,5895],{"class":1160},[1143,6087,1389],{"class":1164},[1143,6089,1392],{"class":1294},[1143,6091,1165],{"class":1164},[1143,6093,5790],{"class":1300},[1143,6095,1165],{"class":1164},[1143,6097,1889],{"class":1307},[1143,6099,1243],{"class":1164},[1143,6101,6102],{"class":1307},"order_id",[1143,6104,1409],{"class":1164},[1143,6106,6107,6109,6111,6113],{"class":1145,"line":3393},[1143,6108,1901],{"class":1156},[1143,6110,1905],{"class":1904},[1143,6112,5321],{"class":1160},[1143,6114,1380],{"class":1164},[1143,6116,6117,6119,6121,6123,6125,6128,6130],{"class":1145,"line":3398},[1143,6118,1916],{"class":1156},[1143,6120,4085],{"class":1849},[1143,6122,1243],{"class":1164},[1143,6124,1981],{"class":1475},[1143,6126,6127],{"class":1479},"Order not found",[1143,6129,1981],{"class":1475},[1143,6131,1409],{"class":1164},[1143,6133,6134],{"class":1145,"line":3404},[1143,6135,1946],{"class":1160},[1143,6137,6138],{"class":1145,"line":3420},[1143,6139,6140],{"class":1149},"        # Reserve inventory\n",[1143,6142,6143,6145,6147,6149,6151,6153,6155,6158,6160,6162,6164,6166],{"class":1145,"line":3433},[1143,6144,1901],{"class":1156},[1143,6146,1905],{"class":1904},[1143,6148,1392],{"class":1294},[1143,6150,1165],{"class":1164},[1143,6152,5818],{"class":1300},[1143,6154,1165],{"class":1164},[1143,6156,6157],{"class":1307},"reserve_items",[1143,6159,1243],{"class":1164},[1143,6161,6031],{"class":1307},[1143,6163,1165],{"class":1164},[1143,6165,4491],{"class":1300},[1143,6167,1250],{"class":1164},[1143,6169,6170,6172,6174,6176,6178,6181,6183],{"class":1145,"line":3438},[1143,6171,1916],{"class":1156},[1143,6173,4085],{"class":1849},[1143,6175,1243],{"class":1164},[1143,6177,1981],{"class":1475},[1143,6179,6180],{"class":1479},"Insufficient inventory",[1143,6182,1981],{"class":1475},[1143,6184,1409],{"class":1164},[1143,6186,6187],{"class":1145,"line":3457},[1143,6188,1946],{"class":1160},[1143,6190,6191,6193],{"class":1145,"line":3467},[1143,6192,1377],{"class":1156},[1143,6194,1380],{"class":1164},[1143,6196,6197],{"class":1145,"line":3472},[1143,6198,6199],{"class":1149},"            # Process payment\n",[1143,6201,6202,6205,6207,6209,6211,6213,6215,6218,6220,6222,6224,6226],{"class":1145,"line":3509},[1143,6203,6204],{"class":1156},"            if",[1143,6206,1905],{"class":1904},[1143,6208,1392],{"class":1294},[1143,6210,1165],{"class":1164},[1143,6212,5804],{"class":1300},[1143,6214,1165],{"class":1164},[1143,6216,6217],{"class":1307},"process_payment",[1143,6219,1243],{"class":1164},[1143,6221,6031],{"class":1307},[1143,6223,1349],{"class":1164},[1143,6225,5489],{"class":1307},[1143,6227,1250],{"class":1164},[1143,6229,6230],{"class":1145,"line":3526},[1143,6231,6232],{"class":1149},"                # Release inventory if payment fails\n",[1143,6234,6235,6238,6240,6242,6244,6247,6249,6251,6253,6255],{"class":1145,"line":3563},[1143,6236,6237],{"class":1294},"                self",[1143,6239,1165],{"class":1164},[1143,6241,5818],{"class":1300},[1143,6243,1165],{"class":1164},[1143,6245,6246],{"class":1307},"release_items",[1143,6248,1243],{"class":1164},[1143,6250,6031],{"class":1307},[1143,6252,1165],{"class":1164},[1143,6254,4491],{"class":1300},[1143,6256,1409],{"class":1164},[1143,6258,6259,6262,6264,6266,6268,6271,6273],{"class":1145,"line":3604},[1143,6260,6261],{"class":1156},"                raise",[1143,6263,4085],{"class":1849},[1143,6265,1243],{"class":1164},[1143,6267,1981],{"class":1475},[1143,6269,6270],{"class":1479},"Payment processing failed",[1143,6272,1981],{"class":1475},[1143,6274,1409],{"class":1164},[1143,6276,6277],{"class":1145,"line":3630},[1143,6278,6279],{"class":1160},"            \n",[1143,6281,6282],{"class":1145,"line":3655},[1143,6283,6284],{"class":1149},"            # Confirm order\n",[1143,6286,6287,6289,6291,6294],{"class":1145,"line":3681},[1143,6288,5933],{"class":1160},[1143,6290,1165],{"class":1164},[1143,6292,6293],{"class":1307},"confirm",[1143,6295,1311],{"class":1164},[1143,6297,6298,6300,6302,6304,6306,6308,6310,6312],{"class":1145,"line":3706},[1143,6299,3762],{"class":1294},[1143,6301,1165],{"class":1164},[1143,6303,5790],{"class":1300},[1143,6305,1165],{"class":1164},[1143,6307,2361],{"class":1307},[1143,6309,1243],{"class":1164},[1143,6311,6031],{"class":1307},[1143,6313,1409],{"class":1164},[1143,6315,6316],{"class":1145,"line":3711},[1143,6317,6279],{"class":1160},[1143,6319,6320],{"class":1145,"line":3725},[1143,6321,6322],{"class":1149},"            # Send confirmation\n",[1143,6324,6325,6327,6329,6331,6333,6336,6338,6340],{"class":1145,"line":3735},[1143,6326,3762],{"class":1294},[1143,6328,1165],{"class":1164},[1143,6330,5832],{"class":1300},[1143,6332,1165],{"class":1164},[1143,6334,6335],{"class":1307},"send_order_confirmation",[1143,6337,1243],{"class":1164},[1143,6339,6031],{"class":1307},[1143,6341,1409],{"class":1164},[1143,6343,6344],{"class":1145,"line":3741},[1143,6345,6279],{"class":1160},[1143,6347,6348,6350],{"class":1145,"line":3759},[1143,6349,1441],{"class":1156},[1143,6351,2501],{"class":2500},[1143,6353,6354],{"class":1145,"line":3788},[1143,6355,6279],{"class":1160},[1143,6357,6358,6360,6363],{"class":1145,"line":3793},[1143,6359,1457],{"class":1156},[1143,6361,6362],{"class":1849}," Exception",[1143,6364,1380],{"class":1164},[1143,6366,6367],{"class":1145,"line":3799},[1143,6368,6369],{"class":1149},"            # Release inventory on any failure\n",[1143,6371,6372,6374,6376,6378,6380,6382,6384,6386,6388,6390],{"class":1145,"line":3817},[1143,6373,3762],{"class":1294},[1143,6375,1165],{"class":1164},[1143,6377,5818],{"class":1300},[1143,6379,1165],{"class":1164},[1143,6381,6246],{"class":1307},[1143,6383,1243],{"class":1164},[1143,6385,6031],{"class":1307},[1143,6387,1165],{"class":1164},[1143,6389,4491],{"class":1300},[1143,6391,1409],{"class":1164},[1143,6393,6394],{"class":1145,"line":3859},[1143,6395,6396],{"class":1156},"            raise\n",[1143,6398,6399],{"class":1145,"line":3864},[1143,6400,1229],{"emptyLinePlaceholder":1228},[1143,6402,6403],{"class":1145,"line":3878},[1143,6404,6405],{"class":1149},"# Adapters - Implement the ports\n",[1143,6407,6408,6410,6412,6414,6416,6418,6420,6422],{"class":1145,"line":3888},[1143,6409,1157],{"class":1156},[1143,6411,1161],{"class":1160},[1143,6413,1165],{"class":1164},[1143,6415,1759],{"class":1160},[1143,6417,1171],{"class":1156},[1143,6419,3480],{"class":1160},[1143,6421,1349],{"class":1164},[1143,6423,1764],{"class":1160},[1143,6425,6426],{"class":1145,"line":3894},[1143,6427,1229],{"emptyLinePlaceholder":1228},[1143,6429,6430,6432,6435,6437,6440],{"class":1145,"line":3908},[1143,6431,1236],{"class":1235},[1143,6433,6434],{"class":1239}," DjangoOrderRepository",[1143,6436,1243],{"class":1164},[1143,6438,6439],{"class":1246},"OrderRepository",[1143,6441,1250],{"class":1164},[1143,6443,6444,6446,6449],{"class":1145,"line":3913},[1143,6445,1257],{"class":1256},[1143,6447,6448],{"class":1260},"Django ORM adapter for order repository",[1143,6450,1264],{"class":1256},[1143,6452,6453],{"class":1145,"line":3919},[1143,6454,1270],{"class":1160},[1143,6456,6457,6459,6461,6463,6465,6467,6469,6471,6473,6475,6477,6479],{"class":1145,"line":3936},[1143,6458,1276],{"class":1235},[1143,6460,3286],{"class":1341},[1143,6462,1243],{"class":1164},[1143,6464,1286],{"class":1285},[1143,6466,1349],{"class":1164},[1143,6468,5321],{"class":1352},[1143,6470,1485],{"class":1164},[1143,6472,4432],{"class":1160},[1143,6474,1853],{"class":1164},[1143,6476,1856],{"class":1164},[1143,6478,4432],{"class":1160},[1143,6480,1380],{"class":1164},[1143,6482,6483,6485,6488],{"class":1145,"line":3949},[1143,6484,1366],{"class":1256},[1143,6486,6487],{"class":1260},"Save order using Django ORM",[1143,6489,1264],{"class":1256},[1143,6491,6492,6495,6498,6500,6503],{"class":1145,"line":3954},[1143,6493,6494],{"class":1156},"        with",[1143,6496,6497],{"class":1160}," transaction",[1143,6499,1165],{"class":1164},[1143,6501,6502],{"class":1307},"atomic",[1143,6504,6505],{"class":1164},"():\n",[1143,6507,6508,6510,6512,6514,6516],{"class":1145,"line":3974},[1143,6509,6204],{"class":1156},[1143,6511,5321],{"class":1160},[1143,6513,1165],{"class":1164},[1143,6515,2150],{"class":1300},[1143,6517,1380],{"class":1164},[1143,6519,6520],{"class":1145,"line":3984},[1143,6521,6522],{"class":1149},"                # Update existing order\n",[1143,6524,6525,6528,6530,6533,6535,6537,6539,6541,6543,6545,6547,6549,6551,6553],{"class":1145,"line":3990},[1143,6526,6527],{"class":1160},"                django_order ",[1143,6529,1389],{"class":1164},[1143,6531,6532],{"class":1160}," OrderModel",[1143,6534,1165],{"class":1164},[1143,6536,2140],{"class":1300},[1143,6538,1165],{"class":1164},[1143,6540,2145],{"class":1307},[1143,6542,1243],{"class":1164},[1143,6544,2150],{"class":1499},[1143,6546,1389],{"class":1164},[1143,6548,6031],{"class":1307},[1143,6550,1165],{"class":1164},[1143,6552,2150],{"class":1300},[1143,6554,1409],{"class":1164},[1143,6556,6557,6560,6562,6564,6566,6568,6570],{"class":1145,"line":4010},[1143,6558,6559],{"class":1160},"                django_order",[1143,6561,1165],{"class":1164},[1143,6563,4517],{"class":1300},[1143,6565,1304],{"class":1164},[1143,6567,5321],{"class":1160},[1143,6569,1165],{"class":1164},[1143,6571,6572],{"class":1300},"status\n",[1143,6574,6575,6577,6579,6581,6583,6585,6587],{"class":1145,"line":4015},[1143,6576,6559],{"class":1160},[1143,6578,1165],{"class":1164},[1143,6580,4536],{"class":1300},[1143,6582,1304],{"class":1164},[1143,6584,5321],{"class":1160},[1143,6586,1165],{"class":1164},[1143,6588,6589],{"class":1300},"total\n",[1143,6591,6592,6594,6596,6598],{"class":1145,"line":4044},[1143,6593,6559],{"class":1160},[1143,6595,1165],{"class":1164},[1143,6597,2361],{"class":1307},[1143,6599,1311],{"class":1164},[1143,6601,6602],{"class":1145,"line":4054},[1143,6603,6604],{"class":1160},"                \n",[1143,6606,6607],{"class":1145,"line":4080},[1143,6608,6609],{"class":1149},"                # Update items\n",[1143,6611,6612,6614,6616,6618,6620,6623,6626,6628],{"class":1145,"line":4105},[1143,6613,6559],{"class":1160},[1143,6615,1165],{"class":1164},[1143,6617,4491],{"class":1300},[1143,6619,1165],{"class":1164},[1143,6621,6622],{"class":1307},"all",[1143,6624,6625],{"class":1164},"().",[1143,6627,3388],{"class":1307},[1143,6629,1311],{"class":1164},[1143,6631,6632,6635],{"class":1145,"line":4110},[1143,6633,6634],{"class":1156},"            else",[1143,6636,1380],{"class":1164},[1143,6638,6639],{"class":1145,"line":4139},[1143,6640,6641],{"class":1149},"                # Create new order\n",[1143,6643,6644,6646,6648,6650,6652,6654,6656,6659],{"class":1145,"line":4156},[1143,6645,6527],{"class":1160},[1143,6647,1389],{"class":1164},[1143,6649,6532],{"class":1160},[1143,6651,1165],{"class":1164},[1143,6653,2140],{"class":1300},[1143,6655,1165],{"class":1164},[1143,6657,6658],{"class":1307},"create",[1143,6660,2224],{"class":1164},[1143,6662,6663,6666,6668,6670,6672,6674],{"class":1145,"line":4161},[1143,6664,6665],{"class":1499},"                    customer_id",[1143,6667,1389],{"class":1164},[1143,6669,6031],{"class":1307},[1143,6671,1165],{"class":1164},[1143,6673,4477],{"class":1300},[1143,6675,5748],{"class":1164},[1143,6677,6678,6681,6683,6685,6687,6689],{"class":1145,"line":4172},[1143,6679,6680],{"class":1499},"                    status",[1143,6682,1389],{"class":1164},[1143,6684,6031],{"class":1307},[1143,6686,1165],{"class":1164},[1143,6688,4517],{"class":1300},[1143,6690,5748],{"class":1164},[1143,6692,6693,6696,6698,6700,6702],{"class":1145,"line":4183},[1143,6694,6695],{"class":1499},"                    total",[1143,6697,1389],{"class":1164},[1143,6699,6031],{"class":1307},[1143,6701,1165],{"class":1164},[1143,6703,6589],{"class":1300},[1143,6705,6706],{"class":1145,"line":4219},[1143,6707,6708],{"class":1164},"                )\n",[1143,6710,6711,6714,6716,6718,6720,6723,6725],{"class":1145,"line":4242},[1143,6712,6713],{"class":1160},"                order",[1143,6715,1165],{"class":1164},[1143,6717,2150],{"class":1300},[1143,6719,1304],{"class":1164},[1143,6721,6722],{"class":1160}," django_order",[1143,6724,1165],{"class":1164},[1143,6726,6727],{"class":1300},"id\n",[1143,6729,6731,6733,6735,6737,6739,6741,6743],{"class":1145,"line":6730},202,[1143,6732,6713],{"class":1160},[1143,6734,1165],{"class":1164},[1143,6736,4560],{"class":1300},[1143,6738,1304],{"class":1164},[1143,6740,6722],{"class":1160},[1143,6742,1165],{"class":1164},[1143,6744,6745],{"class":1300},"created_at\n",[1143,6747,6749],{"class":1145,"line":6748},203,[1143,6750,6279],{"class":1160},[1143,6752,6754],{"class":1145,"line":6753},204,[1143,6755,6756],{"class":1149},"            # Save items\n",[1143,6758,6760,6763,6765,6767,6769,6771,6773],{"class":1145,"line":6759},205,[1143,6761,6762],{"class":1156},"            for",[1143,6764,4856],{"class":1160},[1143,6766,4859],{"class":1156},[1143,6768,5321],{"class":1160},[1143,6770,1165],{"class":1164},[1143,6772,4491],{"class":1300},[1143,6774,1380],{"class":1164},[1143,6776,6778,6781,6783,6785,6787,6789],{"class":1145,"line":6777},206,[1143,6779,6780],{"class":1160},"                OrderItemModel",[1143,6782,1165],{"class":1164},[1143,6784,2140],{"class":1300},[1143,6786,1165],{"class":1164},[1143,6788,6658],{"class":1307},[1143,6790,2224],{"class":1164},[1143,6792,6794,6797,6799,6802],{"class":1145,"line":6793},207,[1143,6795,6796],{"class":1499},"                    order",[1143,6798,1389],{"class":1164},[1143,6800,6801],{"class":1307},"django_order",[1143,6803,5748],{"class":1164},[1143,6805,6807,6810,6812,6814,6816,6818],{"class":1145,"line":6806},208,[1143,6808,6809],{"class":1499},"                    product_id",[1143,6811,1389],{"class":1164},[1143,6813,5241],{"class":1307},[1143,6815,1165],{"class":1164},[1143,6817,1406],{"class":1300},[1143,6819,5748],{"class":1164},[1143,6821,6823,6826,6828,6830,6832,6834],{"class":1145,"line":6822},209,[1143,6824,6825],{"class":1499},"                    quantity",[1143,6827,1389],{"class":1164},[1143,6829,5241],{"class":1307},[1143,6831,1165],{"class":1164},[1143,6833,4412],{"class":1300},[1143,6835,5748],{"class":1164},[1143,6837,6839,6842,6844,6846,6848],{"class":1145,"line":6838},210,[1143,6840,6841],{"class":1499},"                    price",[1143,6843,1389],{"class":1164},[1143,6845,5241],{"class":1307},[1143,6847,1165],{"class":1164},[1143,6849,4421],{"class":1300},[1143,6851,6853],{"class":1145,"line":6852},211,[1143,6854,6708],{"class":1164},[1143,6856,6858],{"class":1145,"line":6857},212,[1143,6859,1946],{"class":1160},[1143,6861,6863,6865],{"class":1145,"line":6862},213,[1143,6864,1999],{"class":1156},[1143,6866,6867],{"class":1160}," order\n",[1143,6869,6871],{"class":1145,"line":6870},214,[1143,6872,1270],{"class":1160},[1143,6874,6876,6878,6880,6882,6884,6886,6888,6890,6892,6894,6896,6898,6900,6902],{"class":1145,"line":6875},215,[1143,6877,1276],{"class":1235},[1143,6879,2716],{"class":1341},[1143,6881,1243],{"class":1164},[1143,6883,1286],{"class":1285},[1143,6885,1349],{"class":1164},[1143,6887,5363],{"class":1352},[1143,6889,1485],{"class":1164},[1143,6891,1850],{"class":1849},[1143,6893,1853],{"class":1164},[1143,6895,1856],{"class":1164},[1143,6897,2653],{"class":1160},[1143,6899,2090],{"class":1164},[1143,6901,5378],{"class":1160},[1143,6903,2742],{"class":1164},[1143,6905,6907,6909,6912],{"class":1145,"line":6906},216,[1143,6908,1366],{"class":1256},[1143,6910,6911],{"class":1260},"Get order by ID",[1143,6913,1264],{"class":1256},[1143,6915,6917,6919],{"class":1145,"line":6916},217,[1143,6918,1377],{"class":1156},[1143,6920,1380],{"class":1164},[1143,6922,6924,6927,6929,6931,6933,6935,6937,6940,6942,6944,6946,6948,6950,6952,6954,6956,6958,6960],{"class":1145,"line":6923},218,[1143,6925,6926],{"class":1160},"            django_order ",[1143,6928,1389],{"class":1164},[1143,6930,6532],{"class":1160},[1143,6932,1165],{"class":1164},[1143,6934,2140],{"class":1300},[1143,6936,1165],{"class":1164},[1143,6938,6939],{"class":1307},"prefetch_related",[1143,6941,1243],{"class":1164},[1143,6943,1476],{"class":1475},[1143,6945,4491],{"class":1479},[1143,6947,1476],{"class":1475},[1143,6949,2787],{"class":1164},[1143,6951,2145],{"class":1307},[1143,6953,1243],{"class":1164},[1143,6955,2150],{"class":1499},[1143,6957,1389],{"class":1164},[1143,6959,6102],{"class":1307},[1143,6961,1409],{"class":1164},[1143,6963,6965,6967,6969,6971,6974,6976,6978],{"class":1145,"line":6964},219,[1143,6966,1441],{"class":1156},[1143,6968,1392],{"class":1294},[1143,6970,1165],{"class":1164},[1143,6972,6973],{"class":1307},"_to_domain_object",[1143,6975,1243],{"class":1164},[1143,6977,6801],{"class":1307},[1143,6979,1409],{"class":1164},[1143,6981,6983,6985,6987,6989,6991],{"class":1145,"line":6982},220,[1143,6984,1457],{"class":1156},[1143,6986,6532],{"class":1160},[1143,6988,1165],{"class":1164},[1143,6990,2811],{"class":1300},[1143,6992,1380],{"class":1164},[1143,6994,6996,6998],{"class":1145,"line":6995},221,[1143,6997,1441],{"class":1156},[1143,6999,2821],{"class":2500},[1143,7001,7003],{"class":1145,"line":7002},222,[1143,7004,1270],{"class":1160},[1143,7006,7008,7010,7012,7014,7016,7018,7020,7022,7024,7026,7028,7030,7032,7034],{"class":1145,"line":7007},223,[1143,7009,1276],{"class":1235},[1143,7011,5401],{"class":1341},[1143,7013,1243],{"class":1164},[1143,7015,1286],{"class":1285},[1143,7017,1349],{"class":1164},[1143,7019,4462],{"class":1352},[1143,7021,1485],{"class":1164},[1143,7023,1850],{"class":1849},[1143,7025,1853],{"class":1164},[1143,7027,1856],{"class":1164},[1143,7029,3030],{"class":1160},[1143,7031,2090],{"class":1164},[1143,7033,5378],{"class":1160},[1143,7035,2742],{"class":1164},[1143,7037,7039,7041,7044],{"class":1145,"line":7038},224,[1143,7040,1366],{"class":1256},[1143,7042,7043],{"class":1260},"Get orders by customer",[1143,7045,1264],{"class":1256},[1143,7047,7049,7052,7054,7056,7058,7060,7062,7064],{"class":1145,"line":7048},225,[1143,7050,7051],{"class":1160},"        django_orders ",[1143,7053,1389],{"class":1164},[1143,7055,6532],{"class":1160},[1143,7057,1165],{"class":1164},[1143,7059,2140],{"class":1300},[1143,7061,1165],{"class":1164},[1143,7063,2982],{"class":1307},[1143,7065,2224],{"class":1164},[1143,7067,7069,7072,7074],{"class":1145,"line":7068},226,[1143,7070,7071],{"class":1499},"            customer_id",[1143,7073,1389],{"class":1164},[1143,7075,7076],{"class":1307},"customer_id\n",[1143,7078,7080,7083,7085,7087,7089,7091,7093,7095,7097,7099,7101,7104,7106],{"class":1145,"line":7079},227,[1143,7081,7082],{"class":1164},"        ).",[1143,7084,6939],{"class":1307},[1143,7086,1243],{"class":1164},[1143,7088,1476],{"class":1475},[1143,7090,4491],{"class":1479},[1143,7092,1476],{"class":1475},[1143,7094,2787],{"class":1164},[1143,7096,3116],{"class":1307},[1143,7098,1243],{"class":1164},[1143,7100,1476],{"class":1475},[1143,7102,7103],{"class":1479},"-created_at",[1143,7105,1476],{"class":1475},[1143,7107,1409],{"class":1164},[1143,7109,7111],{"class":1145,"line":7110},228,[1143,7112,1946],{"class":1160},[1143,7114,7116,7118,7120,7122,7124,7126,7128,7130,7132,7134,7137,7139,7142],{"class":1145,"line":7115},229,[1143,7117,1999],{"class":1156},[1143,7119,4847],{"class":1164},[1143,7121,1286],{"class":1294},[1143,7123,1165],{"class":1164},[1143,7125,6973],{"class":1307},[1143,7127,1243],{"class":1164},[1143,7129,6801],{"class":1307},[1143,7131,1853],{"class":1164},[1143,7133,5251],{"class":1156},[1143,7135,7136],{"class":1160}," django_order ",[1143,7138,4859],{"class":1156},[1143,7140,7141],{"class":1160}," django_orders",[1143,7143,4883],{"class":1164},[1143,7145,7147],{"class":1145,"line":7146},230,[1143,7148,1270],{"class":1160},[1143,7150,7152,7154,7157,7159,7161,7163,7165,7167,7169,7171],{"class":1145,"line":7151},231,[1143,7153,1276],{"class":1235},[1143,7155,7156],{"class":1341}," _to_domain_object",[1143,7158,1243],{"class":1164},[1143,7160,1286],{"class":1285},[1143,7162,1349],{"class":1164},[1143,7164,6722],{"class":1352},[1143,7166,1853],{"class":1164},[1143,7168,1856],{"class":1164},[1143,7170,4432],{"class":1160},[1143,7172,1380],{"class":1164},[1143,7174,7176,7178,7181],{"class":1145,"line":7175},232,[1143,7177,1366],{"class":1256},[1143,7179,7180],{"class":1260},"Convert Django model to domain object",[1143,7182,1264],{"class":1256},[1143,7184,7186,7188,7190,7192,7194,7196,7198,7200],{"class":1145,"line":7185},233,[1143,7187,5895],{"class":1160},[1143,7189,1389],{"class":1164},[1143,7191,4432],{"class":1307},[1143,7193,1243],{"class":1164},[1143,7195,6801],{"class":1307},[1143,7197,1165],{"class":1164},[1143,7199,4477],{"class":1300},[1143,7201,1409],{"class":1164},[1143,7203,7205,7208,7210,7212,7214,7216,7218],{"class":1145,"line":7204},234,[1143,7206,7207],{"class":1160},"        order",[1143,7209,1165],{"class":1164},[1143,7211,2150],{"class":1300},[1143,7213,1304],{"class":1164},[1143,7215,6722],{"class":1160},[1143,7217,1165],{"class":1164},[1143,7219,6727],{"class":1300},[1143,7221,7223,7225,7227,7229,7231,7233,7235],{"class":1145,"line":7222},235,[1143,7224,7207],{"class":1160},[1143,7226,1165],{"class":1164},[1143,7228,4517],{"class":1300},[1143,7230,1304],{"class":1164},[1143,7232,6722],{"class":1160},[1143,7234,1165],{"class":1164},[1143,7236,6572],{"class":1300},[1143,7238,7240,7242,7244,7246,7248,7250,7252],{"class":1145,"line":7239},236,[1143,7241,7207],{"class":1160},[1143,7243,1165],{"class":1164},[1143,7245,4536],{"class":1300},[1143,7247,1304],{"class":1164},[1143,7249,6722],{"class":1160},[1143,7251,1165],{"class":1164},[1143,7253,6589],{"class":1300},[1143,7255,7257,7259,7261,7263,7265,7267,7269],{"class":1145,"line":7256},237,[1143,7258,7207],{"class":1160},[1143,7260,1165],{"class":1164},[1143,7262,4560],{"class":1300},[1143,7264,1304],{"class":1164},[1143,7266,6722],{"class":1160},[1143,7268,1165],{"class":1164},[1143,7270,6745],{"class":1300},[1143,7272,7274],{"class":1145,"line":7273},238,[1143,7275,1946],{"class":1160},[1143,7277,7279],{"class":1145,"line":7278},239,[1143,7280,7281],{"class":1149},"        # Add items\n",[1143,7283,7285,7287,7290,7292,7294,7296,7298,7300,7302],{"class":1145,"line":7284},240,[1143,7286,5919],{"class":1156},[1143,7288,7289],{"class":1160}," django_item ",[1143,7291,4859],{"class":1156},[1143,7293,6722],{"class":1160},[1143,7295,1165],{"class":1164},[1143,7297,4491],{"class":1300},[1143,7299,1165],{"class":1164},[1143,7301,6622],{"class":1307},[1143,7303,6505],{"class":1164},[1143,7305,7307,7309,7311,7313,7315,7317,7319,7321],{"class":1145,"line":7306},241,[1143,7308,5933],{"class":1160},[1143,7310,1165],{"class":1164},[1143,7312,4491],{"class":1300},[1143,7314,1165],{"class":1164},[1143,7316,4766],{"class":1307},[1143,7318,1243],{"class":1164},[1143,7320,4500],{"class":1307},[1143,7322,2224],{"class":1164},[1143,7324,7326,7328,7330,7333,7335,7337],{"class":1145,"line":7325},242,[1143,7327,5945],{"class":1499},[1143,7329,1389],{"class":1164},[1143,7331,7332],{"class":1307},"django_item",[1143,7334,1165],{"class":1164},[1143,7336,1406],{"class":1300},[1143,7338,5748],{"class":1164},[1143,7340,7342,7344,7346,7348,7350,7352],{"class":1145,"line":7341},243,[1143,7343,5965],{"class":1499},[1143,7345,1389],{"class":1164},[1143,7347,7332],{"class":1307},[1143,7349,1165],{"class":1164},[1143,7351,4412],{"class":1300},[1143,7353,5748],{"class":1164},[1143,7355,7357,7359,7361,7363,7365],{"class":1145,"line":7356},244,[1143,7358,5984],{"class":1499},[1143,7360,1389],{"class":1164},[1143,7362,7332],{"class":1307},[1143,7364,1165],{"class":1164},[1143,7366,4421],{"class":1300},[1143,7368,7370],{"class":1145,"line":7369},245,[1143,7371,7372],{"class":1164},"            ))\n",[1143,7374,7376],{"class":1145,"line":7375},246,[1143,7377,1946],{"class":1160},[1143,7379,7381,7383],{"class":1145,"line":7380},247,[1143,7382,1999],{"class":1156},[1143,7384,6867],{"class":1160},[1143,7386,7388],{"class":1145,"line":7387},248,[1143,7389,1229],{"emptyLinePlaceholder":1228},[1143,7391,7393,7395,7398,7400,7403],{"class":1145,"line":7392},249,[1143,7394,1236],{"class":1235},[1143,7396,7397],{"class":1239}," StripePaymentService",[1143,7399,1243],{"class":1164},[1143,7401,7402],{"class":1246},"PaymentService",[1143,7404,1250],{"class":1164},[1143,7406,7408,7410,7413],{"class":1145,"line":7407},250,[1143,7409,1257],{"class":1256},[1143,7411,7412],{"class":1260},"Stripe adapter for payment processing",[1143,7414,1264],{"class":1256},[1143,7416,7418],{"class":1145,"line":7417},251,[1143,7419,1270],{"class":1160},[1143,7421,7423,7425,7427,7429,7431,7433,7436,7438,7440],{"class":1145,"line":7422},252,[1143,7424,1276],{"class":1235},[1143,7426,1280],{"class":1279},[1143,7428,1243],{"class":1164},[1143,7430,1286],{"class":1285},[1143,7432,1349],{"class":1164},[1143,7434,7435],{"class":1352}," api_key",[1143,7437,1485],{"class":1164},[1143,7439,2848],{"class":1849},[1143,7441,1250],{"class":1164},[1143,7443,7445,7447,7449,7452,7454],{"class":1145,"line":7444},253,[1143,7446,1295],{"class":1294},[1143,7448,1165],{"class":1164},[1143,7450,7451],{"class":1300},"api_key",[1143,7453,1304],{"class":1164},[1143,7455,7456],{"class":1160}," api_key\n",[1143,7458,7460],{"class":1145,"line":7459},254,[1143,7461,1270],{"class":1160},[1143,7463,7465,7467,7469,7471,7473,7475,7477,7479,7481,7483,7485,7487,7489,7491,7493,7495],{"class":1145,"line":7464},255,[1143,7466,1276],{"class":1235},[1143,7468,5472],{"class":1341},[1143,7470,1243],{"class":1164},[1143,7472,1286],{"class":1285},[1143,7474,1349],{"class":1164},[1143,7476,5321],{"class":1352},[1143,7478,1485],{"class":1164},[1143,7480,4432],{"class":1160},[1143,7482,1349],{"class":1164},[1143,7484,5489],{"class":1352},[1143,7486,1485],{"class":1164},[1143,7488,2848],{"class":1849},[1143,7490,1853],{"class":1164},[1143,7492,1856],{"class":1164},[1143,7494,2954],{"class":1849},[1143,7496,1380],{"class":1164},[1143,7498,7500,7502,7505],{"class":1145,"line":7499},256,[1143,7501,1366],{"class":1256},[1143,7503,7504],{"class":1260},"Process payment using Stripe",[1143,7506,1264],{"class":1256},[1143,7508,7510,7512],{"class":1145,"line":7509},257,[1143,7511,1377],{"class":1156},[1143,7513,1380],{"class":1164},[1143,7515,7517],{"class":1145,"line":7516},258,[1143,7518,7519],{"class":1149},"            # Stripe payment processing logic\n",[1143,7521,7523,7526],{"class":1145,"line":7522},259,[1143,7524,7525],{"class":1156},"            import",[1143,7527,7528],{"class":1160}," stripe\n",[1143,7530,7532,7535,7537,7539,7541,7543,7545],{"class":1145,"line":7531},260,[1143,7533,7534],{"class":1160},"            stripe",[1143,7536,1165],{"class":1164},[1143,7538,7451],{"class":1300},[1143,7540,1304],{"class":1164},[1143,7542,1392],{"class":1294},[1143,7544,1165],{"class":1164},[1143,7546,7547],{"class":1300},"api_key\n",[1143,7549,7551],{"class":1145,"line":7550},261,[1143,7552,6279],{"class":1160},[1143,7554,7556,7559,7561,7564,7566,7569,7571,7573],{"class":1145,"line":7555},262,[1143,7557,7558],{"class":1160},"            charge ",[1143,7560,1389],{"class":1164},[1143,7562,7563],{"class":1160}," stripe",[1143,7565,1165],{"class":1164},[1143,7567,7568],{"class":1300},"Charge",[1143,7570,1165],{"class":1164},[1143,7572,6658],{"class":1307},[1143,7574,2224],{"class":1164},[1143,7576,7578,7581,7583,7586,7588,7590,7592,7594,7596,7598,7600],{"class":1145,"line":7577},263,[1143,7579,7580],{"class":1499},"                amount",[1143,7582,1389],{"class":1164},[1143,7584,7585],{"class":1849},"int",[1143,7587,1243],{"class":1164},[1143,7589,6031],{"class":1307},[1143,7591,1165],{"class":1164},[1143,7593,4536],{"class":1300},[1143,7595,2531],{"class":1904},[1143,7597,3812],{"class":1505},[1143,7599,5193],{"class":1164},[1143,7601,7602],{"class":1149},"  # Convert to cents\n",[1143,7604,7606,7609,7611,7613,7616,7618],{"class":1145,"line":7605},264,[1143,7607,7608],{"class":1499},"                currency",[1143,7610,1389],{"class":1164},[1143,7612,1476],{"class":1475},[1143,7614,7615],{"class":1479},"usd",[1143,7617,1476],{"class":1475},[1143,7619,5748],{"class":1164},[1143,7621,7623,7626,7628,7631],{"class":1145,"line":7622},265,[1143,7624,7625],{"class":1499},"                source",[1143,7627,1389],{"class":1164},[1143,7629,7630],{"class":1307},"payment_method",[1143,7632,5748],{"class":1164},[1143,7634,7636,7639,7641,7643,7646,7648,7650,7652,7654,7656],{"class":1145,"line":7635},266,[1143,7637,7638],{"class":1499},"                description",[1143,7640,1389],{"class":1164},[1143,7642,1923],{"class":1235},[1143,7644,7645],{"class":1479},"'Order ",[1143,7647,1930],{"class":1929},[1143,7649,6031],{"class":1307},[1143,7651,1165],{"class":1164},[1143,7653,2150],{"class":1300},[1143,7655,1935],{"class":1929},[1143,7657,4527],{"class":1479},[1143,7659,7661],{"class":1145,"line":7660},267,[1143,7662,6003],{"class":1164},[1143,7664,7666],{"class":1145,"line":7665},268,[1143,7667,6279],{"class":1160},[1143,7669,7671,7673,7676,7678],{"class":1145,"line":7670},269,[1143,7672,1441],{"class":1156},[1143,7674,7675],{"class":1160}," charge",[1143,7677,1165],{"class":1164},[1143,7679,7680],{"class":1300},"paid\n",[1143,7682,7684,7686,7688,7691,7693],{"class":1145,"line":7683},270,[1143,7685,1457],{"class":1156},[1143,7687,6362],{"class":1849},[1143,7689,7690],{"class":1156}," as",[1143,7692,1663],{"class":1160},[1143,7694,1380],{"class":1164},[1143,7696,7698,7701,7703,7705,7707,7709,7712,7714,7717,7719,7721],{"class":1145,"line":7697},271,[1143,7699,7700],{"class":1160},"            logger",[1143,7702,1165],{"class":1164},[1143,7704,1480],{"class":1307},[1143,7706,1243],{"class":1164},[1143,7708,1923],{"class":1235},[1143,7710,7711],{"class":1479},"\"Payment processing failed: ",[1143,7713,1930],{"class":1929},[1143,7715,7716],{"class":1307},"e",[1143,7718,1935],{"class":1929},[1143,7720,1981],{"class":1479},[1143,7722,1409],{"class":1164},[1143,7724,7726,7728],{"class":1145,"line":7725},272,[1143,7727,1441],{"class":1156},[1143,7729,3905],{"class":2500},[1143,7731,7733],{"class":1145,"line":7732},273,[1143,7734,1229],{"emptyLinePlaceholder":1228},[1143,7736,7738,7740,7743,7745,7748],{"class":1145,"line":7737},274,[1143,7739,1236],{"class":1235},[1143,7741,7742],{"class":1239}," RedisInventoryService",[1143,7744,1243],{"class":1164},[1143,7746,7747],{"class":1246},"InventoryService",[1143,7749,1250],{"class":1164},[1143,7751,7753,7755,7758],{"class":1145,"line":7752},275,[1143,7754,1257],{"class":1256},[1143,7756,7757],{"class":1260},"Redis adapter for inventory management",[1143,7759,1264],{"class":1256},[1143,7761,7763],{"class":1145,"line":7762},276,[1143,7764,1270],{"class":1160},[1143,7766,7768,7770,7772,7774,7776,7778,7781],{"class":1145,"line":7767},277,[1143,7769,1276],{"class":1235},[1143,7771,1280],{"class":1279},[1143,7773,1243],{"class":1164},[1143,7775,1286],{"class":1285},[1143,7777,1349],{"class":1164},[1143,7779,7780],{"class":1352}," redis_client",[1143,7782,1250],{"class":1164},[1143,7784,7786,7788,7790,7793,7795],{"class":1145,"line":7785},278,[1143,7787,1295],{"class":1294},[1143,7789,1165],{"class":1164},[1143,7791,7792],{"class":1300},"redis",[1143,7794,1304],{"class":1164},[1143,7796,7797],{"class":1160}," redis_client\n",[1143,7799,7801],{"class":1145,"line":7800},279,[1143,7802,1270],{"class":1160},[1143,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824,7826,7828,7830,7832],{"class":1145,"line":7805},280,[1143,7807,1276],{"class":1235},[1143,7809,5548],{"class":1341},[1143,7811,1243],{"class":1164},[1143,7813,1286],{"class":1285},[1143,7815,1349],{"class":1164},[1143,7817,5557],{"class":1352},[1143,7819,1485],{"class":1164},[1143,7821,3030],{"class":1160},[1143,7823,2090],{"class":1164},[1143,7825,4500],{"class":1160},[1143,7827,5568],{"class":1164},[1143,7829,1856],{"class":1164},[1143,7831,2954],{"class":1849},[1143,7833,1380],{"class":1164},[1143,7835,7837,7839,7842],{"class":1145,"line":7836},281,[1143,7838,1366],{"class":1256},[1143,7840,7841],{"class":1260},"Reserve items in Redis",[1143,7843,1264],{"class":1256},[1143,7845,7847,7850,7852,7854,7856,7858,7860,7863],{"class":1145,"line":7846},282,[1143,7848,7849],{"class":1160},"        pipe ",[1143,7851,1389],{"class":1164},[1143,7853,1392],{"class":1294},[1143,7855,1165],{"class":1164},[1143,7857,7792],{"class":1300},[1143,7859,1165],{"class":1164},[1143,7861,7862],{"class":1307},"pipeline",[1143,7864,1311],{"class":1164},[1143,7866,7868],{"class":1145,"line":7867},283,[1143,7869,1946],{"class":1160},[1143,7871,7873,7875],{"class":1145,"line":7872},284,[1143,7874,1377],{"class":1156},[1143,7876,1380],{"class":1164},[1143,7878,7880],{"class":1145,"line":7879},285,[1143,7881,7882],{"class":1149},"            # Check availability first\n",[1143,7884,7886,7888,7890,7892,7894],{"class":1145,"line":7885},286,[1143,7887,6762],{"class":1156},[1143,7889,4856],{"class":1160},[1143,7891,4859],{"class":1156},[1143,7893,5557],{"class":1160},[1143,7895,1380],{"class":1164},[1143,7897,7899,7902,7904,7906,7908,7910,7912,7914,7916,7918,7921,7923,7925,7927,7929,7931,7933],{"class":1145,"line":7898},287,[1143,7900,7901],{"class":1160},"                available ",[1143,7903,1389],{"class":1164},[1143,7905,1392],{"class":1294},[1143,7907,1165],{"class":1164},[1143,7909,7792],{"class":1300},[1143,7911,1165],{"class":1164},[1143,7913,2145],{"class":1307},[1143,7915,1243],{"class":1164},[1143,7917,1923],{"class":1235},[1143,7919,7920],{"class":1479},"\"inventory:",[1143,7922,1930],{"class":1929},[1143,7924,5241],{"class":1307},[1143,7926,1165],{"class":1164},[1143,7928,1406],{"class":1300},[1143,7930,1935],{"class":1929},[1143,7932,1981],{"class":1479},[1143,7934,1409],{"class":1164},[1143,7936,7938,7941,7943,7946,7949,7951,7953,7956,7958,7961,7963,7965,7967],{"class":1145,"line":7937},288,[1143,7939,7940],{"class":1156},"                if",[1143,7942,1905],{"class":1904},[1143,7944,7945],{"class":1160}," available ",[1143,7947,7948],{"class":1904},"or",[1143,7950,1850],{"class":1849},[1143,7952,1243],{"class":1164},[1143,7954,7955],{"class":1307},"available",[1143,7957,1853],{"class":1164},[1143,7959,7960],{"class":1904}," \u003C",[1143,7962,4871],{"class":1160},[1143,7964,1165],{"class":1164},[1143,7966,4412],{"class":1300},[1143,7968,1380],{"class":1164},[1143,7970,7972,7975],{"class":1145,"line":7971},289,[1143,7973,7974],{"class":1156},"                    return",[1143,7976,3905],{"class":2500},[1143,7978,7980],{"class":1145,"line":7979},290,[1143,7981,6279],{"class":1160},[1143,7983,7985],{"class":1145,"line":7984},291,[1143,7986,7987],{"class":1149},"            # Reserve items\n",[1143,7989,7991,7993,7995,7997,7999],{"class":1145,"line":7990},292,[1143,7992,6762],{"class":1156},[1143,7994,4856],{"class":1160},[1143,7996,4859],{"class":1156},[1143,7998,5557],{"class":1160},[1143,8000,1380],{"class":1164},[1143,8002,8004,8007,8009,8012,8014,8016,8018,8020,8022,8024,8026,8028,8030,8032,8034,8036,8038],{"class":1145,"line":8003},293,[1143,8005,8006],{"class":1160},"                pipe",[1143,8008,1165],{"class":1164},[1143,8010,8011],{"class":1307},"decrby",[1143,8013,1243],{"class":1164},[1143,8015,1923],{"class":1235},[1143,8017,7920],{"class":1479},[1143,8019,1930],{"class":1929},[1143,8021,5241],{"class":1307},[1143,8023,1165],{"class":1164},[1143,8025,1406],{"class":1300},[1143,8027,1935],{"class":1929},[1143,8029,1981],{"class":1479},[1143,8031,1349],{"class":1164},[1143,8033,4871],{"class":1307},[1143,8035,1165],{"class":1164},[1143,8037,4412],{"class":1300},[1143,8039,1409],{"class":1164},[1143,8041,8043],{"class":1145,"line":8042},294,[1143,8044,6279],{"class":1160},[1143,8046,8048,8051,8053,8056],{"class":1145,"line":8047},295,[1143,8049,8050],{"class":1160},"            pipe",[1143,8052,1165],{"class":1164},[1143,8054,8055],{"class":1307},"execute",[1143,8057,1311],{"class":1164},[1143,8059,8061,8063],{"class":1145,"line":8060},296,[1143,8062,1441],{"class":1156},[1143,8064,2501],{"class":2500},[1143,8066,8068],{"class":1145,"line":8067},297,[1143,8069,6279],{"class":1160},[1143,8071,8073,8075,8077,8079,8081],{"class":1145,"line":8072},298,[1143,8074,1457],{"class":1156},[1143,8076,6362],{"class":1849},[1143,8078,7690],{"class":1156},[1143,8080,1663],{"class":1160},[1143,8082,1380],{"class":1164},[1143,8084,8086,8088,8090,8092,8094,8096,8099,8101,8103,8105,8107],{"class":1145,"line":8085},299,[1143,8087,7700],{"class":1160},[1143,8089,1165],{"class":1164},[1143,8091,1480],{"class":1307},[1143,8093,1243],{"class":1164},[1143,8095,1923],{"class":1235},[1143,8097,8098],{"class":1479},"\"Inventory reservation failed: ",[1143,8100,1930],{"class":1929},[1143,8102,7716],{"class":1307},[1143,8104,1935],{"class":1929},[1143,8106,1981],{"class":1479},[1143,8108,1409],{"class":1164},[1143,8110,8112,8114],{"class":1145,"line":8111},300,[1143,8113,1441],{"class":1156},[1143,8115,3905],{"class":2500},[1143,8117,8119],{"class":1145,"line":8118},301,[1143,8120,1270],{"class":1160},[1143,8122,8124,8126,8128,8130,8132,8134,8136,8138,8140,8142,8144,8146,8148,8150],{"class":1145,"line":8123},302,[1143,8125,1276],{"class":1235},[1143,8127,5595],{"class":1341},[1143,8129,1243],{"class":1164},[1143,8131,1286],{"class":1285},[1143,8133,1349],{"class":1164},[1143,8135,5557],{"class":1352},[1143,8137,1485],{"class":1164},[1143,8139,3030],{"class":1160},[1143,8141,2090],{"class":1164},[1143,8143,4500],{"class":1160},[1143,8145,5568],{"class":1164},[1143,8147,1856],{"class":1164},[1143,8149,2954],{"class":1849},[1143,8151,1380],{"class":1164},[1143,8153,8155,8157,8160],{"class":1145,"line":8154},303,[1143,8156,1366],{"class":1256},[1143,8158,8159],{"class":1260},"Release reserved items",[1143,8161,1264],{"class":1256},[1143,8163,8165,8167,8169,8171,8173,8175,8177,8179],{"class":1145,"line":8164},304,[1143,8166,7849],{"class":1160},[1143,8168,1389],{"class":1164},[1143,8170,1392],{"class":1294},[1143,8172,1165],{"class":1164},[1143,8174,7792],{"class":1300},[1143,8176,1165],{"class":1164},[1143,8178,7862],{"class":1307},[1143,8180,1311],{"class":1164},[1143,8182,8184],{"class":1145,"line":8183},305,[1143,8185,1946],{"class":1160},[1143,8187,8189,8191],{"class":1145,"line":8188},306,[1143,8190,1377],{"class":1156},[1143,8192,1380],{"class":1164},[1143,8194,8196,8198,8200,8202,8204],{"class":1145,"line":8195},307,[1143,8197,6762],{"class":1156},[1143,8199,4856],{"class":1160},[1143,8201,4859],{"class":1156},[1143,8203,5557],{"class":1160},[1143,8205,1380],{"class":1164},[1143,8207,8209,8211,8213,8216,8218,8220,8222,8224,8226,8228,8230,8232,8234,8236,8238,8240,8242],{"class":1145,"line":8208},308,[1143,8210,8006],{"class":1160},[1143,8212,1165],{"class":1164},[1143,8214,8215],{"class":1307},"incrby",[1143,8217,1243],{"class":1164},[1143,8219,1923],{"class":1235},[1143,8221,7920],{"class":1479},[1143,8223,1930],{"class":1929},[1143,8225,5241],{"class":1307},[1143,8227,1165],{"class":1164},[1143,8229,1406],{"class":1300},[1143,8231,1935],{"class":1929},[1143,8233,1981],{"class":1479},[1143,8235,1349],{"class":1164},[1143,8237,4871],{"class":1307},[1143,8239,1165],{"class":1164},[1143,8241,4412],{"class":1300},[1143,8243,1409],{"class":1164},[1143,8245,8247],{"class":1145,"line":8246},309,[1143,8248,6279],{"class":1160},[1143,8250,8252,8254,8256,8258],{"class":1145,"line":8251},310,[1143,8253,8050],{"class":1160},[1143,8255,1165],{"class":1164},[1143,8257,8055],{"class":1307},[1143,8259,1311],{"class":1164},[1143,8261,8263,8265],{"class":1145,"line":8262},311,[1143,8264,1441],{"class":1156},[1143,8266,2501],{"class":2500},[1143,8268,8270],{"class":1145,"line":8269},312,[1143,8271,6279],{"class":1160},[1143,8273,8275,8277,8279,8281,8283],{"class":1145,"line":8274},313,[1143,8276,1457],{"class":1156},[1143,8278,6362],{"class":1849},[1143,8280,7690],{"class":1156},[1143,8282,1663],{"class":1160},[1143,8284,1380],{"class":1164},[1143,8286,8288,8290,8292,8294,8296,8298,8301,8303,8305,8307,8309],{"class":1145,"line":8287},314,[1143,8289,7700],{"class":1160},[1143,8291,1165],{"class":1164},[1143,8293,1480],{"class":1307},[1143,8295,1243],{"class":1164},[1143,8297,1923],{"class":1235},[1143,8299,8300],{"class":1479},"\"Inventory release failed: ",[1143,8302,1930],{"class":1929},[1143,8304,7716],{"class":1307},[1143,8306,1935],{"class":1929},[1143,8308,1981],{"class":1479},[1143,8310,1409],{"class":1164},[1143,8312,8314,8316],{"class":1145,"line":8313},315,[1143,8315,1441],{"class":1156},[1143,8317,3905],{"class":2500},[1143,8319,8321],{"class":1145,"line":8320},316,[1143,8322,1229],{"emptyLinePlaceholder":1228},[1143,8324,8326],{"class":1145,"line":8325},317,[1143,8327,8328],{"class":1149},"# Django Models (Infrastructure)\n",[1143,8330,8332,8334,8336,8338,8340,8342,8344],{"class":1145,"line":8331},318,[1143,8333,1236],{"class":1235},[1143,8335,6532],{"class":1239},[1143,8337,1243],{"class":1164},[1143,8339,3447],{"class":1246},[1143,8341,1165],{"class":1164},[1143,8343,3452],{"class":1246},[1143,8345,1250],{"class":1164},[1143,8347,8349,8351,8354],{"class":1145,"line":8348},319,[1143,8350,1257],{"class":1256},[1143,8352,8353],{"class":1260},"Django model for order persistence",[1143,8355,1264],{"class":1256},[1143,8357,8359],{"class":1145,"line":8358},320,[1143,8360,1270],{"class":1160},[1143,8362,8364,8367,8369,8371,8373,8376],{"class":1145,"line":8363},321,[1143,8365,8366],{"class":1160},"    customer_id ",[1143,8368,1389],{"class":1164},[1143,8370,3480],{"class":1160},[1143,8372,1165],{"class":1164},[1143,8374,8375],{"class":1307},"IntegerField",[1143,8377,1311],{"class":1164},[1143,8379,8381,8384,8386,8388,8390,8392,8394,8396,8398,8401,8403,8406,8408,8410,8412,8414],{"class":1145,"line":8380},322,[1143,8382,8383],{"class":1160},"    status ",[1143,8385,1389],{"class":1164},[1143,8387,3480],{"class":1160},[1143,8389,1165],{"class":1164},[1143,8391,3485],{"class":1307},[1143,8393,1243],{"class":1164},[1143,8395,3490],{"class":1499},[1143,8397,1389],{"class":1164},[1143,8399,8400],{"class":1505},"20",[1143,8402,1349],{"class":1164},[1143,8404,8405],{"class":1499}," default",[1143,8407,1389],{"class":1164},[1143,8409,1476],{"class":1475},[1143,8411,4524],{"class":1479},[1143,8413,1476],{"class":1475},[1143,8415,1409],{"class":1164},[1143,8417,8419,8422,8424,8426,8428,8430,8432,8434,8436,8438,8440,8442,8444,8446,8448,8450,8452,8455],{"class":1145,"line":8418},323,[1143,8420,8421],{"class":1160},"    total ",[1143,8423,1389],{"class":1164},[1143,8425,3480],{"class":1160},[1143,8427,1165],{"class":1164},[1143,8429,3538],{"class":1307},[1143,8431,1243],{"class":1164},[1143,8433,3543],{"class":1499},[1143,8435,1389],{"class":1164},[1143,8437,3548],{"class":1505},[1143,8439,1349],{"class":1164},[1143,8441,3553],{"class":1499},[1143,8443,1389],{"class":1164},[1143,8445,3558],{"class":1505},[1143,8447,1349],{"class":1164},[1143,8449,8405],{"class":1499},[1143,8451,1389],{"class":1164},[1143,8453,8454],{"class":1505},"0",[1143,8456,1409],{"class":1164},[1143,8458,8460,8462,8464,8466,8468,8470,8472,8474,8476,8478],{"class":1145,"line":8459},324,[1143,8461,3658],{"class":1160},[1143,8463,1389],{"class":1164},[1143,8465,3480],{"class":1160},[1143,8467,1165],{"class":1164},[1143,8469,3667],{"class":1307},[1143,8471,1243],{"class":1164},[1143,8473,3672],{"class":1499},[1143,8475,1389],{"class":1164},[1143,8477,3088],{"class":2500},[1143,8479,1409],{"class":1164},[1143,8481,8483,8486,8488,8490,8492,8494,8496,8498,8500,8502],{"class":1145,"line":8482},325,[1143,8484,8485],{"class":1160},"    updated_at ",[1143,8487,1389],{"class":1164},[1143,8489,3480],{"class":1160},[1143,8491,1165],{"class":1164},[1143,8493,3667],{"class":1307},[1143,8495,1243],{"class":1164},[1143,8497,3697],{"class":1499},[1143,8499,1389],{"class":1164},[1143,8501,3088],{"class":2500},[1143,8503,1409],{"class":1164},[1143,8505,8507],{"class":1145,"line":8506},326,[1143,8508,1229],{"emptyLinePlaceholder":1228},[1143,8510,8512,8514,8517,8519,8521,8523,8525],{"class":1145,"line":8511},327,[1143,8513,1236],{"class":1235},[1143,8515,8516],{"class":1239}," OrderItemModel",[1143,8518,1243],{"class":1164},[1143,8520,3447],{"class":1246},[1143,8522,1165],{"class":1164},[1143,8524,3452],{"class":1246},[1143,8526,1250],{"class":1164},[1143,8528,8530,8532,8535],{"class":1145,"line":8529},328,[1143,8531,1257],{"class":1256},[1143,8533,8534],{"class":1260},"Django model for order items",[1143,8536,1264],{"class":1256},[1143,8538,8540],{"class":1145,"line":8539},329,[1143,8541,1270],{"class":1160},[1143,8543,8545,8548,8550,8552,8554,8556,8558,8561,8563,8566,8568,8570,8572,8574,8576,8578,8580,8582,8584,8586],{"class":1145,"line":8544},330,[1143,8546,8547],{"class":1160},"    order ",[1143,8549,1389],{"class":1164},[1143,8551,3480],{"class":1160},[1143,8553,1165],{"class":1164},[1143,8555,3575],{"class":1307},[1143,8557,1243],{"class":1164},[1143,8559,8560],{"class":1307},"OrderModel",[1143,8562,1349],{"class":1164},[1143,8564,8565],{"class":1499}," related_name",[1143,8567,1389],{"class":1164},[1143,8569,1476],{"class":1475},[1143,8571,4491],{"class":1479},[1143,8573,1476],{"class":1475},[1143,8575,1349],{"class":1164},[1143,8577,3589],{"class":1499},[1143,8579,1389],{"class":1164},[1143,8581,3447],{"class":1307},[1143,8583,1165],{"class":1164},[1143,8585,3599],{"class":3598},[1143,8587,1409],{"class":1164},[1143,8589,8591,8594,8596,8598,8600,8602],{"class":1145,"line":8590},331,[1143,8592,8593],{"class":1160},"    product_id ",[1143,8595,1389],{"class":1164},[1143,8597,3480],{"class":1160},[1143,8599,1165],{"class":1164},[1143,8601,8375],{"class":1307},[1143,8603,1311],{"class":1164},[1143,8605,8607,8610,8612,8614,8616,8618],{"class":1145,"line":8606},332,[1143,8608,8609],{"class":1160},"    quantity ",[1143,8611,1389],{"class":1164},[1143,8613,3480],{"class":1160},[1143,8615,1165],{"class":1164},[1143,8617,8375],{"class":1307},[1143,8619,1311],{"class":1164},[1143,8621,8623,8625,8627,8629,8631,8633,8635,8637,8639,8641,8643,8645,8647,8649],{"class":1145,"line":8622},333,[1143,8624,3529],{"class":1160},[1143,8626,1389],{"class":1164},[1143,8628,3480],{"class":1160},[1143,8630,1165],{"class":1164},[1143,8632,3538],{"class":1307},[1143,8634,1243],{"class":1164},[1143,8636,3543],{"class":1499},[1143,8638,1389],{"class":1164},[1143,8640,3548],{"class":1505},[1143,8642,1349],{"class":1164},[1143,8644,3553],{"class":1499},[1143,8646,1389],{"class":1164},[1143,8648,3558],{"class":1505},[1143,8650,1409],{"class":1164},[1143,8652,8654],{"class":1145,"line":8653},334,[1143,8655,1229],{"emptyLinePlaceholder":1228},[1143,8657,8659],{"class":1145,"line":8658},335,[1143,8660,8661],{"class":1149},"# Dependency Injection Configuration\n",[1143,8663,8665,8667,8670],{"class":1145,"line":8664},336,[1143,8666,1236],{"class":1235},[1143,8668,8669],{"class":1239}," DIContainer",[1143,8671,1380],{"class":1164},[1143,8673,8675,8677,8680],{"class":1145,"line":8674},337,[1143,8676,1257],{"class":1256},[1143,8678,8679],{"class":1260},"Simple dependency injection container",[1143,8681,1264],{"class":1256},[1143,8683,8685],{"class":1145,"line":8684},338,[1143,8686,1270],{"class":1160},[1143,8688,8690,8692,8694,8696,8698],{"class":1145,"line":8689},339,[1143,8691,1276],{"class":1235},[1143,8693,1280],{"class":1279},[1143,8695,1243],{"class":1164},[1143,8697,1286],{"class":1285},[1143,8699,1250],{"class":1164},[1143,8701,8703,8705,8707,8710,8712],{"class":1145,"line":8702},340,[1143,8704,1295],{"class":1294},[1143,8706,1165],{"class":1164},[1143,8708,8709],{"class":1300},"_services",[1143,8711,1304],{"class":1164},[1143,8713,8714],{"class":1164}," {}\n",[1143,8716,8718],{"class":1145,"line":8717},341,[1143,8719,1270],{"class":1160},[1143,8721,8723,8725,8728,8730,8732,8734,8737,8739,8742],{"class":1145,"line":8722},342,[1143,8724,1276],{"class":1235},[1143,8726,8727],{"class":1341}," register",[1143,8729,1243],{"class":1164},[1143,8731,1286],{"class":1285},[1143,8733,1349],{"class":1164},[1143,8735,8736],{"class":1352}," interface",[1143,8738,1349],{"class":1164},[1143,8740,8741],{"class":1352}," implementation",[1143,8743,1250],{"class":1164},[1143,8745,8747,8749,8752],{"class":1145,"line":8746},343,[1143,8748,1366],{"class":1256},[1143,8750,8751],{"class":1260},"Register service implementation",[1143,8753,1264],{"class":1256},[1143,8755,8757,8759,8761,8763,8765,8768,8770,8772],{"class":1145,"line":8756},344,[1143,8758,1295],{"class":1294},[1143,8760,1165],{"class":1164},[1143,8762,8709],{"class":1300},[1143,8764,2090],{"class":1164},[1143,8766,8767],{"class":1300},"interface",[1143,8769,4503],{"class":1164},[1143,8771,1304],{"class":1164},[1143,8773,8774],{"class":1160}," implementation\n",[1143,8776,8778],{"class":1145,"line":8777},345,[1143,8779,1270],{"class":1160},[1143,8781,8783,8785,8787,8789,8791,8793,8795],{"class":1145,"line":8782},346,[1143,8784,1276],{"class":1235},[1143,8786,1342],{"class":1341},[1143,8788,1243],{"class":1164},[1143,8790,1286],{"class":1285},[1143,8792,1349],{"class":1164},[1143,8794,8736],{"class":1352},[1143,8796,1250],{"class":1164},[1143,8798,8800,8802,8805],{"class":1145,"line":8799},347,[1143,8801,1366],{"class":1256},[1143,8803,8804],{"class":1260},"Get service implementation",[1143,8806,1264],{"class":1256},[1143,8808,8810,8812,8814,8816,8818,8820,8822,8824,8826],{"class":1145,"line":8809},348,[1143,8811,1999],{"class":1156},[1143,8813,1392],{"class":1294},[1143,8815,1165],{"class":1164},[1143,8817,8709],{"class":1300},[1143,8819,1165],{"class":1164},[1143,8821,2145],{"class":1307},[1143,8823,1243],{"class":1164},[1143,8825,8767],{"class":1307},[1143,8827,1409],{"class":1164},[1143,8829,8831],{"class":1145,"line":8830},349,[1143,8832,1229],{"emptyLinePlaceholder":1228},[1143,8834,8836],{"class":1145,"line":8835},350,[1143,8837,8838],{"class":1149},"# Configuration\n",[1143,8840,8842,8845,8848],{"class":1145,"line":8841},351,[1143,8843,8844],{"class":1235},"def",[1143,8846,8847],{"class":1341}," configure_dependencies",[1143,8849,6505],{"class":1164},[1143,8851,8853,8855,8858],{"class":1145,"line":8852},352,[1143,8854,1257],{"class":1256},[1143,8856,8857],{"class":1260},"Configure dependency injection",[1143,8859,1264],{"class":1256},[1143,8861,8863,8866,8868,8870],{"class":1145,"line":8862},353,[1143,8864,8865],{"class":1160},"    container ",[1143,8867,1389],{"class":1164},[1143,8869,8669],{"class":1307},[1143,8871,1311],{"class":1164},[1143,8873,8875],{"class":1145,"line":8874},354,[1143,8876,1270],{"class":1160},[1143,8878,8880],{"class":1145,"line":8879},355,[1143,8881,8882],{"class":1149},"    # Register implementations\n",[1143,8884,8886,8889,8891,8894,8896,8898,8900,8902],{"class":1145,"line":8885},356,[1143,8887,8888],{"class":1160},"    container",[1143,8890,1165],{"class":1164},[1143,8892,8893],{"class":1307},"register",[1143,8895,1243],{"class":1164},[1143,8897,6439],{"class":1307},[1143,8899,1349],{"class":1164},[1143,8901,6434],{"class":1307},[1143,8903,8904],{"class":1164},"())\n",[1143,8906,8908,8910,8912,8914,8916,8918,8920,8922,8924,8927,8929,8932],{"class":1145,"line":8907},357,[1143,8909,8888],{"class":1160},[1143,8911,1165],{"class":1164},[1143,8913,8893],{"class":1307},[1143,8915,1243],{"class":1164},[1143,8917,7402],{"class":1307},[1143,8919,1349],{"class":1164},[1143,8921,7397],{"class":1307},[1143,8923,1243],{"class":1164},[1143,8925,8926],{"class":1307},"settings",[1143,8928,1165],{"class":1164},[1143,8930,8931],{"class":3598},"STRIPE_API_KEY",[1143,8933,4785],{"class":1164},[1143,8935,8937,8939,8941,8943,8945,8947,8949,8951,8953,8956],{"class":1145,"line":8936},358,[1143,8938,8888],{"class":1160},[1143,8940,1165],{"class":1164},[1143,8942,8893],{"class":1307},[1143,8944,1243],{"class":1164},[1143,8946,7747],{"class":1307},[1143,8948,1349],{"class":1164},[1143,8950,7742],{"class":1307},[1143,8952,1243],{"class":1164},[1143,8954,8955],{"class":1307},"redis_client",[1143,8957,4785],{"class":1164},[1143,8959,8961,8963,8965,8967,8969,8972,8974,8977],{"class":1145,"line":8960},359,[1143,8962,8888],{"class":1160},[1143,8964,1165],{"class":1164},[1143,8966,8893],{"class":1307},[1143,8968,1243],{"class":1164},[1143,8970,8971],{"class":1307},"NotificationService",[1143,8973,1349],{"class":1164},[1143,8975,8976],{"class":1307}," EmailNotificationService",[1143,8978,8904],{"class":1164},[1143,8980,8982],{"class":1145,"line":8981},360,[1143,8983,1270],{"class":1160},[1143,8985,8987,8990],{"class":1145,"line":8986},361,[1143,8988,8989],{"class":1156},"    return",[1143,8991,8992],{"class":1160}," container\n",[1143,8994,8996],{"class":1145,"line":8995},362,[1143,8997,1229],{"emptyLinePlaceholder":1228},[1143,8999,9001],{"class":1145,"line":9000},363,[1143,9002,9003],{"class":1149},"# Usage in views\n",[1143,9005,9007,9009,9012,9014,9016],{"class":1145,"line":9006},364,[1143,9008,8844],{"class":1235},[1143,9010,9011],{"class":1341}," create_order_view",[1143,9013,1243],{"class":1164},[1143,9015,1571],{"class":1352},[1143,9017,1250],{"class":1164},[1143,9019,9021,9023,9026],{"class":1145,"line":9020},365,[1143,9022,1257],{"class":1256},[1143,9024,9025],{"class":1260},"View using hexagonal architecture",[1143,9027,1264],{"class":1256},[1143,9029,9031,9033,9035,9037],{"class":1145,"line":9030},366,[1143,9032,8865],{"class":1160},[1143,9034,1389],{"class":1164},[1143,9036,8847],{"class":1307},[1143,9038,1311],{"class":1164},[1143,9040,9042],{"class":1145,"line":9041},367,[1143,9043,1270],{"class":1160},[1143,9045,9047,9050,9052,9054],{"class":1145,"line":9046},368,[1143,9048,9049],{"class":1160},"    order_service ",[1143,9051,1389],{"class":1164},[1143,9053,5706],{"class":1307},[1143,9055,2224],{"class":1164},[1143,9057,9059,9062,9064,9067,9069,9071,9073,9075],{"class":1145,"line":9058},369,[1143,9060,9061],{"class":1499},"        order_repo",[1143,9063,1389],{"class":1164},[1143,9065,9066],{"class":1307},"container",[1143,9068,1165],{"class":1164},[1143,9070,2145],{"class":1307},[1143,9072,1243],{"class":1164},[1143,9074,6439],{"class":1307},[1143,9076,3239],{"class":1164},[1143,9078,9080,9083,9085,9087,9089,9091,9093,9095],{"class":1145,"line":9079},370,[1143,9081,9082],{"class":1499},"        payment_service",[1143,9084,1389],{"class":1164},[1143,9086,9066],{"class":1307},[1143,9088,1165],{"class":1164},[1143,9090,2145],{"class":1307},[1143,9092,1243],{"class":1164},[1143,9094,7402],{"class":1307},[1143,9096,3239],{"class":1164},[1143,9098,9100,9103,9105,9107,9109,9111,9113,9115],{"class":1145,"line":9099},371,[1143,9101,9102],{"class":1499},"        inventory_service",[1143,9104,1389],{"class":1164},[1143,9106,9066],{"class":1307},[1143,9108,1165],{"class":1164},[1143,9110,2145],{"class":1307},[1143,9112,1243],{"class":1164},[1143,9114,7747],{"class":1307},[1143,9116,3239],{"class":1164},[1143,9118,9120,9123,9125,9127,9129,9131,9133,9135],{"class":1145,"line":9119},372,[1143,9121,9122],{"class":1499},"        notification_service",[1143,9124,1389],{"class":1164},[1143,9126,9066],{"class":1307},[1143,9128,1165],{"class":1164},[1143,9130,2145],{"class":1307},[1143,9132,1243],{"class":1164},[1143,9134,8971],{"class":1307},[1143,9136,1409],{"class":1164},[1143,9138,9140],{"class":1145,"line":9139},373,[1143,9141,9142],{"class":1164},"    )\n",[1143,9144,9146],{"class":1145,"line":9145},374,[1143,9147,1270],{"class":1160},[1143,9149,9151],{"class":1145,"line":9150},375,[1143,9152,9153],{"class":1149},"    # Extract data from request\n",[1143,9155,9157,9159,9161,9163,9165,9168,9170],{"class":1145,"line":9156},376,[1143,9158,8366],{"class":1160},[1143,9160,1389],{"class":1164},[1143,9162,1353],{"class":1160},[1143,9164,1165],{"class":1164},[1143,9166,9167],{"class":1300},"user",[1143,9169,1165],{"class":1164},[1143,9171,6727],{"class":1300},[1143,9173,9175,9178,9180,9182,9184,9186,9188,9190,9192,9194,9196,9198,9200],{"class":1145,"line":9174},377,[1143,9176,9177],{"class":1160},"    items ",[1143,9179,1389],{"class":1164},[1143,9181,1353],{"class":1160},[1143,9183,1165],{"class":1164},[1143,9185,1449],{"class":1300},[1143,9187,1165],{"class":1164},[1143,9189,2145],{"class":1307},[1143,9191,1243],{"class":1164},[1143,9193,1476],{"class":1475},[1143,9195,4491],{"class":1479},[1143,9197,1476],{"class":1475},[1143,9199,1349],{"class":1164},[1143,9201,9202],{"class":1164}," [])\n",[1143,9204,9206],{"class":1145,"line":9205},378,[1143,9207,1270],{"class":1160},[1143,9209,9211],{"class":1145,"line":9210},379,[1143,9212,9213],{"class":1149},"    # Create order\n",[1143,9215,9217,9219,9221,9224,9226,9229,9231,9233,9235,9237],{"class":1145,"line":9216},380,[1143,9218,8547],{"class":1160},[1143,9220,1389],{"class":1164},[1143,9222,9223],{"class":1160}," order_service",[1143,9225,1165],{"class":1164},[1143,9227,9228],{"class":1307},"create_order",[1143,9230,1243],{"class":1164},[1143,9232,4477],{"class":1307},[1143,9234,1349],{"class":1164},[1143,9236,5557],{"class":1307},[1143,9238,1409],{"class":1164},[1143,9240,9242],{"class":1145,"line":9241},381,[1143,9243,1270],{"class":1160},[1143,9245,9247,9249,9251],{"class":1145,"line":9246},382,[1143,9248,8989],{"class":1156},[1143,9250,1444],{"class":1307},[1143,9252,9253],{"class":1164},"({\n",[1143,9255,9257,9260,9262,9264,9266,9268,9270,9272],{"class":1145,"line":9256},383,[1143,9258,9259],{"class":1475},"        '",[1143,9261,6102],{"class":1479},[1143,9263,1476],{"class":1475},[1143,9265,1485],{"class":1164},[1143,9267,5321],{"class":1307},[1143,9269,1165],{"class":1164},[1143,9271,2150],{"class":1300},[1143,9273,5748],{"class":1164},[1143,9275,9277,9279,9281,9283,9285,9287,9289,9291,9293,9295],{"class":1145,"line":9276},384,[1143,9278,9259],{"class":1475},[1143,9280,4536],{"class":1479},[1143,9282,1476],{"class":1475},[1143,9284,1485],{"class":1164},[1143,9286,2848],{"class":1849},[1143,9288,1243],{"class":1164},[1143,9290,6031],{"class":1307},[1143,9292,1165],{"class":1164},[1143,9294,4536],{"class":1300},[1143,9296,3239],{"class":1164},[1143,9298,9300,9302,9304,9306,9308,9310,9312],{"class":1145,"line":9299},385,[1143,9301,9259],{"class":1475},[1143,9303,4517],{"class":1479},[1143,9305,1476],{"class":1475},[1143,9307,1485],{"class":1164},[1143,9309,5321],{"class":1307},[1143,9311,1165],{"class":1164},[1143,9313,6572],{"class":1300},[1143,9315,9317],{"class":1145,"line":9316},386,[1143,9318,9319],{"class":1164},"    })\n",[1030,9321,9323],{"id":9322},"clean-architecture","Clean Architecture",[1026,9325,9326],{},"Clean Architecture takes the separation of concerns further by organizing code into concentric circles, with business logic at the center and external concerns at the outer layers.",[1038,9328,9330],{"id":9329},"clean-architecture-implementation","Clean Architecture Implementation",[1133,9332,9334],{"className":1135,"code":9333,"language":1137,"meta":1138,"style":1138},"# Entities (Innermost layer) - Enterprise business rules\nclass User:\n    \"\"\"User entity with business rules\"\"\"\n    \n    def __init__(self, email: str, password: str):\n        self.email = email\n        self.password_hash = self._hash_password(password)\n        self.is_active = True\n        self.created_at = timezone.now()\n        self.last_login = None\n    \n    def authenticate(self, password: str) -> bool:\n        \"\"\"Authenticate user with business rules\"\"\"\n        if not self.is_active:\n            return False\n        \n        return self._verify_password(password, self.password_hash)\n    \n    def change_password(self, old_password: str, new_password: str):\n        \"\"\"Change password with business validation\"\"\"\n        if not self.authenticate(old_password):\n            raise ValueError(\"Current password is incorrect\")\n        \n        if len(new_password) \u003C 8:\n            raise ValueError(\"Password must be at least 8 characters\")\n        \n        self.password_hash = self._hash_password(new_password)\n    \n    def deactivate(self):\n        \"\"\"Deactivate user account\"\"\"\n        self.is_active = False\n    \n    def record_login(self):\n        \"\"\"Record successful login\"\"\"\n        self.last_login = timezone.now()\n    \n    def _hash_password(self, password: str) -> str:\n        \"\"\"Hash password using secure algorithm\"\"\"\n        import bcrypt\n        return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')\n    \n    def _verify_password(self, password: str, hash: str) -> bool:\n        \"\"\"Verify password against hash\"\"\"\n        import bcrypt\n        return bcrypt.checkpw(password.encode('utf-8'), hash.encode('utf-8'))\n\n# Use Cases (Application layer) - Application business rules\nfrom abc import ABC, abstractmethod\n\nclass UserRepository(ABC):\n    \"\"\"Abstract repository for user persistence\"\"\"\n    \n    @abstractmethod\n    def save(self, user: User) -> User:\n        pass\n    \n    @abstractmethod\n    def get_by_email(self, email: str) -> Optional[User]:\n        pass\n    \n    @abstractmethod\n    def get_by_id(self, user_id: int) -> Optional[User]:\n        pass\n\nclass EmailService(ABC):\n    \"\"\"Abstract service for email operations\"\"\"\n    \n    @abstractmethod\n    def send_welcome_email(self, user: User) -> bool:\n        pass\n    \n    @abstractmethod\n    def send_password_reset_email(self, user: User, reset_token: str) -> bool:\n        pass\n\nclass RegisterUserUseCase:\n    \"\"\"Use case for user registration\"\"\"\n    \n    def __init__(self, user_repo: UserRepository, email_service: EmailService):\n        self.user_repo = user_repo\n        self.email_service = email_service\n    \n    def execute(self, email: str, password: str) -> User:\n        \"\"\"Execute user registration use case\"\"\"\n        # Validate input\n        if not email or '@' not in email:\n            raise ValueError(\"Invalid email address\")\n        \n        # Check if user already exists\n        existing_user = self.user_repo.get_by_email(email)\n        if existing_user:\n            raise ValueError(\"User already exists\")\n        \n        # Create user entity\n        user = User(email, password)\n        \n        # Save user\n        saved_user = self.user_repo.save(user)\n        \n        # Send welcome email\n        self.email_service.send_welcome_email(saved_user)\n        \n        return saved_user\n\nclass AuthenticateUserUseCase:\n    \"\"\"Use case for user authentication\"\"\"\n    \n    def __init__(self, user_repo: UserRepository):\n        self.user_repo = user_repo\n    \n    def execute(self, email: str, password: str) -> Optional[User]:\n        \"\"\"Execute user authentication use case\"\"\"\n        user = self.user_repo.get_by_email(email)\n        if not user:\n            return None\n        \n        if user.authenticate(password):\n            user.record_login()\n            self.user_repo.save(user)\n            return user\n        \n        return None\n\n# Interface Adapters (Controllers, Presenters, Gateways)\nclass UserController:\n    \"\"\"Controller for user-related HTTP requests\"\"\"\n    \n    def __init__(self, register_use_case: RegisterUserUseCase,\n                 auth_use_case: AuthenticateUserUseCase):\n        self.register_use_case = register_use_case\n        self.auth_use_case = auth_use_case\n    \n    def register(self, request):\n        \"\"\"Handle user registration request\"\"\"\n        try:\n            email = request.data.get('email')\n            password = request.data.get('password')\n            \n            user = self.register_use_case.execute(email, password)\n            \n            return JsonResponse({\n                'id': user.id,\n                'email': user.email,\n                'created_at': user.created_at.isoformat()\n            }, status=201)\n            \n        except ValueError as e:\n            return JsonResponse({'error': str(e)}, status=400)\n    \n    def login(self, request):\n        \"\"\"Handle user login request\"\"\"\n        email = request.data.get('email')\n        password = request.data.get('password')\n        \n        user = self.auth_use_case.execute(email, password)\n        \n        if user:\n            # Create session or JWT token\n            request.session['user_id'] = user.id\n            \n            return JsonResponse({\n                'id': user.id,\n                'email': user.email,\n                'last_login': user.last_login.isoformat() if user.last_login else None\n            })\n        else:\n            return JsonResponse({'error': 'Invalid credentials'}, status=401)\n\n# Frameworks and Drivers (Outermost layer)\nclass DjangoUserRepository(UserRepository):\n    \"\"\"Django implementation of user repository\"\"\"\n    \n    def save(self, user: User) -> User:\n        \"\"\"Save user using Django ORM\"\"\"\n        if hasattr(user, 'id') and user.id:\n            # Update existing user\n            django_user = UserModel.objects.get(id=user.id)\n            django_user.email = user.email\n            django_user.password_hash = user.password_hash\n            django_user.is_active = user.is_active\n            django_user.last_login = user.last_login\n            django_user.save()\n        else:\n            # Create new user\n            django_user = UserModel.objects.create(\n                email=user.email,\n                password_hash=user.password_hash,\n                is_active=user.is_active,\n                last_login=user.last_login\n            )\n            user.id = django_user.id\n        \n        return user\n    \n    def get_by_email(self, email: str) -> Optional[User]:\n        \"\"\"Get user by email\"\"\"\n        try:\n            django_user = UserModel.objects.get(email=email)\n            return self._to_entity(django_user)\n        except UserModel.DoesNotExist:\n            return None\n    \n    def get_by_id(self, user_id: int) -> Optional[User]:\n        \"\"\"Get user by ID\"\"\"\n        try:\n            django_user = UserModel.objects.get(id=user_id)\n            return self._to_entity(django_user)\n        except UserModel.DoesNotExist:\n            return None\n    \n    def _to_entity(self, django_user) -> User:\n        \"\"\"Convert Django model to entity\"\"\"\n        user = User.__new__(User)  # Create without calling __init__\n        user.id = django_user.id\n        user.email = django_user.email\n        user.password_hash = django_user.password_hash\n        user.is_active = django_user.is_active\n        user.created_at = django_user.created_at\n        user.last_login = django_user.last_login\n        return user\n\nclass UserModel(models.Model):\n    \"\"\"Django model for user persistence\"\"\"\n    \n    email = models.EmailField(unique=True)\n    password_hash = models.CharField(max_length=128)\n    is_active = models.BooleanField(default=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    last_login = models.DateTimeField(null=True, blank=True)\n\n# Dependency injection and configuration\ndef create_user_controller():\n    \"\"\"Factory function for user controller\"\"\"\n    user_repo = DjangoUserRepository()\n    email_service = DjangoEmailService()\n    \n    register_use_case = RegisterUserUseCase(user_repo, email_service)\n    auth_use_case = AuthenticateUserUseCase(user_repo)\n    \n    return UserController(register_use_case, auth_use_case)\n\n# Django views using clean architecture\ndef register_view(request):\n    \"\"\"Django view for user registration\"\"\"\n    controller = create_user_controller()\n    return controller.register(request)\n\ndef login_view(request):\n    \"\"\"Django view for user login\"\"\"\n    controller = create_user_controller()\n    return controller.login(request)\n",[1140,9335,9336,9341,9350,9359,9363,9393,9407,9432,9444,9462,9475,9479,9506,9515,9529,9535,9539,9564,9568,9599,9608,9628,9645,9649,9670,9687,9691,9713,9717,9730,9739,9751,9755,9768,9777,9795,9799,9826,9835,9843,9898,9902,9938,9947,9953,9998,10002,10007,10021,10025,10038,10047,10051,10057,10084,10088,10092,10098,10130,10134,10138,10144,10175,10179,10183,10196,10205,10209,10215,10242,10246,10250,10256,10292,10296,10300,10309,10318,10322,10352,10366,10380,10384,10419,10428,10433,10458,10475,10479,10484,10508,10517,10534,10538,10543,10562,10566,10571,10594,10598,10603,10623,10627,10634,10638,10647,10656,10660,10680,10692,10696,10734,10743,10765,10775,10781,10785,10801,10813,10831,10838,10842,10848,10852,10857,10866,10875,10879,10900,10911,10925,10939,10943,10959,10968,10974,11001,11028,11032,11059,11063,11071,11090,11108,11131,11144,11148,11160,11193,11197,11214,11223,11250,11277,11281,11307,11311,11319,11324,11353,11357,11365,11383,11401,11436,11441,11447,11481,11485,11490,11504,11513,11517,11543,11552,11583,11588,11620,11638,11655,11672,11689,11699,11705,11710,11728,11743,11758,11772,11785,11789,11806,11810,11816,11820,11850,11859,11865,11891,11909,11921,11927,11931,11961,11970,11976,12002,12018,12030,12036,12040,12063,12072,12094,12111,12127,12143,12159,12175,12191,12197,12201,12217,12226,12230,12255,12279,12301,12323,12356,12360,12365,12374,12383,12394,12406,12410,12429,12444,12448,12465,12469,12474,12487,12496,12507,12524,12528,12541,12550,12560],{"__ignoreMap":1138},[1143,9337,9338],{"class":1145,"line":1146},[1143,9339,9340],{"class":1149},"# Entities (Innermost layer) - Enterprise business rules\n",[1143,9342,9343,9345,9348],{"class":1145,"line":1153},[1143,9344,1236],{"class":1235},[1143,9346,9347],{"class":1239}," User",[1143,9349,1380],{"class":1164},[1143,9351,9352,9354,9357],{"class":1145,"line":1177},[1143,9353,1257],{"class":1256},[1143,9355,9356],{"class":1260},"User entity with business rules",[1143,9358,1264],{"class":1256},[1143,9360,9361],{"class":1145,"line":1194},[1143,9362,1270],{"class":1160},[1143,9364,9365,9367,9369,9371,9373,9375,9378,9380,9382,9384,9387,9389,9391],{"class":1145,"line":1210},[1143,9366,1276],{"class":1235},[1143,9368,1280],{"class":1279},[1143,9370,1243],{"class":1164},[1143,9372,1286],{"class":1285},[1143,9374,1349],{"class":1164},[1143,9376,9377],{"class":1352}," email",[1143,9379,1485],{"class":1164},[1143,9381,2848],{"class":1849},[1143,9383,1349],{"class":1164},[1143,9385,9386],{"class":1352}," password",[1143,9388,1485],{"class":1164},[1143,9390,2848],{"class":1849},[1143,9392,1250],{"class":1164},[1143,9394,9395,9397,9399,9402,9404],{"class":1145,"line":1225},[1143,9396,1295],{"class":1294},[1143,9398,1165],{"class":1164},[1143,9400,9401],{"class":1300},"email",[1143,9403,1304],{"class":1164},[1143,9405,9406],{"class":1160}," email\n",[1143,9408,9409,9411,9413,9416,9418,9420,9422,9425,9427,9430],{"class":1145,"line":1232},[1143,9410,1295],{"class":1294},[1143,9412,1165],{"class":1164},[1143,9414,9415],{"class":1300},"password_hash",[1143,9417,1304],{"class":1164},[1143,9419,1392],{"class":1294},[1143,9421,1165],{"class":1164},[1143,9423,9424],{"class":1307},"_hash_password",[1143,9426,1243],{"class":1164},[1143,9428,9429],{"class":1307},"password",[1143,9431,1409],{"class":1164},[1143,9433,9434,9436,9438,9440,9442],{"class":1145,"line":1253},[1143,9435,1295],{"class":1294},[1143,9437,1165],{"class":1164},[1143,9439,1966],{"class":1300},[1143,9441,1304],{"class":1164},[1143,9443,2501],{"class":2500},[1143,9445,9446,9448,9450,9452,9454,9456,9458,9460],{"class":1145,"line":1267},[1143,9447,1295],{"class":1294},[1143,9449,1165],{"class":1164},[1143,9451,4560],{"class":1300},[1143,9453,1304],{"class":1164},[1143,9455,2596],{"class":1160},[1143,9457,1165],{"class":1164},[1143,9459,2601],{"class":1307},[1143,9461,1311],{"class":1164},[1143,9463,9464,9466,9468,9471,9473],{"class":1145,"line":1273},[1143,9465,1295],{"class":1294},[1143,9467,1165],{"class":1164},[1143,9469,9470],{"class":1300},"last_login",[1143,9472,1304],{"class":1164},[1143,9474,2821],{"class":2500},[1143,9476,9477],{"class":1145,"line":1291},[1143,9478,1270],{"class":1160},[1143,9480,9481,9483,9486,9488,9490,9492,9494,9496,9498,9500,9502,9504],{"class":1145,"line":1314},[1143,9482,1276],{"class":1235},[1143,9484,9485],{"class":1341}," authenticate",[1143,9487,1243],{"class":1164},[1143,9489,1286],{"class":1285},[1143,9491,1349],{"class":1164},[1143,9493,9386],{"class":1352},[1143,9495,1485],{"class":1164},[1143,9497,2848],{"class":1849},[1143,9499,1853],{"class":1164},[1143,9501,1856],{"class":1164},[1143,9503,2954],{"class":1849},[1143,9505,1380],{"class":1164},[1143,9507,9508,9510,9513],{"class":1145,"line":1331},[1143,9509,1366],{"class":1256},[1143,9511,9512],{"class":1260},"Authenticate user with business rules",[1143,9514,1264],{"class":1256},[1143,9516,9517,9519,9521,9523,9525,9527],{"class":1145,"line":1336},[1143,9518,1901],{"class":1156},[1143,9520,1905],{"class":1904},[1143,9522,1392],{"class":1294},[1143,9524,1165],{"class":1164},[1143,9526,1966],{"class":1300},[1143,9528,1380],{"class":1164},[1143,9530,9531,9533],{"class":1145,"line":1363},[1143,9532,1441],{"class":1156},[1143,9534,3905],{"class":2500},[1143,9536,9537],{"class":1145,"line":1374},[1143,9538,1946],{"class":1160},[1143,9540,9541,9543,9545,9547,9550,9552,9554,9556,9558,9560,9562],{"class":1145,"line":1383},[1143,9542,1999],{"class":1156},[1143,9544,1392],{"class":1294},[1143,9546,1165],{"class":1164},[1143,9548,9549],{"class":1307},"_verify_password",[1143,9551,1243],{"class":1164},[1143,9553,9429],{"class":1307},[1143,9555,1349],{"class":1164},[1143,9557,1392],{"class":1294},[1143,9559,1165],{"class":1164},[1143,9561,9415],{"class":1300},[1143,9563,1409],{"class":1164},[1143,9565,9566],{"class":1145,"line":1412},[1143,9567,1270],{"class":1160},[1143,9569,9570,9572,9575,9577,9579,9581,9584,9586,9588,9590,9593,9595,9597],{"class":1145,"line":1438},[1143,9571,1276],{"class":1235},[1143,9573,9574],{"class":1341}," change_password",[1143,9576,1243],{"class":1164},[1143,9578,1286],{"class":1285},[1143,9580,1349],{"class":1164},[1143,9582,9583],{"class":1352}," old_password",[1143,9585,1485],{"class":1164},[1143,9587,2848],{"class":1849},[1143,9589,1349],{"class":1164},[1143,9591,9592],{"class":1352}," new_password",[1143,9594,1485],{"class":1164},[1143,9596,2848],{"class":1849},[1143,9598,1250],{"class":1164},[1143,9600,9601,9603,9606],{"class":1145,"line":1454},[1143,9602,1366],{"class":1256},[1143,9604,9605],{"class":1260},"Change password with business validation",[1143,9607,1264],{"class":1256},[1143,9609,9610,9612,9614,9616,9618,9621,9623,9626],{"class":1145,"line":1465},[1143,9611,1901],{"class":1156},[1143,9613,1905],{"class":1904},[1143,9615,1392],{"class":1294},[1143,9617,1165],{"class":1164},[1143,9619,9620],{"class":1307},"authenticate",[1143,9622,1243],{"class":1164},[1143,9624,9625],{"class":1307},"old_password",[1143,9627,1250],{"class":1164},[1143,9629,9630,9632,9634,9636,9638,9641,9643],{"class":1145,"line":1511},[1143,9631,1916],{"class":1156},[1143,9633,4085],{"class":1849},[1143,9635,1243],{"class":1164},[1143,9637,1981],{"class":1475},[1143,9639,9640],{"class":1479},"Current password is incorrect",[1143,9642,1981],{"class":1475},[1143,9644,1409],{"class":1164},[1143,9646,9647],{"class":1145,"line":1516},[1143,9648,1946],{"class":1160},[1143,9650,9651,9653,9656,9658,9661,9663,9665,9668],{"class":1145,"line":1534},[1143,9652,1901],{"class":1156},[1143,9654,9655],{"class":1279}," len",[1143,9657,1243],{"class":1164},[1143,9659,9660],{"class":1307},"new_password",[1143,9662,1853],{"class":1164},[1143,9664,7960],{"class":1904},[1143,9666,9667],{"class":1505}," 8",[1143,9669,1380],{"class":1164},[1143,9671,9672,9674,9676,9678,9680,9683,9685],{"class":1145,"line":1544},[1143,9673,1916],{"class":1156},[1143,9675,4085],{"class":1849},[1143,9677,1243],{"class":1164},[1143,9679,1981],{"class":1475},[1143,9681,9682],{"class":1479},"Password must be at least 8 characters",[1143,9684,1981],{"class":1475},[1143,9686,1409],{"class":1164},[1143,9688,9689],{"class":1145,"line":1551},[1143,9690,1946],{"class":1160},[1143,9692,9693,9695,9697,9699,9701,9703,9705,9707,9709,9711],{"class":1145,"line":1581},[1143,9694,1295],{"class":1294},[1143,9696,1165],{"class":1164},[1143,9698,9415],{"class":1300},[1143,9700,1304],{"class":1164},[1143,9702,1392],{"class":1294},[1143,9704,1165],{"class":1164},[1143,9706,9424],{"class":1307},[1143,9708,1243],{"class":1164},[1143,9710,9660],{"class":1307},[1143,9712,1409],{"class":1164},[1143,9714,9715],{"class":1145,"line":1605},[1143,9716,1270],{"class":1160},[1143,9718,9719,9721,9724,9726,9728],{"class":1145,"line":1629},[1143,9720,1276],{"class":1235},[1143,9722,9723],{"class":1341}," deactivate",[1143,9725,1243],{"class":1164},[1143,9727,1286],{"class":1285},[1143,9729,1250],{"class":1164},[1143,9731,9732,9734,9737],{"class":1145,"line":1652},[1143,9733,1366],{"class":1256},[1143,9735,9736],{"class":1260},"Deactivate user account",[1143,9738,1264],{"class":1256},[1143,9740,9741,9743,9745,9747,9749],{"class":1145,"line":1668},[1143,9742,1295],{"class":1294},[1143,9744,1165],{"class":1164},[1143,9746,1966],{"class":1300},[1143,9748,1304],{"class":1164},[1143,9750,3905],{"class":2500},[1143,9752,9753],{"class":1145,"line":1704},[1143,9754,1270],{"class":1160},[1143,9756,9757,9759,9762,9764,9766],{"class":1145,"line":1709},[1143,9758,1276],{"class":1235},[1143,9760,9761],{"class":1341}," record_login",[1143,9763,1243],{"class":1164},[1143,9765,1286],{"class":1285},[1143,9767,1250],{"class":1164},[1143,9769,9770,9772,9775],{"class":1145,"line":1715},[1143,9771,1366],{"class":1256},[1143,9773,9774],{"class":1260},"Record successful login",[1143,9776,1264],{"class":1256},[1143,9778,9779,9781,9783,9785,9787,9789,9791,9793],{"class":1145,"line":1735},[1143,9780,1295],{"class":1294},[1143,9782,1165],{"class":1164},[1143,9784,9470],{"class":1300},[1143,9786,1304],{"class":1164},[1143,9788,2596],{"class":1160},[1143,9790,1165],{"class":1164},[1143,9792,2601],{"class":1307},[1143,9794,1311],{"class":1164},[1143,9796,9797],{"class":1145,"line":1750},[1143,9798,1270],{"class":1160},[1143,9800,9801,9803,9806,9808,9810,9812,9814,9816,9818,9820,9822,9824],{"class":1145,"line":1767},[1143,9802,1276],{"class":1235},[1143,9804,9805],{"class":1341}," _hash_password",[1143,9807,1243],{"class":1164},[1143,9809,1286],{"class":1285},[1143,9811,1349],{"class":1164},[1143,9813,9386],{"class":1352},[1143,9815,1485],{"class":1164},[1143,9817,2848],{"class":1849},[1143,9819,1853],{"class":1164},[1143,9821,1856],{"class":1164},[1143,9823,2848],{"class":1849},[1143,9825,1380],{"class":1164},[1143,9827,9828,9830,9833],{"class":1145,"line":1772},[1143,9829,1366],{"class":1256},[1143,9831,9832],{"class":1260},"Hash password using secure algorithm",[1143,9834,1264],{"class":1256},[1143,9836,9837,9840],{"class":1145,"line":1781},[1143,9838,9839],{"class":1156},"        import",[1143,9841,9842],{"class":1160}," bcrypt\n",[1143,9844,9845,9847,9850,9852,9855,9857,9859,9861,9864,9866,9868,9871,9873,9875,9877,9879,9882,9885,9888,9890,9892,9894,9896],{"class":1145,"line":1791},[1143,9846,1999],{"class":1156},[1143,9848,9849],{"class":1160}," bcrypt",[1143,9851,1165],{"class":1164},[1143,9853,9854],{"class":1307},"hashpw",[1143,9856,1243],{"class":1164},[1143,9858,9429],{"class":1307},[1143,9860,1165],{"class":1164},[1143,9862,9863],{"class":1307},"encode",[1143,9865,1243],{"class":1164},[1143,9867,1476],{"class":1475},[1143,9869,9870],{"class":1479},"utf-8",[1143,9872,1476],{"class":1475},[1143,9874,5193],{"class":1164},[1143,9876,9849],{"class":1307},[1143,9878,1165],{"class":1164},[1143,9880,9881],{"class":1307},"gensalt",[1143,9883,9884],{"class":1164},"()).",[1143,9886,9887],{"class":1307},"decode",[1143,9889,1243],{"class":1164},[1143,9891,1476],{"class":1475},[1143,9893,9870],{"class":1479},[1143,9895,1476],{"class":1475},[1143,9897,1409],{"class":1164},[1143,9899,9900],{"class":1145,"line":1796},[1143,9901,1270],{"class":1160},[1143,9903,9904,9906,9909,9911,9913,9915,9917,9919,9921,9923,9926,9928,9930,9932,9934,9936],{"class":1145,"line":1809},[1143,9905,1276],{"class":1235},[1143,9907,9908],{"class":1341}," _verify_password",[1143,9910,1243],{"class":1164},[1143,9912,1286],{"class":1285},[1143,9914,1349],{"class":1164},[1143,9916,9386],{"class":1352},[1143,9918,1485],{"class":1164},[1143,9920,2848],{"class":1849},[1143,9922,1349],{"class":1164},[1143,9924,9925],{"class":1352}," hash",[1143,9927,1485],{"class":1164},[1143,9929,2848],{"class":1849},[1143,9931,1853],{"class":1164},[1143,9933,1856],{"class":1164},[1143,9935,2954],{"class":1849},[1143,9937,1380],{"class":1164},[1143,9939,9940,9942,9945],{"class":1145,"line":1826},[1143,9941,1366],{"class":1256},[1143,9943,9944],{"class":1260},"Verify password against hash",[1143,9946,1264],{"class":1256},[1143,9948,9949,9951],{"class":1145,"line":1831},[1143,9950,9839],{"class":1156},[1143,9952,9842],{"class":1160},[1143,9954,9955,9957,9959,9961,9964,9966,9968,9970,9972,9974,9976,9978,9980,9982,9984,9986,9988,9990,9992,9994,9996],{"class":1145,"line":1863},[1143,9956,1999],{"class":1156},[1143,9958,9849],{"class":1160},[1143,9960,1165],{"class":1164},[1143,9962,9963],{"class":1307},"checkpw",[1143,9965,1243],{"class":1164},[1143,9967,9429],{"class":1307},[1143,9969,1165],{"class":1164},[1143,9971,9863],{"class":1307},[1143,9973,1243],{"class":1164},[1143,9975,1476],{"class":1475},[1143,9977,9870],{"class":1479},[1143,9979,1476],{"class":1475},[1143,9981,5193],{"class":1164},[1143,9983,9925],{"class":1279},[1143,9985,1165],{"class":1164},[1143,9987,9863],{"class":1307},[1143,9989,1243],{"class":1164},[1143,9991,1476],{"class":1475},[1143,9993,9870],{"class":1479},[1143,9995,1476],{"class":1475},[1143,9997,4785],{"class":1164},[1143,9999,10000],{"class":1145,"line":1873},[1143,10001,1229],{"emptyLinePlaceholder":1228},[1143,10003,10004],{"class":1145,"line":1898},[1143,10005,10006],{"class":1149},"# Use Cases (Application layer) - Application business rules\n",[1143,10008,10009,10011,10013,10015,10017,10019],{"class":1145,"line":1913},[1143,10010,1157],{"class":1156},[1143,10012,4273],{"class":1160},[1143,10014,1171],{"class":1156},[1143,10016,4278],{"class":1294},[1143,10018,1349],{"class":1164},[1143,10020,4283],{"class":1160},[1143,10022,10023],{"class":1145,"line":1943},[1143,10024,1229],{"emptyLinePlaceholder":1228},[1143,10026,10027,10029,10032,10034,10036],{"class":1145,"line":1949},[1143,10028,1236],{"class":1235},[1143,10030,10031],{"class":1239}," UserRepository",[1143,10033,1243],{"class":1164},[1143,10035,5284],{"class":1294},[1143,10037,1250],{"class":1164},[1143,10039,10040,10042,10045],{"class":1145,"line":1955},[1143,10041,1257],{"class":1256},[1143,10043,10044],{"class":1260},"Abstract repository for user persistence",[1143,10046,1264],{"class":1256},[1143,10048,10049],{"class":1145,"line":1971},[1143,10050,1270],{"class":1160},[1143,10052,10053,10055],{"class":1145,"line":1991},[1143,10054,2013],{"class":1164},[1143,10056,5306],{"class":1341},[1143,10058,10059,10061,10063,10065,10067,10069,10072,10074,10076,10078,10080,10082],{"class":1145,"line":1996},[1143,10060,1276],{"class":1235},[1143,10062,3286],{"class":1341},[1143,10064,1243],{"class":1164},[1143,10066,1286],{"class":1285},[1143,10068,1349],{"class":1164},[1143,10070,10071],{"class":1352}," user",[1143,10073,1485],{"class":1164},[1143,10075,9347],{"class":1160},[1143,10077,1853],{"class":1164},[1143,10079,1856],{"class":1164},[1143,10081,9347],{"class":1160},[1143,10083,1380],{"class":1164},[1143,10085,10086],{"class":1145,"line":2005},[1143,10087,5338],{"class":1156},[1143,10089,10090],{"class":1145,"line":2010},[1143,10091,1270],{"class":1160},[1143,10093,10094,10096],{"class":1145,"line":2024},[1143,10095,2013],{"class":1164},[1143,10097,5306],{"class":1341},[1143,10099,10100,10102,10105,10107,10109,10111,10113,10115,10117,10119,10121,10123,10125,10128],{"class":1145,"line":2054},[1143,10101,1276],{"class":1235},[1143,10103,10104],{"class":1341}," get_by_email",[1143,10106,1243],{"class":1164},[1143,10108,1286],{"class":1285},[1143,10110,1349],{"class":1164},[1143,10112,9377],{"class":1352},[1143,10114,1485],{"class":1164},[1143,10116,2848],{"class":1849},[1143,10118,1853],{"class":1164},[1143,10120,1856],{"class":1164},[1143,10122,2653],{"class":1160},[1143,10124,2090],{"class":1164},[1143,10126,10127],{"class":1160},"User",[1143,10129,2742],{"class":1164},[1143,10131,10132],{"class":1145,"line":2064},[1143,10133,5338],{"class":1156},[1143,10135,10136],{"class":1145,"line":2070},[1143,10137,1270],{"class":1160},[1143,10139,10140,10142],{"class":1145,"line":2103},[1143,10141,2013],{"class":1164},[1143,10143,5306],{"class":1341},[1143,10145,10146,10148,10150,10152,10154,10156,10159,10161,10163,10165,10167,10169,10171,10173],{"class":1145,"line":2122},[1143,10147,1276],{"class":1235},[1143,10149,2716],{"class":1341},[1143,10151,1243],{"class":1164},[1143,10153,1286],{"class":1285},[1143,10155,1349],{"class":1164},[1143,10157,10158],{"class":1352}," user_id",[1143,10160,1485],{"class":1164},[1143,10162,1850],{"class":1849},[1143,10164,1853],{"class":1164},[1143,10166,1856],{"class":1164},[1143,10168,2653],{"class":1160},[1143,10170,2090],{"class":1164},[1143,10172,10127],{"class":1160},[1143,10174,2742],{"class":1164},[1143,10176,10177],{"class":1145,"line":2127},[1143,10178,5338],{"class":1156},[1143,10180,10181],{"class":1145,"line":2169},[1143,10182,1229],{"emptyLinePlaceholder":1228},[1143,10184,10185,10187,10190,10192,10194],{"class":1145,"line":2186},[1143,10186,1236],{"class":1235},[1143,10188,10189],{"class":1239}," EmailService",[1143,10191,1243],{"class":1164},[1143,10193,5284],{"class":1294},[1143,10195,1250],{"class":1164},[1143,10197,10198,10200,10203],{"class":1145,"line":2204},[1143,10199,1257],{"class":1256},[1143,10201,10202],{"class":1260},"Abstract service for email operations",[1143,10204,1264],{"class":1256},[1143,10206,10207],{"class":1145,"line":2209},[1143,10208,1270],{"class":1160},[1143,10210,10211,10213],{"class":1145,"line":2215},[1143,10212,2013],{"class":1164},[1143,10214,5306],{"class":1341},[1143,10216,10217,10219,10222,10224,10226,10228,10230,10232,10234,10236,10238,10240],{"class":1145,"line":2227},[1143,10218,1276],{"class":1235},[1143,10220,10221],{"class":1341}," send_welcome_email",[1143,10223,1243],{"class":1164},[1143,10225,1286],{"class":1285},[1143,10227,1349],{"class":1164},[1143,10229,10071],{"class":1352},[1143,10231,1485],{"class":1164},[1143,10233,9347],{"class":1160},[1143,10235,1853],{"class":1164},[1143,10237,1856],{"class":1164},[1143,10239,2954],{"class":1849},[1143,10241,1380],{"class":1164},[1143,10243,10244],{"class":1145,"line":2248},[1143,10245,5338],{"class":1156},[1143,10247,10248],{"class":1145,"line":2269},[1143,10249,1270],{"class":1160},[1143,10251,10252,10254],{"class":1145,"line":2290},[1143,10253,2013],{"class":1164},[1143,10255,5306],{"class":1341},[1143,10257,10258,10260,10263,10265,10267,10269,10271,10273,10275,10277,10280,10282,10284,10286,10288,10290],{"class":1145,"line":2301},[1143,10259,1276],{"class":1235},[1143,10261,10262],{"class":1341}," send_password_reset_email",[1143,10264,1243],{"class":1164},[1143,10266,1286],{"class":1285},[1143,10268,1349],{"class":1164},[1143,10270,10071],{"class":1352},[1143,10272,1485],{"class":1164},[1143,10274,9347],{"class":1160},[1143,10276,1349],{"class":1164},[1143,10278,10279],{"class":1352}," reset_token",[1143,10281,1485],{"class":1164},[1143,10283,2848],{"class":1849},[1143,10285,1853],{"class":1164},[1143,10287,1856],{"class":1164},[1143,10289,2954],{"class":1849},[1143,10291,1380],{"class":1164},[1143,10293,10294],{"class":1145,"line":2307},[1143,10295,5338],{"class":1156},[1143,10297,10298],{"class":1145,"line":2312},[1143,10299,1229],{"emptyLinePlaceholder":1228},[1143,10301,10302,10304,10307],{"class":1145,"line":2318},[1143,10303,1236],{"class":1235},[1143,10305,10306],{"class":1239}," RegisterUserUseCase",[1143,10308,1380],{"class":1164},[1143,10310,10311,10313,10316],{"class":1145,"line":2331},[1143,10312,1257],{"class":1256},[1143,10314,10315],{"class":1260},"Use case for user registration",[1143,10317,1264],{"class":1256},[1143,10319,10320],{"class":1145,"line":2343},[1143,10321,1270],{"class":1160},[1143,10323,10324,10326,10328,10330,10332,10334,10337,10339,10341,10343,10346,10348,10350],{"class":1145,"line":2348},[1143,10325,1276],{"class":1235},[1143,10327,1280],{"class":1279},[1143,10329,1243],{"class":1164},[1143,10331,1286],{"class":1285},[1143,10333,1349],{"class":1164},[1143,10335,10336],{"class":1352}," user_repo",[1143,10338,1485],{"class":1164},[1143,10340,10031],{"class":1160},[1143,10342,1349],{"class":1164},[1143,10344,10345],{"class":1352}," email_service",[1143,10347,1485],{"class":1164},[1143,10349,10189],{"class":1160},[1143,10351,1250],{"class":1164},[1143,10353,10354,10356,10358,10361,10363],{"class":1145,"line":2370},[1143,10355,1295],{"class":1294},[1143,10357,1165],{"class":1164},[1143,10359,10360],{"class":1300},"user_repo",[1143,10362,1304],{"class":1164},[1143,10364,10365],{"class":1160}," user_repo\n",[1143,10367,10368,10370,10372,10375,10377],{"class":1145,"line":2375},[1143,10369,1295],{"class":1294},[1143,10371,1165],{"class":1164},[1143,10373,10374],{"class":1300},"email_service",[1143,10376,1304],{"class":1164},[1143,10378,10379],{"class":1160}," email_service\n",[1143,10381,10382],{"class":1145,"line":2413},[1143,10383,1270],{"class":1160},[1143,10385,10386,10388,10391,10393,10395,10397,10399,10401,10403,10405,10407,10409,10411,10413,10415,10417],{"class":1145,"line":2423},[1143,10387,1276],{"class":1235},[1143,10389,10390],{"class":1341}," execute",[1143,10392,1243],{"class":1164},[1143,10394,1286],{"class":1285},[1143,10396,1349],{"class":1164},[1143,10398,9377],{"class":1352},[1143,10400,1485],{"class":1164},[1143,10402,2848],{"class":1849},[1143,10404,1349],{"class":1164},[1143,10406,9386],{"class":1352},[1143,10408,1485],{"class":1164},[1143,10410,2848],{"class":1849},[1143,10412,1853],{"class":1164},[1143,10414,1856],{"class":1164},[1143,10416,9347],{"class":1160},[1143,10418,1380],{"class":1164},[1143,10420,10421,10423,10426],{"class":1145,"line":2442},[1143,10422,1366],{"class":1256},[1143,10424,10425],{"class":1260},"Execute user registration use case",[1143,10427,1264],{"class":1256},[1143,10429,10430],{"class":1145,"line":2447},[1143,10431,10432],{"class":1149},"        # Validate input\n",[1143,10434,10435,10437,10439,10442,10444,10446,10448,10450,10452,10454,10456],{"class":1145,"line":2453},[1143,10436,1901],{"class":1156},[1143,10438,1905],{"class":1904},[1143,10440,10441],{"class":1160}," email ",[1143,10443,7948],{"class":1904},[1143,10445,1488],{"class":1475},[1143,10447,4329],{"class":1479},[1143,10449,1476],{"class":1475},[1143,10451,1905],{"class":1904},[1143,10453,5053],{"class":1904},[1143,10455,9377],{"class":1160},[1143,10457,1380],{"class":1164},[1143,10459,10460,10462,10464,10466,10468,10471,10473],{"class":1145,"line":2487},[1143,10461,1916],{"class":1156},[1143,10463,4085],{"class":1849},[1143,10465,1243],{"class":1164},[1143,10467,1981],{"class":1475},[1143,10469,10470],{"class":1479},"Invalid email address",[1143,10472,1981],{"class":1475},[1143,10474,1409],{"class":1164},[1143,10476,10477],{"class":1145,"line":2504},[1143,10478,1946],{"class":1160},[1143,10480,10481],{"class":1145,"line":2509},[1143,10482,10483],{"class":1149},"        # Check if user already exists\n",[1143,10485,10486,10489,10491,10493,10495,10497,10499,10502,10504,10506],{"class":1145,"line":2515},[1143,10487,10488],{"class":1160},"        existing_user ",[1143,10490,1389],{"class":1164},[1143,10492,1392],{"class":1294},[1143,10494,1165],{"class":1164},[1143,10496,10360],{"class":1300},[1143,10498,1165],{"class":1164},[1143,10500,10501],{"class":1307},"get_by_email",[1143,10503,1243],{"class":1164},[1143,10505,9401],{"class":1307},[1143,10507,1409],{"class":1164},[1143,10509,10510,10512,10515],{"class":1145,"line":2547},[1143,10511,1901],{"class":1156},[1143,10513,10514],{"class":1160}," existing_user",[1143,10516,1380],{"class":1164},[1143,10518,10519,10521,10523,10525,10527,10530,10532],{"class":1145,"line":2565},[1143,10520,1916],{"class":1156},[1143,10522,4085],{"class":1849},[1143,10524,1243],{"class":1164},[1143,10526,1981],{"class":1475},[1143,10528,10529],{"class":1479},"User already exists",[1143,10531,1981],{"class":1475},[1143,10533,1409],{"class":1164},[1143,10535,10536],{"class":1145,"line":2570},[1143,10537,1946],{"class":1160},[1143,10539,10540],{"class":1145,"line":2584},[1143,10541,10542],{"class":1149},"        # Create user entity\n",[1143,10544,10545,10548,10550,10552,10554,10556,10558,10560],{"class":1145,"line":2606},[1143,10546,10547],{"class":1160},"        user ",[1143,10549,1389],{"class":1164},[1143,10551,9347],{"class":1307},[1143,10553,1243],{"class":1164},[1143,10555,9401],{"class":1307},[1143,10557,1349],{"class":1164},[1143,10559,9386],{"class":1307},[1143,10561,1409],{"class":1164},[1143,10563,10564],{"class":1145,"line":2611},[1143,10565,1946],{"class":1160},[1143,10567,10568],{"class":1145,"line":2632},[1143,10569,10570],{"class":1149},"        # Save user\n",[1143,10572,10573,10576,10578,10580,10582,10584,10586,10588,10590,10592],{"class":1145,"line":2637},[1143,10574,10575],{"class":1160},"        saved_user ",[1143,10577,1389],{"class":1164},[1143,10579,1392],{"class":1294},[1143,10581,1165],{"class":1164},[1143,10583,10360],{"class":1300},[1143,10585,1165],{"class":1164},[1143,10587,2361],{"class":1307},[1143,10589,1243],{"class":1164},[1143,10591,9167],{"class":1307},[1143,10593,1409],{"class":1164},[1143,10595,10596],{"class":1145,"line":2643},[1143,10597,1946],{"class":1160},[1143,10599,10600],{"class":1145,"line":2661},[1143,10601,10602],{"class":1149},"        # Send welcome email\n",[1143,10604,10605,10607,10609,10611,10613,10616,10618,10621],{"class":1145,"line":2682},[1143,10606,1295],{"class":1294},[1143,10608,1165],{"class":1164},[1143,10610,10374],{"class":1300},[1143,10612,1165],{"class":1164},[1143,10614,10615],{"class":1307},"send_welcome_email",[1143,10617,1243],{"class":1164},[1143,10619,10620],{"class":1307},"saved_user",[1143,10622,1409],{"class":1164},[1143,10624,10625],{"class":1145,"line":2687},[1143,10626,1946],{"class":1160},[1143,10628,10629,10631],{"class":1145,"line":2696},[1143,10630,1999],{"class":1156},[1143,10632,10633],{"class":1160}," saved_user\n",[1143,10635,10636],{"class":1145,"line":2706},[1143,10637,1229],{"emptyLinePlaceholder":1228},[1143,10639,10640,10642,10645],{"class":1145,"line":2711},[1143,10641,1236],{"class":1235},[1143,10643,10644],{"class":1239}," AuthenticateUserUseCase",[1143,10646,1380],{"class":1164},[1143,10648,10649,10651,10654],{"class":1145,"line":2745},[1143,10650,1257],{"class":1256},[1143,10652,10653],{"class":1260},"Use case for user authentication",[1143,10655,1264],{"class":1256},[1143,10657,10658],{"class":1145,"line":2755},[1143,10659,1270],{"class":1160},[1143,10661,10662,10664,10666,10668,10670,10672,10674,10676,10678],{"class":1145,"line":2762},[1143,10663,1276],{"class":1235},[1143,10665,1280],{"class":1279},[1143,10667,1243],{"class":1164},[1143,10669,1286],{"class":1285},[1143,10671,1349],{"class":1164},[1143,10673,10336],{"class":1352},[1143,10675,1485],{"class":1164},[1143,10677,10031],{"class":1160},[1143,10679,1250],{"class":1164},[1143,10681,10682,10684,10686,10688,10690],{"class":1145,"line":2802},[1143,10683,1295],{"class":1294},[1143,10685,1165],{"class":1164},[1143,10687,10360],{"class":1300},[1143,10689,1304],{"class":1164},[1143,10691,10365],{"class":1160},[1143,10693,10694],{"class":1145,"line":2816},[1143,10695,1270],{"class":1160},[1143,10697,10698,10700,10702,10704,10706,10708,10710,10712,10714,10716,10718,10720,10722,10724,10726,10728,10730,10732],{"class":1145,"line":2824},[1143,10699,1276],{"class":1235},[1143,10701,10390],{"class":1341},[1143,10703,1243],{"class":1164},[1143,10705,1286],{"class":1285},[1143,10707,1349],{"class":1164},[1143,10709,9377],{"class":1352},[1143,10711,1485],{"class":1164},[1143,10713,2848],{"class":1849},[1143,10715,1349],{"class":1164},[1143,10717,9386],{"class":1352},[1143,10719,1485],{"class":1164},[1143,10721,2848],{"class":1849},[1143,10723,1853],{"class":1164},[1143,10725,1856],{"class":1164},[1143,10727,2653],{"class":1160},[1143,10729,2090],{"class":1164},[1143,10731,10127],{"class":1160},[1143,10733,2742],{"class":1164},[1143,10735,10736,10738,10741],{"class":1145,"line":2829},[1143,10737,1366],{"class":1256},[1143,10739,10740],{"class":1260},"Execute user authentication use case",[1143,10742,1264],{"class":1256},[1143,10744,10745,10747,10749,10751,10753,10755,10757,10759,10761,10763],{"class":1145,"line":2863},[1143,10746,10547],{"class":1160},[1143,10748,1389],{"class":1164},[1143,10750,1392],{"class":1294},[1143,10752,1165],{"class":1164},[1143,10754,10360],{"class":1300},[1143,10756,1165],{"class":1164},[1143,10758,10501],{"class":1307},[1143,10760,1243],{"class":1164},[1143,10762,9401],{"class":1307},[1143,10764,1409],{"class":1164},[1143,10766,10767,10769,10771,10773],{"class":1145,"line":2873},[1143,10768,1901],{"class":1156},[1143,10770,1905],{"class":1904},[1143,10772,10071],{"class":1160},[1143,10774,1380],{"class":1164},[1143,10776,10777,10779],{"class":1145,"line":2880},[1143,10778,1441],{"class":1156},[1143,10780,2821],{"class":2500},[1143,10782,10783],{"class":1145,"line":2905},[1143,10784,1946],{"class":1160},[1143,10786,10787,10789,10791,10793,10795,10797,10799],{"class":1145,"line":2918},[1143,10788,1901],{"class":1156},[1143,10790,10071],{"class":1160},[1143,10792,1165],{"class":1164},[1143,10794,9620],{"class":1307},[1143,10796,1243],{"class":1164},[1143,10798,9429],{"class":1307},[1143,10800,1250],{"class":1164},[1143,10802,10803,10806,10808,10811],{"class":1145,"line":2925},[1143,10804,10805],{"class":1160},"            user",[1143,10807,1165],{"class":1164},[1143,10809,10810],{"class":1307},"record_login",[1143,10812,1311],{"class":1164},[1143,10814,10815,10817,10819,10821,10823,10825,10827,10829],{"class":1145,"line":2930},[1143,10816,3762],{"class":1294},[1143,10818,1165],{"class":1164},[1143,10820,10360],{"class":1300},[1143,10822,1165],{"class":1164},[1143,10824,2361],{"class":1307},[1143,10826,1243],{"class":1164},[1143,10828,9167],{"class":1307},[1143,10830,1409],{"class":1164},[1143,10832,10833,10835],{"class":1145,"line":2959},[1143,10834,1441],{"class":1156},[1143,10836,10837],{"class":1160}," user\n",[1143,10839,10840],{"class":1145,"line":2969},[1143,10841,1946],{"class":1160},[1143,10843,10844,10846],{"class":1145,"line":3000},[1143,10845,1999],{"class":1156},[1143,10847,2821],{"class":2500},[1143,10849,10850],{"class":1145,"line":3005},[1143,10851,1229],{"emptyLinePlaceholder":1228},[1143,10853,10854],{"class":1145,"line":3039},[1143,10855,10856],{"class":1149},"# Interface Adapters (Controllers, Presenters, Gateways)\n",[1143,10858,10859,10861,10864],{"class":1145,"line":3049},[1143,10860,1236],{"class":1235},[1143,10862,10863],{"class":1239}," UserController",[1143,10865,1380],{"class":1164},[1143,10867,10868,10870,10873],{"class":1145,"line":3059},[1143,10869,1257],{"class":1256},[1143,10871,10872],{"class":1260},"Controller for user-related HTTP requests",[1143,10874,1264],{"class":1256},[1143,10876,10877],{"class":1145,"line":3093},[1143,10878,1270],{"class":1160},[1143,10880,10881,10883,10885,10887,10889,10891,10894,10896,10898],{"class":1145,"line":3111},[1143,10882,1276],{"class":1235},[1143,10884,1280],{"class":1279},[1143,10886,1243],{"class":1164},[1143,10888,1286],{"class":1285},[1143,10890,1349],{"class":1164},[1143,10892,10893],{"class":1352}," register_use_case",[1143,10895,1485],{"class":1164},[1143,10897,10306],{"class":1160},[1143,10899,5748],{"class":1164},[1143,10901,10902,10905,10907,10909],{"class":1145,"line":3129},[1143,10903,10904],{"class":1352},"                 auth_use_case",[1143,10906,1485],{"class":1164},[1143,10908,10644],{"class":1160},[1143,10910,1250],{"class":1164},[1143,10912,10913,10915,10917,10920,10922],{"class":1145,"line":3134},[1143,10914,1295],{"class":1294},[1143,10916,1165],{"class":1164},[1143,10918,10919],{"class":1300},"register_use_case",[1143,10921,1304],{"class":1164},[1143,10923,10924],{"class":1160}," register_use_case\n",[1143,10926,10927,10929,10931,10934,10936],{"class":1145,"line":3139},[1143,10928,1295],{"class":1294},[1143,10930,1165],{"class":1164},[1143,10932,10933],{"class":1300},"auth_use_case",[1143,10935,1304],{"class":1164},[1143,10937,10938],{"class":1160}," auth_use_case\n",[1143,10940,10941],{"class":1145,"line":3172},[1143,10942,1270],{"class":1160},[1143,10944,10945,10947,10949,10951,10953,10955,10957],{"class":1145,"line":3182},[1143,10946,1276],{"class":1235},[1143,10948,8727],{"class":1341},[1143,10950,1243],{"class":1164},[1143,10952,1286],{"class":1285},[1143,10954,1349],{"class":1164},[1143,10956,1353],{"class":1352},[1143,10958,1250],{"class":1164},[1143,10960,10961,10963,10966],{"class":1145,"line":3191},[1143,10962,1366],{"class":1256},[1143,10964,10965],{"class":1260},"Handle user registration request",[1143,10967,1264],{"class":1256},[1143,10969,10970,10972],{"class":1145,"line":3206},[1143,10971,1377],{"class":1156},[1143,10973,1380],{"class":1164},[1143,10975,10976,10979,10981,10983,10985,10987,10989,10991,10993,10995,10997,10999],{"class":1145,"line":3242},[1143,10977,10978],{"class":1160},"            email ",[1143,10980,1389],{"class":1164},[1143,10982,1353],{"class":1160},[1143,10984,1165],{"class":1164},[1143,10986,1449],{"class":1300},[1143,10988,1165],{"class":1164},[1143,10990,2145],{"class":1307},[1143,10992,1243],{"class":1164},[1143,10994,1476],{"class":1475},[1143,10996,9401],{"class":1479},[1143,10998,1476],{"class":1475},[1143,11000,1409],{"class":1164},[1143,11002,11003,11006,11008,11010,11012,11014,11016,11018,11020,11022,11024,11026],{"class":1145,"line":3253},[1143,11004,11005],{"class":1160},"            password ",[1143,11007,1389],{"class":1164},[1143,11009,1353],{"class":1160},[1143,11011,1165],{"class":1164},[1143,11013,1449],{"class":1300},[1143,11015,1165],{"class":1164},[1143,11017,2145],{"class":1307},[1143,11019,1243],{"class":1164},[1143,11021,1476],{"class":1475},[1143,11023,9429],{"class":1479},[1143,11025,1476],{"class":1475},[1143,11027,1409],{"class":1164},[1143,11029,11030],{"class":1145,"line":3271},[1143,11031,6279],{"class":1160},[1143,11033,11034,11037,11039,11041,11043,11045,11047,11049,11051,11053,11055,11057],{"class":1145,"line":3276},[1143,11035,11036],{"class":1160},"            user ",[1143,11038,1389],{"class":1164},[1143,11040,1392],{"class":1294},[1143,11042,1165],{"class":1164},[1143,11044,10919],{"class":1300},[1143,11046,1165],{"class":1164},[1143,11048,8055],{"class":1307},[1143,11050,1243],{"class":1164},[1143,11052,9401],{"class":1307},[1143,11054,1349],{"class":1164},[1143,11056,9386],{"class":1307},[1143,11058,1409],{"class":1164},[1143,11060,11061],{"class":1145,"line":3281},[1143,11062,6279],{"class":1160},[1143,11064,11065,11067,11069],{"class":1145,"line":3309},[1143,11066,1441],{"class":1156},[1143,11068,1444],{"class":1307},[1143,11070,9253],{"class":1164},[1143,11072,11073,11076,11078,11080,11082,11084,11086,11088],{"class":1145,"line":3319},[1143,11074,11075],{"class":1475},"                '",[1143,11077,2150],{"class":1479},[1143,11079,1476],{"class":1475},[1143,11081,1485],{"class":1164},[1143,11083,10071],{"class":1307},[1143,11085,1165],{"class":1164},[1143,11087,2150],{"class":1300},[1143,11089,5748],{"class":1164},[1143,11091,11092,11094,11096,11098,11100,11102,11104,11106],{"class":1145,"line":3330},[1143,11093,11075],{"class":1475},[1143,11095,9401],{"class":1479},[1143,11097,1476],{"class":1475},[1143,11099,1485],{"class":1164},[1143,11101,10071],{"class":1307},[1143,11103,1165],{"class":1164},[1143,11105,9401],{"class":1300},[1143,11107,5748],{"class":1164},[1143,11109,11110,11112,11114,11116,11118,11120,11122,11124,11126,11129],{"class":1145,"line":3337},[1143,11111,11075],{"class":1475},[1143,11113,4560],{"class":1479},[1143,11115,1476],{"class":1475},[1143,11117,1485],{"class":1164},[1143,11119,10071],{"class":1307},[1143,11121,1165],{"class":1164},[1143,11123,4560],{"class":1300},[1143,11125,1165],{"class":1164},[1143,11127,11128],{"class":1307},"isoformat",[1143,11130,1311],{"class":1164},[1143,11132,11133,11136,11138,11140,11142],{"class":1145,"line":3342},[1143,11134,11135],{"class":1164},"            },",[1143,11137,1500],{"class":1499},[1143,11139,1389],{"class":1164},[1143,11141,1647],{"class":1505},[1143,11143,1409],{"class":1164},[1143,11145,11146],{"class":1145,"line":3371},[1143,11147,6279],{"class":1160},[1143,11149,11150,11152,11154,11156,11158],{"class":1145,"line":3381},[1143,11151,1457],{"class":1156},[1143,11153,4085],{"class":1849},[1143,11155,7690],{"class":1156},[1143,11157,1663],{"class":1160},[1143,11159,1380],{"class":1164},[1143,11161,11162,11164,11166,11168,11170,11172,11174,11176,11178,11180,11182,11185,11187,11189,11191],{"class":1145,"line":3393},[1143,11163,1441],{"class":1156},[1143,11165,1444],{"class":1307},[1143,11167,1472],{"class":1164},[1143,11169,1476],{"class":1475},[1143,11171,1480],{"class":1479},[1143,11173,1476],{"class":1475},[1143,11175,1485],{"class":1164},[1143,11177,2848],{"class":1849},[1143,11179,1243],{"class":1164},[1143,11181,7716],{"class":1307},[1143,11183,11184],{"class":1164},")},",[1143,11186,1500],{"class":1499},[1143,11188,1389],{"class":1164},[1143,11190,1699],{"class":1505},[1143,11192,1409],{"class":1164},[1143,11194,11195],{"class":1145,"line":3398},[1143,11196,1270],{"class":1160},[1143,11198,11199,11201,11204,11206,11208,11210,11212],{"class":1145,"line":3404},[1143,11200,1276],{"class":1235},[1143,11202,11203],{"class":1341}," login",[1143,11205,1243],{"class":1164},[1143,11207,1286],{"class":1285},[1143,11209,1349],{"class":1164},[1143,11211,1353],{"class":1352},[1143,11213,1250],{"class":1164},[1143,11215,11216,11218,11221],{"class":1145,"line":3420},[1143,11217,1366],{"class":1256},[1143,11219,11220],{"class":1260},"Handle user login request",[1143,11222,1264],{"class":1256},[1143,11224,11225,11228,11230,11232,11234,11236,11238,11240,11242,11244,11246,11248],{"class":1145,"line":3433},[1143,11226,11227],{"class":1160},"        email ",[1143,11229,1389],{"class":1164},[1143,11231,1353],{"class":1160},[1143,11233,1165],{"class":1164},[1143,11235,1449],{"class":1300},[1143,11237,1165],{"class":1164},[1143,11239,2145],{"class":1307},[1143,11241,1243],{"class":1164},[1143,11243,1476],{"class":1475},[1143,11245,9401],{"class":1479},[1143,11247,1476],{"class":1475},[1143,11249,1409],{"class":1164},[1143,11251,11252,11255,11257,11259,11261,11263,11265,11267,11269,11271,11273,11275],{"class":1145,"line":3438},[1143,11253,11254],{"class":1160},"        password ",[1143,11256,1389],{"class":1164},[1143,11258,1353],{"class":1160},[1143,11260,1165],{"class":1164},[1143,11262,1449],{"class":1300},[1143,11264,1165],{"class":1164},[1143,11266,2145],{"class":1307},[1143,11268,1243],{"class":1164},[1143,11270,1476],{"class":1475},[1143,11272,9429],{"class":1479},[1143,11274,1476],{"class":1475},[1143,11276,1409],{"class":1164},[1143,11278,11279],{"class":1145,"line":3457},[1143,11280,1946],{"class":1160},[1143,11282,11283,11285,11287,11289,11291,11293,11295,11297,11299,11301,11303,11305],{"class":1145,"line":3467},[1143,11284,10547],{"class":1160},[1143,11286,1389],{"class":1164},[1143,11288,1392],{"class":1294},[1143,11290,1165],{"class":1164},[1143,11292,10933],{"class":1300},[1143,11294,1165],{"class":1164},[1143,11296,8055],{"class":1307},[1143,11298,1243],{"class":1164},[1143,11300,9401],{"class":1307},[1143,11302,1349],{"class":1164},[1143,11304,9386],{"class":1307},[1143,11306,1409],{"class":1164},[1143,11308,11309],{"class":1145,"line":3472},[1143,11310,1946],{"class":1160},[1143,11312,11313,11315,11317],{"class":1145,"line":3509},[1143,11314,1901],{"class":1156},[1143,11316,10071],{"class":1160},[1143,11318,1380],{"class":1164},[1143,11320,11321],{"class":1145,"line":3526},[1143,11322,11323],{"class":1149},"            # Create session or JWT token\n",[1143,11325,11326,11329,11331,11334,11336,11338,11341,11343,11345,11347,11349,11351],{"class":1145,"line":3563},[1143,11327,11328],{"class":1160},"            request",[1143,11330,1165],{"class":1164},[1143,11332,11333],{"class":1300},"session",[1143,11335,2090],{"class":1164},[1143,11337,1476],{"class":1475},[1143,11339,11340],{"class":1479},"user_id",[1143,11342,1476],{"class":1475},[1143,11344,4503],{"class":1164},[1143,11346,1304],{"class":1164},[1143,11348,10071],{"class":1160},[1143,11350,1165],{"class":1164},[1143,11352,6727],{"class":1300},[1143,11354,11355],{"class":1145,"line":3604},[1143,11356,6279],{"class":1160},[1143,11358,11359,11361,11363],{"class":1145,"line":3630},[1143,11360,1441],{"class":1156},[1143,11362,1444],{"class":1307},[1143,11364,9253],{"class":1164},[1143,11366,11367,11369,11371,11373,11375,11377,11379,11381],{"class":1145,"line":3655},[1143,11368,11075],{"class":1475},[1143,11370,2150],{"class":1479},[1143,11372,1476],{"class":1475},[1143,11374,1485],{"class":1164},[1143,11376,10071],{"class":1307},[1143,11378,1165],{"class":1164},[1143,11380,2150],{"class":1300},[1143,11382,5748],{"class":1164},[1143,11384,11385,11387,11389,11391,11393,11395,11397,11399],{"class":1145,"line":3681},[1143,11386,11075],{"class":1475},[1143,11388,9401],{"class":1479},[1143,11390,1476],{"class":1475},[1143,11392,1485],{"class":1164},[1143,11394,10071],{"class":1307},[1143,11396,1165],{"class":1164},[1143,11398,9401],{"class":1300},[1143,11400,5748],{"class":1164},[1143,11402,11403,11405,11407,11409,11411,11413,11415,11417,11419,11421,11423,11425,11427,11429,11431,11434],{"class":1145,"line":3706},[1143,11404,11075],{"class":1475},[1143,11406,9470],{"class":1479},[1143,11408,1476],{"class":1475},[1143,11410,1485],{"class":1164},[1143,11412,10071],{"class":1307},[1143,11414,1165],{"class":1164},[1143,11416,9470],{"class":1300},[1143,11418,1165],{"class":1164},[1143,11420,11128],{"class":1307},[1143,11422,5248],{"class":1164},[1143,11424,4868],{"class":1156},[1143,11426,10071],{"class":1307},[1143,11428,1165],{"class":1164},[1143,11430,9470],{"class":1300},[1143,11432,11433],{"class":1156}," else",[1143,11435,2821],{"class":2500},[1143,11437,11438],{"class":1145,"line":3711},[1143,11439,11440],{"class":1164},"            })\n",[1143,11442,11443,11445],{"class":1145,"line":3725},[1143,11444,4751],{"class":1156},[1143,11446,1380],{"class":1164},[1143,11448,11449,11451,11453,11455,11457,11459,11461,11463,11465,11468,11470,11472,11474,11476,11479],{"class":1145,"line":3735},[1143,11450,1441],{"class":1156},[1143,11452,1444],{"class":1307},[1143,11454,1472],{"class":1164},[1143,11456,1476],{"class":1475},[1143,11458,1480],{"class":1479},[1143,11460,1476],{"class":1475},[1143,11462,1485],{"class":1164},[1143,11464,1488],{"class":1475},[1143,11466,11467],{"class":1479},"Invalid credentials",[1143,11469,1476],{"class":1475},[1143,11471,1496],{"class":1164},[1143,11473,1500],{"class":1499},[1143,11475,1389],{"class":1164},[1143,11477,11478],{"class":1505},"401",[1143,11480,1409],{"class":1164},[1143,11482,11483],{"class":1145,"line":3741},[1143,11484,1229],{"emptyLinePlaceholder":1228},[1143,11486,11487],{"class":1145,"line":3759},[1143,11488,11489],{"class":1149},"# Frameworks and Drivers (Outermost layer)\n",[1143,11491,11492,11494,11497,11499,11502],{"class":1145,"line":3788},[1143,11493,1236],{"class":1235},[1143,11495,11496],{"class":1239}," DjangoUserRepository",[1143,11498,1243],{"class":1164},[1143,11500,11501],{"class":1246},"UserRepository",[1143,11503,1250],{"class":1164},[1143,11505,11506,11508,11511],{"class":1145,"line":3793},[1143,11507,1257],{"class":1256},[1143,11509,11510],{"class":1260},"Django implementation of user repository",[1143,11512,1264],{"class":1256},[1143,11514,11515],{"class":1145,"line":3799},[1143,11516,1270],{"class":1160},[1143,11518,11519,11521,11523,11525,11527,11529,11531,11533,11535,11537,11539,11541],{"class":1145,"line":3817},[1143,11520,1276],{"class":1235},[1143,11522,3286],{"class":1341},[1143,11524,1243],{"class":1164},[1143,11526,1286],{"class":1285},[1143,11528,1349],{"class":1164},[1143,11530,10071],{"class":1352},[1143,11532,1485],{"class":1164},[1143,11534,9347],{"class":1160},[1143,11536,1853],{"class":1164},[1143,11538,1856],{"class":1164},[1143,11540,9347],{"class":1160},[1143,11542,1380],{"class":1164},[1143,11544,11545,11547,11550],{"class":1145,"line":3859},[1143,11546,1366],{"class":1256},[1143,11548,11549],{"class":1260},"Save user using Django ORM",[1143,11551,1264],{"class":1256},[1143,11553,11554,11556,11559,11561,11563,11565,11567,11569,11571,11573,11575,11577,11579,11581],{"class":1145,"line":3864},[1143,11555,1901],{"class":1156},[1143,11557,11558],{"class":1279}," hasattr",[1143,11560,1243],{"class":1164},[1143,11562,9167],{"class":1307},[1143,11564,1349],{"class":1164},[1143,11566,1488],{"class":1475},[1143,11568,2150],{"class":1479},[1143,11570,1476],{"class":1475},[1143,11572,1853],{"class":1164},[1143,11574,2470],{"class":1904},[1143,11576,10071],{"class":1160},[1143,11578,1165],{"class":1164},[1143,11580,2150],{"class":1300},[1143,11582,1380],{"class":1164},[1143,11584,11585],{"class":1145,"line":3878},[1143,11586,11587],{"class":1149},"            # Update existing user\n",[1143,11589,11590,11593,11595,11598,11600,11602,11604,11606,11608,11610,11612,11614,11616,11618],{"class":1145,"line":3888},[1143,11591,11592],{"class":1160},"            django_user ",[1143,11594,1389],{"class":1164},[1143,11596,11597],{"class":1160}," UserModel",[1143,11599,1165],{"class":1164},[1143,11601,2140],{"class":1300},[1143,11603,1165],{"class":1164},[1143,11605,2145],{"class":1307},[1143,11607,1243],{"class":1164},[1143,11609,2150],{"class":1499},[1143,11611,1389],{"class":1164},[1143,11613,9167],{"class":1307},[1143,11615,1165],{"class":1164},[1143,11617,2150],{"class":1300},[1143,11619,1409],{"class":1164},[1143,11621,11622,11625,11627,11629,11631,11633,11635],{"class":1145,"line":3894},[1143,11623,11624],{"class":1160},"            django_user",[1143,11626,1165],{"class":1164},[1143,11628,9401],{"class":1300},[1143,11630,1304],{"class":1164},[1143,11632,10071],{"class":1160},[1143,11634,1165],{"class":1164},[1143,11636,11637],{"class":1300},"email\n",[1143,11639,11640,11642,11644,11646,11648,11650,11652],{"class":1145,"line":3908},[1143,11641,11624],{"class":1160},[1143,11643,1165],{"class":1164},[1143,11645,9415],{"class":1300},[1143,11647,1304],{"class":1164},[1143,11649,10071],{"class":1160},[1143,11651,1165],{"class":1164},[1143,11653,11654],{"class":1300},"password_hash\n",[1143,11656,11657,11659,11661,11663,11665,11667,11669],{"class":1145,"line":3913},[1143,11658,11624],{"class":1160},[1143,11660,1165],{"class":1164},[1143,11662,1966],{"class":1300},[1143,11664,1304],{"class":1164},[1143,11666,10071],{"class":1160},[1143,11668,1165],{"class":1164},[1143,11670,11671],{"class":1300},"is_active\n",[1143,11673,11674,11676,11678,11680,11682,11684,11686],{"class":1145,"line":3919},[1143,11675,11624],{"class":1160},[1143,11677,1165],{"class":1164},[1143,11679,9470],{"class":1300},[1143,11681,1304],{"class":1164},[1143,11683,10071],{"class":1160},[1143,11685,1165],{"class":1164},[1143,11687,11688],{"class":1300},"last_login\n",[1143,11690,11691,11693,11695,11697],{"class":1145,"line":3936},[1143,11692,11624],{"class":1160},[1143,11694,1165],{"class":1164},[1143,11696,2361],{"class":1307},[1143,11698,1311],{"class":1164},[1143,11700,11701,11703],{"class":1145,"line":3949},[1143,11702,4751],{"class":1156},[1143,11704,1380],{"class":1164},[1143,11706,11707],{"class":1145,"line":3954},[1143,11708,11709],{"class":1149},"            # Create new user\n",[1143,11711,11712,11714,11716,11718,11720,11722,11724,11726],{"class":1145,"line":3974},[1143,11713,11592],{"class":1160},[1143,11715,1389],{"class":1164},[1143,11717,11597],{"class":1160},[1143,11719,1165],{"class":1164},[1143,11721,2140],{"class":1300},[1143,11723,1165],{"class":1164},[1143,11725,6658],{"class":1307},[1143,11727,2224],{"class":1164},[1143,11729,11730,11733,11735,11737,11739,11741],{"class":1145,"line":3984},[1143,11731,11732],{"class":1499},"                email",[1143,11734,1389],{"class":1164},[1143,11736,9167],{"class":1307},[1143,11738,1165],{"class":1164},[1143,11740,9401],{"class":1300},[1143,11742,5748],{"class":1164},[1143,11744,11745,11748,11750,11752,11754,11756],{"class":1145,"line":3990},[1143,11746,11747],{"class":1499},"                password_hash",[1143,11749,1389],{"class":1164},[1143,11751,9167],{"class":1307},[1143,11753,1165],{"class":1164},[1143,11755,9415],{"class":1300},[1143,11757,5748],{"class":1164},[1143,11759,11760,11762,11764,11766,11768,11770],{"class":1145,"line":4010},[1143,11761,3245],{"class":1499},[1143,11763,1389],{"class":1164},[1143,11765,9167],{"class":1307},[1143,11767,1165],{"class":1164},[1143,11769,1966],{"class":1300},[1143,11771,5748],{"class":1164},[1143,11773,11774,11777,11779,11781,11783],{"class":1145,"line":4015},[1143,11775,11776],{"class":1499},"                last_login",[1143,11778,1389],{"class":1164},[1143,11780,9167],{"class":1307},[1143,11782,1165],{"class":1164},[1143,11784,11688],{"class":1300},[1143,11786,11787],{"class":1145,"line":4044},[1143,11788,6003],{"class":1164},[1143,11790,11791,11793,11795,11797,11799,11802,11804],{"class":1145,"line":4054},[1143,11792,10805],{"class":1160},[1143,11794,1165],{"class":1164},[1143,11796,2150],{"class":1300},[1143,11798,1304],{"class":1164},[1143,11800,11801],{"class":1160}," django_user",[1143,11803,1165],{"class":1164},[1143,11805,6727],{"class":1300},[1143,11807,11808],{"class":1145,"line":4080},[1143,11809,1946],{"class":1160},[1143,11811,11812,11814],{"class":1145,"line":4105},[1143,11813,1999],{"class":1156},[1143,11815,10837],{"class":1160},[1143,11817,11818],{"class":1145,"line":4110},[1143,11819,1270],{"class":1160},[1143,11821,11822,11824,11826,11828,11830,11832,11834,11836,11838,11840,11842,11844,11846,11848],{"class":1145,"line":4139},[1143,11823,1276],{"class":1235},[1143,11825,10104],{"class":1341},[1143,11827,1243],{"class":1164},[1143,11829,1286],{"class":1285},[1143,11831,1349],{"class":1164},[1143,11833,9377],{"class":1352},[1143,11835,1485],{"class":1164},[1143,11837,2848],{"class":1849},[1143,11839,1853],{"class":1164},[1143,11841,1856],{"class":1164},[1143,11843,2653],{"class":1160},[1143,11845,2090],{"class":1164},[1143,11847,10127],{"class":1160},[1143,11849,2742],{"class":1164},[1143,11851,11852,11854,11857],{"class":1145,"line":4156},[1143,11853,1366],{"class":1256},[1143,11855,11856],{"class":1260},"Get user by email",[1143,11858,1264],{"class":1256},[1143,11860,11861,11863],{"class":1145,"line":4161},[1143,11862,1377],{"class":1156},[1143,11864,1380],{"class":1164},[1143,11866,11867,11869,11871,11873,11875,11877,11879,11881,11883,11885,11887,11889],{"class":1145,"line":4172},[1143,11868,11592],{"class":1160},[1143,11870,1389],{"class":1164},[1143,11872,11597],{"class":1160},[1143,11874,1165],{"class":1164},[1143,11876,2140],{"class":1300},[1143,11878,1165],{"class":1164},[1143,11880,2145],{"class":1307},[1143,11882,1243],{"class":1164},[1143,11884,9401],{"class":1499},[1143,11886,1389],{"class":1164},[1143,11888,9401],{"class":1307},[1143,11890,1409],{"class":1164},[1143,11892,11893,11895,11897,11899,11902,11904,11907],{"class":1145,"line":4183},[1143,11894,1441],{"class":1156},[1143,11896,1392],{"class":1294},[1143,11898,1165],{"class":1164},[1143,11900,11901],{"class":1307},"_to_entity",[1143,11903,1243],{"class":1164},[1143,11905,11906],{"class":1307},"django_user",[1143,11908,1409],{"class":1164},[1143,11910,11911,11913,11915,11917,11919],{"class":1145,"line":4219},[1143,11912,1457],{"class":1156},[1143,11914,11597],{"class":1160},[1143,11916,1165],{"class":1164},[1143,11918,2811],{"class":1300},[1143,11920,1380],{"class":1164},[1143,11922,11923,11925],{"class":1145,"line":4242},[1143,11924,1441],{"class":1156},[1143,11926,2821],{"class":2500},[1143,11928,11929],{"class":1145,"line":6730},[1143,11930,1270],{"class":1160},[1143,11932,11933,11935,11937,11939,11941,11943,11945,11947,11949,11951,11953,11955,11957,11959],{"class":1145,"line":6748},[1143,11934,1276],{"class":1235},[1143,11936,2716],{"class":1341},[1143,11938,1243],{"class":1164},[1143,11940,1286],{"class":1285},[1143,11942,1349],{"class":1164},[1143,11944,10158],{"class":1352},[1143,11946,1485],{"class":1164},[1143,11948,1850],{"class":1849},[1143,11950,1853],{"class":1164},[1143,11952,1856],{"class":1164},[1143,11954,2653],{"class":1160},[1143,11956,2090],{"class":1164},[1143,11958,10127],{"class":1160},[1143,11960,2742],{"class":1164},[1143,11962,11963,11965,11968],{"class":1145,"line":6753},[1143,11964,1366],{"class":1256},[1143,11966,11967],{"class":1260},"Get user by ID",[1143,11969,1264],{"class":1256},[1143,11971,11972,11974],{"class":1145,"line":6759},[1143,11973,1377],{"class":1156},[1143,11975,1380],{"class":1164},[1143,11977,11978,11980,11982,11984,11986,11988,11990,11992,11994,11996,11998,12000],{"class":1145,"line":6777},[1143,11979,11592],{"class":1160},[1143,11981,1389],{"class":1164},[1143,11983,11597],{"class":1160},[1143,11985,1165],{"class":1164},[1143,11987,2140],{"class":1300},[1143,11989,1165],{"class":1164},[1143,11991,2145],{"class":1307},[1143,11993,1243],{"class":1164},[1143,11995,2150],{"class":1499},[1143,11997,1389],{"class":1164},[1143,11999,11340],{"class":1307},[1143,12001,1409],{"class":1164},[1143,12003,12004,12006,12008,12010,12012,12014,12016],{"class":1145,"line":6793},[1143,12005,1441],{"class":1156},[1143,12007,1392],{"class":1294},[1143,12009,1165],{"class":1164},[1143,12011,11901],{"class":1307},[1143,12013,1243],{"class":1164},[1143,12015,11906],{"class":1307},[1143,12017,1409],{"class":1164},[1143,12019,12020,12022,12024,12026,12028],{"class":1145,"line":6806},[1143,12021,1457],{"class":1156},[1143,12023,11597],{"class":1160},[1143,12025,1165],{"class":1164},[1143,12027,2811],{"class":1300},[1143,12029,1380],{"class":1164},[1143,12031,12032,12034],{"class":1145,"line":6822},[1143,12033,1441],{"class":1156},[1143,12035,2821],{"class":2500},[1143,12037,12038],{"class":1145,"line":6838},[1143,12039,1270],{"class":1160},[1143,12041,12042,12044,12047,12049,12051,12053,12055,12057,12059,12061],{"class":1145,"line":6852},[1143,12043,1276],{"class":1235},[1143,12045,12046],{"class":1341}," _to_entity",[1143,12048,1243],{"class":1164},[1143,12050,1286],{"class":1285},[1143,12052,1349],{"class":1164},[1143,12054,11801],{"class":1352},[1143,12056,1853],{"class":1164},[1143,12058,1856],{"class":1164},[1143,12060,9347],{"class":1160},[1143,12062,1380],{"class":1164},[1143,12064,12065,12067,12070],{"class":1145,"line":6857},[1143,12066,1366],{"class":1256},[1143,12068,12069],{"class":1260},"Convert Django model to entity",[1143,12071,1264],{"class":1256},[1143,12073,12074,12076,12078,12080,12082,12085,12087,12089,12091],{"class":1145,"line":6862},[1143,12075,10547],{"class":1160},[1143,12077,1389],{"class":1164},[1143,12079,9347],{"class":1160},[1143,12081,1165],{"class":1164},[1143,12083,12084],{"class":1279},"__new__",[1143,12086,1243],{"class":1164},[1143,12088,10127],{"class":1307},[1143,12090,1853],{"class":1164},[1143,12092,12093],{"class":1149},"  # Create without calling __init__\n",[1143,12095,12096,12099,12101,12103,12105,12107,12109],{"class":1145,"line":6870},[1143,12097,12098],{"class":1160},"        user",[1143,12100,1165],{"class":1164},[1143,12102,2150],{"class":1300},[1143,12104,1304],{"class":1164},[1143,12106,11801],{"class":1160},[1143,12108,1165],{"class":1164},[1143,12110,6727],{"class":1300},[1143,12112,12113,12115,12117,12119,12121,12123,12125],{"class":1145,"line":6875},[1143,12114,12098],{"class":1160},[1143,12116,1165],{"class":1164},[1143,12118,9401],{"class":1300},[1143,12120,1304],{"class":1164},[1143,12122,11801],{"class":1160},[1143,12124,1165],{"class":1164},[1143,12126,11637],{"class":1300},[1143,12128,12129,12131,12133,12135,12137,12139,12141],{"class":1145,"line":6906},[1143,12130,12098],{"class":1160},[1143,12132,1165],{"class":1164},[1143,12134,9415],{"class":1300},[1143,12136,1304],{"class":1164},[1143,12138,11801],{"class":1160},[1143,12140,1165],{"class":1164},[1143,12142,11654],{"class":1300},[1143,12144,12145,12147,12149,12151,12153,12155,12157],{"class":1145,"line":6916},[1143,12146,12098],{"class":1160},[1143,12148,1165],{"class":1164},[1143,12150,1966],{"class":1300},[1143,12152,1304],{"class":1164},[1143,12154,11801],{"class":1160},[1143,12156,1165],{"class":1164},[1143,12158,11671],{"class":1300},[1143,12160,12161,12163,12165,12167,12169,12171,12173],{"class":1145,"line":6923},[1143,12162,12098],{"class":1160},[1143,12164,1165],{"class":1164},[1143,12166,4560],{"class":1300},[1143,12168,1304],{"class":1164},[1143,12170,11801],{"class":1160},[1143,12172,1165],{"class":1164},[1143,12174,6745],{"class":1300},[1143,12176,12177,12179,12181,12183,12185,12187,12189],{"class":1145,"line":6964},[1143,12178,12098],{"class":1160},[1143,12180,1165],{"class":1164},[1143,12182,9470],{"class":1300},[1143,12184,1304],{"class":1164},[1143,12186,11801],{"class":1160},[1143,12188,1165],{"class":1164},[1143,12190,11688],{"class":1300},[1143,12192,12193,12195],{"class":1145,"line":6982},[1143,12194,1999],{"class":1156},[1143,12196,10837],{"class":1160},[1143,12198,12199],{"class":1145,"line":6995},[1143,12200,1229],{"emptyLinePlaceholder":1228},[1143,12202,12203,12205,12207,12209,12211,12213,12215],{"class":1145,"line":7002},[1143,12204,1236],{"class":1235},[1143,12206,11597],{"class":1239},[1143,12208,1243],{"class":1164},[1143,12210,3447],{"class":1246},[1143,12212,1165],{"class":1164},[1143,12214,3452],{"class":1246},[1143,12216,1250],{"class":1164},[1143,12218,12219,12221,12224],{"class":1145,"line":7007},[1143,12220,1257],{"class":1256},[1143,12222,12223],{"class":1260},"Django model for user persistence",[1143,12225,1264],{"class":1256},[1143,12227,12228],{"class":1145,"line":7038},[1143,12229,1270],{"class":1160},[1143,12231,12232,12235,12237,12239,12241,12244,12246,12249,12251,12253],{"class":1145,"line":7048},[1143,12233,12234],{"class":1160},"    email ",[1143,12236,1389],{"class":1164},[1143,12238,3480],{"class":1160},[1143,12240,1165],{"class":1164},[1143,12242,12243],{"class":1307},"EmailField",[1143,12245,1243],{"class":1164},[1143,12247,12248],{"class":1499},"unique",[1143,12250,1389],{"class":1164},[1143,12252,3088],{"class":2500},[1143,12254,1409],{"class":1164},[1143,12256,12257,12260,12262,12264,12266,12268,12270,12272,12274,12277],{"class":1145,"line":7068},[1143,12258,12259],{"class":1160},"    password_hash ",[1143,12261,1389],{"class":1164},[1143,12263,3480],{"class":1160},[1143,12265,1165],{"class":1164},[1143,12267,3485],{"class":1307},[1143,12269,1243],{"class":1164},[1143,12271,3490],{"class":1499},[1143,12273,1389],{"class":1164},[1143,12275,12276],{"class":1505},"128",[1143,12278,1409],{"class":1164},[1143,12280,12281,12283,12285,12287,12289,12291,12293,12295,12297,12299],{"class":1145,"line":7079},[1143,12282,3607],{"class":1160},[1143,12284,1389],{"class":1164},[1143,12286,3480],{"class":1160},[1143,12288,1165],{"class":1164},[1143,12290,3616],{"class":1307},[1143,12292,1243],{"class":1164},[1143,12294,3621],{"class":1499},[1143,12296,1389],{"class":1164},[1143,12298,3088],{"class":2500},[1143,12300,1409],{"class":1164},[1143,12302,12303,12305,12307,12309,12311,12313,12315,12317,12319,12321],{"class":1145,"line":7110},[1143,12304,3658],{"class":1160},[1143,12306,1389],{"class":1164},[1143,12308,3480],{"class":1160},[1143,12310,1165],{"class":1164},[1143,12312,3667],{"class":1307},[1143,12314,1243],{"class":1164},[1143,12316,3672],{"class":1499},[1143,12318,1389],{"class":1164},[1143,12320,3088],{"class":2500},[1143,12322,1409],{"class":1164},[1143,12324,12325,12328,12330,12332,12334,12336,12338,12341,12343,12345,12347,12350,12352,12354],{"class":1145,"line":7115},[1143,12326,12327],{"class":1160},"    last_login ",[1143,12329,1389],{"class":1164},[1143,12331,3480],{"class":1160},[1143,12333,1165],{"class":1164},[1143,12335,3667],{"class":1307},[1143,12337,1243],{"class":1164},[1143,12339,12340],{"class":1499},"null",[1143,12342,1389],{"class":1164},[1143,12344,3088],{"class":2500},[1143,12346,1349],{"class":1164},[1143,12348,12349],{"class":1499}," blank",[1143,12351,1389],{"class":1164},[1143,12353,3088],{"class":2500},[1143,12355,1409],{"class":1164},[1143,12357,12358],{"class":1145,"line":7146},[1143,12359,1229],{"emptyLinePlaceholder":1228},[1143,12361,12362],{"class":1145,"line":7151},[1143,12363,12364],{"class":1149},"# Dependency injection and configuration\n",[1143,12366,12367,12369,12372],{"class":1145,"line":7175},[1143,12368,8844],{"class":1235},[1143,12370,12371],{"class":1341}," create_user_controller",[1143,12373,6505],{"class":1164},[1143,12375,12376,12378,12381],{"class":1145,"line":7185},[1143,12377,1257],{"class":1256},[1143,12379,12380],{"class":1260},"Factory function for user controller",[1143,12382,1264],{"class":1256},[1143,12384,12385,12388,12390,12392],{"class":1145,"line":7204},[1143,12386,12387],{"class":1160},"    user_repo ",[1143,12389,1389],{"class":1164},[1143,12391,11496],{"class":1307},[1143,12393,1311],{"class":1164},[1143,12395,12396,12399,12401,12404],{"class":1145,"line":7222},[1143,12397,12398],{"class":1160},"    email_service ",[1143,12400,1389],{"class":1164},[1143,12402,12403],{"class":1307}," DjangoEmailService",[1143,12405,1311],{"class":1164},[1143,12407,12408],{"class":1145,"line":7239},[1143,12409,1270],{"class":1160},[1143,12411,12412,12415,12417,12419,12421,12423,12425,12427],{"class":1145,"line":7256},[1143,12413,12414],{"class":1160},"    register_use_case ",[1143,12416,1389],{"class":1164},[1143,12418,10306],{"class":1307},[1143,12420,1243],{"class":1164},[1143,12422,10360],{"class":1307},[1143,12424,1349],{"class":1164},[1143,12426,10345],{"class":1307},[1143,12428,1409],{"class":1164},[1143,12430,12431,12434,12436,12438,12440,12442],{"class":1145,"line":7273},[1143,12432,12433],{"class":1160},"    auth_use_case ",[1143,12435,1389],{"class":1164},[1143,12437,10644],{"class":1307},[1143,12439,1243],{"class":1164},[1143,12441,10360],{"class":1307},[1143,12443,1409],{"class":1164},[1143,12445,12446],{"class":1145,"line":7278},[1143,12447,1270],{"class":1160},[1143,12449,12450,12452,12454,12456,12458,12460,12463],{"class":1145,"line":7284},[1143,12451,8989],{"class":1156},[1143,12453,10863],{"class":1307},[1143,12455,1243],{"class":1164},[1143,12457,10919],{"class":1307},[1143,12459,1349],{"class":1164},[1143,12461,12462],{"class":1307}," auth_use_case",[1143,12464,1409],{"class":1164},[1143,12466,12467],{"class":1145,"line":7306},[1143,12468,1229],{"emptyLinePlaceholder":1228},[1143,12470,12471],{"class":1145,"line":7325},[1143,12472,12473],{"class":1149},"# Django views using clean architecture\n",[1143,12475,12476,12478,12481,12483,12485],{"class":1145,"line":7341},[1143,12477,8844],{"class":1235},[1143,12479,12480],{"class":1341}," register_view",[1143,12482,1243],{"class":1164},[1143,12484,1571],{"class":1352},[1143,12486,1250],{"class":1164},[1143,12488,12489,12491,12494],{"class":1145,"line":7356},[1143,12490,1257],{"class":1256},[1143,12492,12493],{"class":1260},"Django view for user registration",[1143,12495,1264],{"class":1256},[1143,12497,12498,12501,12503,12505],{"class":1145,"line":7369},[1143,12499,12500],{"class":1160},"    controller ",[1143,12502,1389],{"class":1164},[1143,12504,12371],{"class":1307},[1143,12506,1311],{"class":1164},[1143,12508,12509,12511,12514,12516,12518,12520,12522],{"class":1145,"line":7375},[1143,12510,8989],{"class":1156},[1143,12512,12513],{"class":1160}," controller",[1143,12515,1165],{"class":1164},[1143,12517,8893],{"class":1307},[1143,12519,1243],{"class":1164},[1143,12521,1571],{"class":1307},[1143,12523,1409],{"class":1164},[1143,12525,12526],{"class":1145,"line":7380},[1143,12527,1229],{"emptyLinePlaceholder":1228},[1143,12529,12530,12532,12535,12537,12539],{"class":1145,"line":7387},[1143,12531,8844],{"class":1235},[1143,12533,12534],{"class":1341}," login_view",[1143,12536,1243],{"class":1164},[1143,12538,1571],{"class":1352},[1143,12540,1250],{"class":1164},[1143,12542,12543,12545,12548],{"class":1145,"line":7392},[1143,12544,1257],{"class":1256},[1143,12546,12547],{"class":1260},"Django view for user login",[1143,12549,1264],{"class":1256},[1143,12551,12552,12554,12556,12558],{"class":1145,"line":7407},[1143,12553,12500],{"class":1160},[1143,12555,1389],{"class":1164},[1143,12557,12371],{"class":1307},[1143,12559,1311],{"class":1164},[1143,12561,12562,12564,12566,12568,12571,12573,12575],{"class":1145,"line":7417},[1143,12563,8989],{"class":1156},[1143,12565,12513],{"class":1160},[1143,12567,1165],{"class":1164},[1143,12569,12570],{"class":1307},"login",[1143,12572,1243],{"class":1164},[1143,12574,1571],{"class":1307},[1143,12576,1409],{"class":1164},[1030,12578,12580],{"id":12579},"cqrs-command-query-responsibility-segregation","CQRS (Command Query Responsibility Segregation)",[1026,12582,12583],{},"CQRS separates read and write operations, allowing for optimized data models and improved scalability. This pattern is particularly useful for complex Django applications with different read and write requirements.",[1038,12585,12587],{"id":12586},"cqrs-implementation","CQRS Implementation",[1133,12589,12591],{"className":1135,"code":12590,"language":1137,"meta":1138,"style":1138},"# Commands - Write operations\nfrom dataclasses import dataclass\nfrom typing import Optional\nfrom abc import ABC, abstractmethod\n\n@dataclass\nclass CreateProductCommand:\n    \"\"\"Command for creating a product\"\"\"\n    name: str\n    description: str\n    price: Decimal\n    category_id: int\n    user_id: int\n\n@dataclass\nclass UpdateProductPriceCommand:\n    \"\"\"Command for updating product price\"\"\"\n    product_id: int\n    new_price: Decimal\n    user_id: int\n\n@dataclass\nclass DeactivateProductCommand:\n    \"\"\"Command for deactivating a product\"\"\"\n    product_id: int\n    reason: str\n    user_id: int\n\n# Command Handlers\nclass CommandHandler(ABC):\n    \"\"\"Abstract base for command handlers\"\"\"\n    \n    @abstractmethod\n    def handle(self, command) -> any:\n        pass\n\nclass CreateProductCommandHandler(CommandHandler):\n    \"\"\"Handler for product creation commands\"\"\"\n    \n    def __init__(self, product_repo: ProductRepository, \n                 event_store: EventStore):\n        self.product_repo = product_repo\n        self.event_store = event_store\n    \n    def handle(self, command: CreateProductCommand) -> int:\n        \"\"\"Handle product creation command\"\"\"\n        # Validate business rules\n        if self.product_repo.exists_by_name(command.name):\n            raise BusinessRuleError(\"Product name must be unique\")\n        \n        # Create product\n        product = Product(\n            name=command.name,\n            description=command.description,\n            price=command.price,\n            category_id=command.category_id\n        )\n        \n        # Save product\n        saved_product = self.product_repo.save(product)\n        \n        # Record event\n        event = ProductCreatedEvent(\n            product_id=saved_product.id,\n            name=command.name,\n            price=command.price,\n            created_by=command.user_id,\n            created_at=timezone.now()\n        )\n        self.event_store.append(event)\n        \n        return saved_product.id\n\nclass UpdateProductPriceCommandHandler(CommandHandler):\n    \"\"\"Handler for product price update commands\"\"\"\n    \n    def __init__(self, product_repo: ProductRepository,\n                 event_store: EventStore):\n        self.product_repo = product_repo\n        self.event_store = event_store\n    \n    def handle(self, command: UpdateProductPriceCommand) -> None:\n        \"\"\"Handle product price update command\"\"\"\n        product = self.product_repo.get_by_id(command.product_id)\n        if not product:\n            raise ValueError(\"Product not found\")\n        \n        old_price = product.price\n        \n        # Apply business rules\n        if command.new_price \u003C= 0:\n            raise BusinessRuleError(\"Price must be positive\")\n        \n        if command.new_price \u003C old_price * Decimal('0.5'):\n            raise BusinessRuleError(\"Cannot decrease price by more than 50%\")\n        \n        # Update price\n        product.price = command.new_price\n        self.product_repo.save(product)\n        \n        # Record event\n        event = ProductPriceUpdatedEvent(\n            product_id=product.id,\n            old_price=old_price,\n            new_price=command.new_price,\n            updated_by=command.user_id,\n            updated_at=timezone.now()\n        )\n        self.event_store.append(event)\n\n# Queries - Read operations\n@dataclass\nclass GetProductQuery:\n    \"\"\"Query for getting a single product\"\"\"\n    product_id: int\n\n@dataclass\nclass SearchProductsQuery:\n    \"\"\"Query for searching products\"\"\"\n    search_term: str\n    category_id: Optional[int] = None\n    min_price: Optional[Decimal] = None\n    max_price: Optional[Decimal] = None\n    page: int = 1\n    page_size: int = 20\n\n@dataclass\nclass GetProductStatsQuery:\n    \"\"\"Query for product statistics\"\"\"\n    product_id: int\n\n# Query Handlers\nclass QueryHandler(ABC):\n    \"\"\"Abstract base for query handlers\"\"\"\n    \n    @abstractmethod\n    def handle(self, query) -> any:\n        pass\n\nclass GetProductQueryHandler(QueryHandler):\n    \"\"\"Handler for single product queries\"\"\"\n    \n    def __init__(self, read_model_repo: ProductReadModelRepository):\n        self.read_model_repo = read_model_repo\n    \n    def handle(self, query: GetProductQuery) -> Optional[ProductReadModel]:\n        \"\"\"Handle get product query\"\"\"\n        return self.read_model_repo.get_by_id(query.product_id)\n\nclass SearchProductsQueryHandler(QueryHandler):\n    \"\"\"Handler for product search queries\"\"\"\n    \n    def __init__(self, read_model_repo: ProductReadModelRepository):\n        self.read_model_repo = read_model_repo\n    \n    def handle(self, query: SearchProductsQuery) -> dict:\n        \"\"\"Handle product search query\"\"\"\n        filters = {}\n        \n        if query.search_term:\n            filters['search_term'] = query.search_term\n        \n        if query.category_id:\n            filters['category_id'] = query.category_id\n        \n        if query.min_price:\n            filters['min_price'] = query.min_price\n        \n        if query.max_price:\n            filters['max_price'] = query.max_price\n        \n        products = self.read_model_repo.search(\n            filters=filters,\n            page=query.page,\n            page_size=query.page_size\n        )\n        \n        total_count = self.read_model_repo.count(filters)\n        \n        return {\n            'products': products,\n            'total_count': total_count,\n            'page': query.page,\n            'page_size': query.page_size,\n            'total_pages': (total_count + query.page_size - 1) // query.page_size\n        }\n\n# Read Models - Optimized for queries\nclass ProductReadModel:\n    \"\"\"Read model optimized for product queries\"\"\"\n    \n    def __init__(self, product_id: int, name: str, description: str,\n                 price: Decimal, category_name: str, is_active: bool,\n                 created_at: datetime, average_rating: Optional[Decimal] = None,\n                 review_count: int = 0, view_count: int = 0):\n        self.product_id = product_id\n        self.name = name\n        self.description = description\n        self.price = price\n        self.category_name = category_name\n        self.is_active = is_active\n        self.created_at = created_at\n        self.average_rating = average_rating\n        self.review_count = review_count\n        self.view_count = view_count\n\nclass ProductReadModelRepository:\n    \"\"\"Repository for product read models\"\"\"\n    \n    def get_by_id(self, product_id: int) -> Optional[ProductReadModel]:\n        \"\"\"Get product read model by ID\"\"\"\n        try:\n            # Use optimized read model table\n            data = ProductReadModelTable.objects.get(product_id=product_id)\n            return self._to_read_model(data)\n        except ProductReadModelTable.DoesNotExist:\n            return None\n    \n    def search(self, filters: dict, page: int, page_size: int) -> List[ProductReadModel]:\n        \"\"\"Search products with filters\"\"\"\n        queryset = ProductReadModelTable.objects.filter(is_active=True)\n        \n        if 'search_term' in filters:\n            queryset = queryset.filter(\n                Q(name__icontains=filters['search_term']) |\n                Q(description__icontains=filters['search_term'])\n            )\n        \n        if 'category_id' in filters:\n            queryset = queryset.filter(category_id=filters['category_id'])\n        \n        if 'min_price' in filters:\n            queryset = queryset.filter(price__gte=filters['min_price'])\n        \n        if 'max_price' in filters:\n            queryset = queryset.filter(price__lte=filters['max_price'])\n        \n        # Pagination\n        offset = (page - 1) * page_size\n        queryset = queryset[offset:offset + page_size]\n        \n        return [self._to_read_model(data) for data in queryset]\n    \n    def count(self, filters: dict) -> int:\n        \"\"\"Count products matching filters\"\"\"\n        # Similar filtering logic as search\n        queryset = ProductReadModelTable.objects.filter(is_active=True)\n        # Apply filters...\n        return queryset.count()\n    \n    def _to_read_model(self, data) -> ProductReadModel:\n        \"\"\"Convert table data to read model\"\"\"\n        return ProductReadModel(\n            product_id=data.product_id,\n            name=data.name,\n            description=data.description,\n            price=data.price,\n            category_name=data.category_name,\n            is_active=data.is_active,\n            created_at=data.created_at,\n            average_rating=data.average_rating,\n            review_count=data.review_count,\n            view_count=data.view_count\n        )\n\n# Read Model Table (Denormalized for performance)\nclass ProductReadModelTable(models.Model):\n    \"\"\"Denormalized table for product read operations\"\"\"\n    \n    product_id = models.IntegerField(unique=True, db_index=True)\n    name = models.CharField(max_length=200, db_index=True)\n    description = models.TextField()\n    price = models.DecimalField(max_digits=10, decimal_places=2, db_index=True)\n    category_id = models.IntegerField(db_index=True)\n    category_name = models.CharField(max_length=100)\n    is_active = models.BooleanField(default=True, db_index=True)\n    created_at = models.DateTimeField(db_index=True)\n    average_rating = models.DecimalField(max_digits=3, decimal_places=2, null=True)\n    review_count = models.IntegerField(default=0)\n    view_count = models.IntegerField(default=0)\n    \n    class Meta:\n        indexes = [\n            models.Index(fields=['category_id', 'is_active']),\n            models.Index(fields=['price', 'is_active']),\n            models.Index(fields=['name', 'is_active']),\n        ]\n\n# Event Store for CQRS\nclass Event:\n    \"\"\"Base class for domain events\"\"\"\n    \n    def __init__(self, event_type: str, aggregate_id: int, \n                 event_data: dict, occurred_at: datetime):\n        self.event_type = event_type\n        self.aggregate_id = aggregate_id\n        self.event_data = event_data\n        self.occurred_at = occurred_at\n\nclass EventStore:\n    \"\"\"Store for domain events\"\"\"\n    \n    def append(self, event: Event) -> None:\n        \"\"\"Append event to store\"\"\"\n        EventStoreTable.objects.create(\n            event_type=event.event_type,\n            aggregate_id=event.aggregate_id,\n            event_data=event.event_data,\n            occurred_at=event.occurred_at\n        )\n    \n    def get_events(self, aggregate_id: int) -> List[Event]:\n        \"\"\"Get all events for an aggregate\"\"\"\n        events = EventStoreTable.objects.filter(\n            aggregate_id=aggregate_id\n        ).order_by('occurred_at')\n        \n        return [\n            Event(\n                event_type=e.event_type,\n                aggregate_id=e.aggregate_id,\n                event_data=e.event_data,\n                occurred_at=e.occurred_at\n            )\n            for e in events\n        ]\n\nclass EventStoreTable(models.Model):\n    \"\"\"Table for storing domain events\"\"\"\n    \n    event_type = models.CharField(max_length=100)\n    aggregate_id = models.IntegerField(db_index=True)\n    event_data = models.JSONField()\n    occurred_at = models.DateTimeField(db_index=True)\n    \n    class Meta:\n        indexes = [\n            models.Index(fields=['aggregate_id', 'occurred_at']),\n            models.Index(fields=['event_type', 'occurred_at']),\n        ]\n\n# Command and Query Bus\nclass CommandBus:\n    \"\"\"Bus for dispatching commands to handlers\"\"\"\n    \n    def __init__(self):\n        self.handlers = {}\n    \n    def register_handler(self, command_type: type, handler: CommandHandler):\n        \"\"\"Register command handler\"\"\"\n        self.handlers[command_type] = handler\n    \n    def dispatch(self, command) -> any:\n        \"\"\"Dispatch command to appropriate handler\"\"\"\n        command_type = type(command)\n        handler = self.handlers.get(command_type)\n        \n        if not handler:\n            raise ValueError(f\"No handler registered for {command_type}\")\n        \n        return handler.handle(command)\n\nclass QueryBus:\n    \"\"\"Bus for dispatching queries to handlers\"\"\"\n    \n    def __init__(self):\n        self.handlers = {}\n    \n    def register_handler(self, query_type: type, handler: QueryHandler):\n        \"\"\"Register query handler\"\"\"\n        self.handlers[query_type] = handler\n    \n    def dispatch(self, query) -> any:\n        \"\"\"Dispatch query to appropriate handler\"\"\"\n        query_type = type(query)\n        handler = self.handlers.get(query_type)\n        \n        if not handler:\n            raise ValueError(f\"No handler registered for {query_type}\")\n        \n        return handler.handle(query)\n\n# Configuration\ndef configure_cqrs():\n    \"\"\"Configure CQRS command and query buses\"\"\"\n    # Command bus setup\n    command_bus = CommandBus()\n    \n    product_repo = DjangoProductRepository()\n    event_store = EventStore()\n    \n    command_bus.register_handler(\n        CreateProductCommand,\n        CreateProductCommandHandler(product_repo, event_store)\n    )\n    command_bus.register_handler(\n        UpdateProductPriceCommand,\n        UpdateProductPriceCommandHandler(product_repo, event_store)\n    )\n    \n    # Query bus setup\n    query_bus = QueryBus()\n    \n    read_model_repo = ProductReadModelRepository()\n    \n    query_bus.register_handler(\n        GetProductQuery,\n        GetProductQueryHandler(read_model_repo)\n    )\n    query_bus.register_handler(\n        SearchProductsQuery,\n        SearchProductsQueryHandler(read_model_repo)\n    )\n    \n    return command_bus, query_bus\n\n# Usage in views\ndef create_product_view(request):\n    \"\"\"View for creating products using CQRS\"\"\"\n    command_bus, _ = configure_cqrs()\n    \n    command = CreateProductCommand(\n        name=request.data['name'],\n        description=request.data['description'],\n        price=Decimal(request.data['price']),\n        category_id=request.data['category_id'],\n        user_id=request.user.id\n    )\n    \n    try:\n        product_id = command_bus.dispatch(command)\n        return JsonResponse({'product_id': product_id}, status=201)\n    except BusinessRuleError as e:\n        return JsonResponse({'error': str(e)}, status=400)\n\ndef search_products_view(request):\n    \"\"\"View for searching products using CQRS\"\"\"\n    _, query_bus = configure_cqrs()\n    \n    query = SearchProductsQuery(\n        search_term=request.GET.get('q', ''),\n        category_id=request.GET.get('category_id'),\n        min_price=request.GET.get('min_price'),\n        max_price=request.GET.get('max_price'),\n        page=int(request.GET.get('page', 1)),\n        page_size=int(request.GET.get('page_size', 20))\n    )\n    \n    result = query_bus.dispatch(query)\n    \n    return JsonResponse({\n        'products': [\n            {\n                'id': p.product_id,\n                'name': p.name,\n                'price': str(p.price),\n                'category': p.category_name,\n                'rating': str(p.average_rating) if p.average_rating else None,\n                'review_count': p.review_count\n            }\n            for p in result['products']\n        ],\n        'pagination': {\n            'total_count': result['total_count'],\n            'page': result['page'],\n            'page_size': result['page_size'],\n            'total_pages': result['total_pages']\n        }\n    })\n",[1140,12592,12593,12598,12608,12618,12632,12636,12642,12651,12660,12670,12679,12687,12696,12705,12709,12715,12724,12733,12741,12750,12758,12762,12768,12777,12786,12794,12803,12811,12815,12820,12833,12842,12846,12852,12877,12881,12885,12899,12908,12912,12935,12947,12960,12974,12978,13004,13013,13017,13042,13058,13062,13066,13076,13090,13104,13118,13132,13136,13140,13145,13168,13172,13177,13189,13205,13219,13233,13248,13264,13268,13287,13291,13302,13306,13319,13328,13332,13352,13362,13374,13386,13390,13416,13425,13451,13461,13477,13481,13494,13498,13502,13520,13536,13540,13570,13586,13590,13595,13612,13630,13634,13638,13649,13663,13675,13690,13705,13720,13724,13742,13746,13751,13757,13766,13775,13783,13787,13793,13802,13811,13820,13838,13857,13876,13890,13904,13908,13914,13923,13932,13940,13944,13949,13962,13971,13975,13981,14003,14007,14011,14025,14034,14038,14060,14074,14078,14109,14118,14142,14146,14159,14168,14172,14192,14204,14208,14234,14243,14252,14256,14269,14293,14297,14309,14331,14335,14348,14371,14375,14388,14411,14415,14435,14446,14462,14476,14480,14484,14508,14512,14519,14536,14552,14570,14589,14630,14635,14639,14644,14653,14662,14666,14703,14731,14762,14790,14803,14816,14829,14842,14856,14869,14882,14896,14910,14924,14928,14936,14945,14949,14979,14988,14994,14999,15026,15043,15055,15061,15065,15114,15123,15150,15154,15170,15186,15211,15233,15237,15241,15257,15287,15291,15307,15338,15342,15358,15389,15393,15398,15422,15446,15450,15479,15483,15510,15519,15524,15550,15555,15567,15571,15594,15603,15611,15625,15639,15653,15667,15682,15697,15711,15726,15741,15755,15759,15763,15768,15784,15793,15797,15828,15858,15872,15910,15934,15958,15988,16010,16051,16074,16097,16101,16109,16117,16147,16177,16207,16211,16215,16220,16229,16238,16242,16274,16294,16308,16322,16336,16350,16354,16362,16371,16375,16403,16412,16427,16442,16457,16472,16486,16490,16494,16526,16535,16555,16564,16580,16584,16590,16597,16612,16627,16642,16655,16659,16671,16675,16679,16695,16704,16708,16731,16754,16770,16793,16797,16805,16813,16843,16873,16877,16881,16886,16895,16904,16908,16920,16933,16937,16969,16978,16998,17002,17025,17034,17049,17072,17076,17086,17109,17113,17130,17134,17143,17152,17156,17168,17180,17184,17213,17222,17241,17245,17267,17276,17291,17313,17317,17327,17349,17353,17369,17373,17377,17386,17395,17400,17412,17417,17430,17442,17447,17460,17468,17485,17490,17501,17509,17525,17530,17535,17541,17553,17558,17570,17575,17587,17595,17607,17612,17623,17631,17643,17648,17653,17666,17671,17676,17690,17700,17716,17721,17733,17757,17781,17809,17833,17851,17856,17861,17869,17890,17919,17934,17967,17972,17986,17996,18013,18018,18030,18065,18092,18120,18148,18185,18222,18227,18232,18253,18258,18267,18280,18286,18306,18325,18348,18367,18405,18423,18429,18452,18458,18472,18495,18518,18541,18564,18569],{"__ignoreMap":1138},[1143,12594,12595],{"class":1145,"line":1146},[1143,12596,12597],{"class":1149},"# Commands - Write operations\n",[1143,12599,12600,12602,12604,12606],{"class":1145,"line":1153},[1143,12601,1157],{"class":1156},[1143,12603,4305],{"class":1160},[1143,12605,1171],{"class":1156},[1143,12607,4310],{"class":1160},[1143,12609,12610,12612,12614,12616],{"class":1145,"line":1177},[1143,12611,1157],{"class":1156},[1143,12613,2648],{"class":1160},[1143,12615,1171],{"class":1156},[1143,12617,4298],{"class":1160},[1143,12619,12620,12622,12624,12626,12628,12630],{"class":1145,"line":1194},[1143,12621,1157],{"class":1156},[1143,12623,4273],{"class":1160},[1143,12625,1171],{"class":1156},[1143,12627,4278],{"class":1294},[1143,12629,1349],{"class":1164},[1143,12631,4283],{"class":1160},[1143,12633,12634],{"class":1145,"line":1210},[1143,12635,1229],{"emptyLinePlaceholder":1228},[1143,12637,12638,12640],{"class":1145,"line":1225},[1143,12639,4329],{"class":1164},[1143,12641,4332],{"class":1341},[1143,12643,12644,12646,12649],{"class":1145,"line":1232},[1143,12645,1236],{"class":1235},[1143,12647,12648],{"class":1239}," CreateProductCommand",[1143,12650,1380],{"class":1164},[1143,12652,12653,12655,12658],{"class":1145,"line":1253},[1143,12654,1257],{"class":1256},[1143,12656,12657],{"class":1260},"Command for creating a product",[1143,12659,1264],{"class":1256},[1143,12661,12662,12665,12667],{"class":1145,"line":1267},[1143,12663,12664],{"class":1160},"    name",[1143,12666,1485],{"class":1164},[1143,12668,12669],{"class":1849}," str\n",[1143,12671,12672,12675,12677],{"class":1145,"line":1273},[1143,12673,12674],{"class":1160},"    description",[1143,12676,1485],{"class":1164},[1143,12678,12669],{"class":1849},[1143,12680,12681,12683,12685],{"class":1145,"line":1291},[1143,12682,4374],{"class":1160},[1143,12684,1485],{"class":1164},[1143,12686,3430],{"class":1160},[1143,12688,12689,12692,12694],{"class":1145,"line":1314},[1143,12690,12691],{"class":1160},"    category_id",[1143,12693,1485],{"class":1164},[1143,12695,4360],{"class":1849},[1143,12697,12698,12701,12703],{"class":1145,"line":1331},[1143,12699,12700],{"class":1160},"    user_id",[1143,12702,1485],{"class":1164},[1143,12704,4360],{"class":1849},[1143,12706,12707],{"class":1145,"line":1336},[1143,12708,1229],{"emptyLinePlaceholder":1228},[1143,12710,12711,12713],{"class":1145,"line":1363},[1143,12712,4329],{"class":1164},[1143,12714,4332],{"class":1341},[1143,12716,12717,12719,12722],{"class":1145,"line":1374},[1143,12718,1236],{"class":1235},[1143,12720,12721],{"class":1239}," UpdateProductPriceCommand",[1143,12723,1380],{"class":1164},[1143,12725,12726,12728,12731],{"class":1145,"line":1383},[1143,12727,1257],{"class":1256},[1143,12729,12730],{"class":1260},"Command for updating product price",[1143,12732,1264],{"class":1256},[1143,12734,12735,12737,12739],{"class":1145,"line":1412},[1143,12736,4355],{"class":1160},[1143,12738,1485],{"class":1164},[1143,12740,4360],{"class":1849},[1143,12742,12743,12746,12748],{"class":1145,"line":1438},[1143,12744,12745],{"class":1160},"    new_price",[1143,12747,1485],{"class":1164},[1143,12749,3430],{"class":1160},[1143,12751,12752,12754,12756],{"class":1145,"line":1454},[1143,12753,12700],{"class":1160},[1143,12755,1485],{"class":1164},[1143,12757,4360],{"class":1849},[1143,12759,12760],{"class":1145,"line":1465},[1143,12761,1229],{"emptyLinePlaceholder":1228},[1143,12763,12764,12766],{"class":1145,"line":1511},[1143,12765,4329],{"class":1164},[1143,12767,4332],{"class":1341},[1143,12769,12770,12772,12775],{"class":1145,"line":1516},[1143,12771,1236],{"class":1235},[1143,12773,12774],{"class":1239}," DeactivateProductCommand",[1143,12776,1380],{"class":1164},[1143,12778,12779,12781,12784],{"class":1145,"line":1534},[1143,12780,1257],{"class":1256},[1143,12782,12783],{"class":1260},"Command for deactivating a product",[1143,12785,1264],{"class":1256},[1143,12787,12788,12790,12792],{"class":1145,"line":1544},[1143,12789,4355],{"class":1160},[1143,12791,1485],{"class":1164},[1143,12793,4360],{"class":1849},[1143,12795,12796,12799,12801],{"class":1145,"line":1551},[1143,12797,12798],{"class":1160},"    reason",[1143,12800,1485],{"class":1164},[1143,12802,12669],{"class":1849},[1143,12804,12805,12807,12809],{"class":1145,"line":1581},[1143,12806,12700],{"class":1160},[1143,12808,1485],{"class":1164},[1143,12810,4360],{"class":1849},[1143,12812,12813],{"class":1145,"line":1605},[1143,12814,1229],{"emptyLinePlaceholder":1228},[1143,12816,12817],{"class":1145,"line":1629},[1143,12818,12819],{"class":1149},"# Command Handlers\n",[1143,12821,12822,12824,12827,12829,12831],{"class":1145,"line":1652},[1143,12823,1236],{"class":1235},[1143,12825,12826],{"class":1239}," CommandHandler",[1143,12828,1243],{"class":1164},[1143,12830,5284],{"class":1294},[1143,12832,1250],{"class":1164},[1143,12834,12835,12837,12840],{"class":1145,"line":1668},[1143,12836,1257],{"class":1256},[1143,12838,12839],{"class":1260},"Abstract base for command handlers",[1143,12841,1264],{"class":1256},[1143,12843,12844],{"class":1145,"line":1704},[1143,12845,1270],{"class":1160},[1143,12847,12848,12850],{"class":1145,"line":1709},[1143,12849,2013],{"class":1164},[1143,12851,5306],{"class":1341},[1143,12853,12854,12856,12859,12861,12863,12865,12868,12870,12872,12875],{"class":1145,"line":1715},[1143,12855,1276],{"class":1235},[1143,12857,12858],{"class":1341}," handle",[1143,12860,1243],{"class":1164},[1143,12862,1286],{"class":1285},[1143,12864,1349],{"class":1164},[1143,12866,12867],{"class":1352}," command",[1143,12869,1853],{"class":1164},[1143,12871,1856],{"class":1164},[1143,12873,12874],{"class":1279}," any",[1143,12876,1380],{"class":1164},[1143,12878,12879],{"class":1145,"line":1735},[1143,12880,5338],{"class":1156},[1143,12882,12883],{"class":1145,"line":1750},[1143,12884,1229],{"emptyLinePlaceholder":1228},[1143,12886,12887,12889,12892,12894,12897],{"class":1145,"line":1767},[1143,12888,1236],{"class":1235},[1143,12890,12891],{"class":1239}," CreateProductCommandHandler",[1143,12893,1243],{"class":1164},[1143,12895,12896],{"class":1246},"CommandHandler",[1143,12898,1250],{"class":1164},[1143,12900,12901,12903,12906],{"class":1145,"line":1772},[1143,12902,1257],{"class":1256},[1143,12904,12905],{"class":1260},"Handler for product creation commands",[1143,12907,1264],{"class":1256},[1143,12909,12910],{"class":1145,"line":1781},[1143,12911,1270],{"class":1160},[1143,12913,12914,12916,12918,12920,12922,12924,12927,12929,12931,12933],{"class":1145,"line":1791},[1143,12915,1276],{"class":1235},[1143,12917,1280],{"class":1279},[1143,12919,1243],{"class":1164},[1143,12921,1286],{"class":1285},[1143,12923,1349],{"class":1164},[1143,12925,12926],{"class":1352}," product_repo",[1143,12928,1485],{"class":1164},[1143,12930,1821],{"class":1160},[1143,12932,1349],{"class":1164},[1143,12934,5736],{"class":1160},[1143,12936,12937,12940,12942,12945],{"class":1145,"line":1796},[1143,12938,12939],{"class":1352},"                 event_store",[1143,12941,1485],{"class":1164},[1143,12943,12944],{"class":1160}," EventStore",[1143,12946,1250],{"class":1164},[1143,12948,12949,12951,12953,12955,12957],{"class":1145,"line":1809},[1143,12950,1295],{"class":1294},[1143,12952,1165],{"class":1164},[1143,12954,1816],{"class":1300},[1143,12956,1304],{"class":1164},[1143,12958,12959],{"class":1160}," product_repo\n",[1143,12961,12962,12964,12966,12969,12971],{"class":1145,"line":1826},[1143,12963,1295],{"class":1294},[1143,12965,1165],{"class":1164},[1143,12967,12968],{"class":1300},"event_store",[1143,12970,1304],{"class":1164},[1143,12972,12973],{"class":1160}," event_store\n",[1143,12975,12976],{"class":1145,"line":1831},[1143,12977,1270],{"class":1160},[1143,12979,12980,12982,12984,12986,12988,12990,12992,12994,12996,12998,13000,13002],{"class":1145,"line":1863},[1143,12981,1276],{"class":1235},[1143,12983,12858],{"class":1341},[1143,12985,1243],{"class":1164},[1143,12987,1286],{"class":1285},[1143,12989,1349],{"class":1164},[1143,12991,12867],{"class":1352},[1143,12993,1485],{"class":1164},[1143,12995,12648],{"class":1160},[1143,12997,1853],{"class":1164},[1143,12999,1856],{"class":1164},[1143,13001,1850],{"class":1849},[1143,13003,1380],{"class":1164},[1143,13005,13006,13008,13011],{"class":1145,"line":1873},[1143,13007,1366],{"class":1256},[1143,13009,13010],{"class":1260},"Handle product creation command",[1143,13012,1264],{"class":1256},[1143,13014,13015],{"class":1145,"line":1898},[1143,13016,2067],{"class":1149},[1143,13018,13019,13021,13023,13025,13027,13029,13031,13033,13036,13038,13040],{"class":1145,"line":1913},[1143,13020,1901],{"class":1156},[1143,13022,1392],{"class":1294},[1143,13024,1165],{"class":1164},[1143,13026,1816],{"class":1300},[1143,13028,1165],{"class":1164},[1143,13030,2083],{"class":1307},[1143,13032,1243],{"class":1164},[1143,13034,13035],{"class":1307},"command",[1143,13037,1165],{"class":1164},[1143,13039,2095],{"class":1300},[1143,13041,1250],{"class":1164},[1143,13043,13044,13046,13048,13050,13052,13054,13056],{"class":1145,"line":1943},[1143,13045,1916],{"class":1156},[1143,13047,2108],{"class":1307},[1143,13049,1243],{"class":1164},[1143,13051,1981],{"class":1475},[1143,13053,2115],{"class":1479},[1143,13055,1981],{"class":1475},[1143,13057,1409],{"class":1164},[1143,13059,13060],{"class":1145,"line":1949},[1143,13061,1946],{"class":1160},[1143,13063,13064],{"class":1145,"line":1955},[1143,13065,2212],{"class":1149},[1143,13067,13068,13070,13072,13074],{"class":1145,"line":1971},[1143,13069,1876],{"class":1160},[1143,13071,1389],{"class":1164},[1143,13073,1727],{"class":1307},[1143,13075,2224],{"class":1164},[1143,13077,13078,13080,13082,13084,13086,13088],{"class":1145,"line":1991},[1143,13079,2230],{"class":1499},[1143,13081,1389],{"class":1164},[1143,13083,13035],{"class":1307},[1143,13085,1165],{"class":1164},[1143,13087,2095],{"class":1300},[1143,13089,5748],{"class":1164},[1143,13091,13092,13094,13096,13098,13100,13102],{"class":1145,"line":1996},[1143,13093,2251],{"class":1499},[1143,13095,1389],{"class":1164},[1143,13097,13035],{"class":1307},[1143,13099,1165],{"class":1164},[1143,13101,2262],{"class":1300},[1143,13103,5748],{"class":1164},[1143,13105,13106,13108,13110,13112,13114,13116],{"class":1145,"line":2005},[1143,13107,2272],{"class":1499},[1143,13109,1389],{"class":1164},[1143,13111,13035],{"class":1307},[1143,13113,1165],{"class":1164},[1143,13115,2283],{"class":1300},[1143,13117,5748],{"class":1164},[1143,13119,13120,13123,13125,13127,13129],{"class":1145,"line":2010},[1143,13121,13122],{"class":1499},"            category_id",[1143,13124,1389],{"class":1164},[1143,13126,13035],{"class":1307},[1143,13128,1165],{"class":1164},[1143,13130,13131],{"class":1300},"category_id\n",[1143,13133,13134],{"class":1145,"line":2024},[1143,13135,2304],{"class":1164},[1143,13137,13138],{"class":1145,"line":2054},[1143,13139,1946],{"class":1160},[1143,13141,13142],{"class":1145,"line":2064},[1143,13143,13144],{"class":1149},"        # Save product\n",[1143,13146,13147,13150,13152,13154,13156,13158,13160,13162,13164,13166],{"class":1145,"line":2070},[1143,13148,13149],{"class":1160},"        saved_product ",[1143,13151,1389],{"class":1164},[1143,13153,1392],{"class":1294},[1143,13155,1165],{"class":1164},[1143,13157,1816],{"class":1300},[1143,13159,1165],{"class":1164},[1143,13161,2361],{"class":1307},[1143,13163,1243],{"class":1164},[1143,13165,1433],{"class":1307},[1143,13167,1409],{"class":1164},[1143,13169,13170],{"class":1145,"line":2103},[1143,13171,1946],{"class":1160},[1143,13173,13174],{"class":1145,"line":2122},[1143,13175,13176],{"class":1149},"        # Record event\n",[1143,13178,13179,13182,13184,13187],{"class":1145,"line":2127},[1143,13180,13181],{"class":1160},"        event ",[1143,13183,1389],{"class":1164},[1143,13185,13186],{"class":1307}," ProductCreatedEvent",[1143,13188,2224],{"class":1164},[1143,13190,13191,13194,13196,13199,13201,13203],{"class":1145,"line":2169},[1143,13192,13193],{"class":1499},"            product_id",[1143,13195,1389],{"class":1164},[1143,13197,13198],{"class":1307},"saved_product",[1143,13200,1165],{"class":1164},[1143,13202,2150],{"class":1300},[1143,13204,5748],{"class":1164},[1143,13206,13207,13209,13211,13213,13215,13217],{"class":1145,"line":2186},[1143,13208,2230],{"class":1499},[1143,13210,1389],{"class":1164},[1143,13212,13035],{"class":1307},[1143,13214,1165],{"class":1164},[1143,13216,2095],{"class":1300},[1143,13218,5748],{"class":1164},[1143,13220,13221,13223,13225,13227,13229,13231],{"class":1145,"line":2204},[1143,13222,2272],{"class":1499},[1143,13224,1389],{"class":1164},[1143,13226,13035],{"class":1307},[1143,13228,1165],{"class":1164},[1143,13230,2283],{"class":1300},[1143,13232,5748],{"class":1164},[1143,13234,13235,13238,13240,13242,13244,13246],{"class":1145,"line":2209},[1143,13236,13237],{"class":1499},"            created_by",[1143,13239,1389],{"class":1164},[1143,13241,13035],{"class":1307},[1143,13243,1165],{"class":1164},[1143,13245,11340],{"class":1300},[1143,13247,5748],{"class":1164},[1143,13249,13250,13253,13255,13258,13260,13262],{"class":1145,"line":2215},[1143,13251,13252],{"class":1499},"            created_at",[1143,13254,1389],{"class":1164},[1143,13256,13257],{"class":1307},"timezone",[1143,13259,1165],{"class":1164},[1143,13261,2601],{"class":1307},[1143,13263,1311],{"class":1164},[1143,13265,13266],{"class":1145,"line":2227},[1143,13267,2304],{"class":1164},[1143,13269,13270,13272,13274,13276,13278,13280,13282,13285],{"class":1145,"line":2248},[1143,13271,1295],{"class":1294},[1143,13273,1165],{"class":1164},[1143,13275,12968],{"class":1300},[1143,13277,1165],{"class":1164},[1143,13279,4766],{"class":1307},[1143,13281,1243],{"class":1164},[1143,13283,13284],{"class":1307},"event",[1143,13286,1409],{"class":1164},[1143,13288,13289],{"class":1145,"line":2269},[1143,13290,1946],{"class":1160},[1143,13292,13293,13295,13298,13300],{"class":1145,"line":2290},[1143,13294,1999],{"class":1156},[1143,13296,13297],{"class":1160}," saved_product",[1143,13299,1165],{"class":1164},[1143,13301,6727],{"class":1300},[1143,13303,13304],{"class":1145,"line":2301},[1143,13305,1229],{"emptyLinePlaceholder":1228},[1143,13307,13308,13310,13313,13315,13317],{"class":1145,"line":2307},[1143,13309,1236],{"class":1235},[1143,13311,13312],{"class":1239}," UpdateProductPriceCommandHandler",[1143,13314,1243],{"class":1164},[1143,13316,12896],{"class":1246},[1143,13318,1250],{"class":1164},[1143,13320,13321,13323,13326],{"class":1145,"line":2312},[1143,13322,1257],{"class":1256},[1143,13324,13325],{"class":1260},"Handler for product price update commands",[1143,13327,1264],{"class":1256},[1143,13329,13330],{"class":1145,"line":2318},[1143,13331,1270],{"class":1160},[1143,13333,13334,13336,13338,13340,13342,13344,13346,13348,13350],{"class":1145,"line":2331},[1143,13335,1276],{"class":1235},[1143,13337,1280],{"class":1279},[1143,13339,1243],{"class":1164},[1143,13341,1286],{"class":1285},[1143,13343,1349],{"class":1164},[1143,13345,12926],{"class":1352},[1143,13347,1485],{"class":1164},[1143,13349,1821],{"class":1160},[1143,13351,5748],{"class":1164},[1143,13353,13354,13356,13358,13360],{"class":1145,"line":2343},[1143,13355,12939],{"class":1352},[1143,13357,1485],{"class":1164},[1143,13359,12944],{"class":1160},[1143,13361,1250],{"class":1164},[1143,13363,13364,13366,13368,13370,13372],{"class":1145,"line":2348},[1143,13365,1295],{"class":1294},[1143,13367,1165],{"class":1164},[1143,13369,1816],{"class":1300},[1143,13371,1304],{"class":1164},[1143,13373,12959],{"class":1160},[1143,13375,13376,13378,13380,13382,13384],{"class":1145,"line":2370},[1143,13377,1295],{"class":1294},[1143,13379,1165],{"class":1164},[1143,13381,12968],{"class":1300},[1143,13383,1304],{"class":1164},[1143,13385,12973],{"class":1160},[1143,13387,13388],{"class":1145,"line":2375},[1143,13389,1270],{"class":1160},[1143,13391,13392,13394,13396,13398,13400,13402,13404,13406,13408,13410,13412,13414],{"class":1145,"line":2413},[1143,13393,1276],{"class":1235},[1143,13395,12858],{"class":1341},[1143,13397,1243],{"class":1164},[1143,13399,1286],{"class":1285},[1143,13401,1349],{"class":1164},[1143,13403,12867],{"class":1352},[1143,13405,1485],{"class":1164},[1143,13407,12721],{"class":1160},[1143,13409,1853],{"class":1164},[1143,13411,1856],{"class":1164},[1143,13413,3366],{"class":2500},[1143,13415,1380],{"class":1164},[1143,13417,13418,13420,13423],{"class":1145,"line":2423},[1143,13419,1366],{"class":1256},[1143,13421,13422],{"class":1260},"Handle product price update command",[1143,13424,1264],{"class":1256},[1143,13426,13427,13429,13431,13433,13435,13437,13439,13441,13443,13445,13447,13449],{"class":1145,"line":2442},[1143,13428,1876],{"class":1160},[1143,13430,1389],{"class":1164},[1143,13432,1392],{"class":1294},[1143,13434,1165],{"class":1164},[1143,13436,1816],{"class":1300},[1143,13438,1165],{"class":1164},[1143,13440,1889],{"class":1307},[1143,13442,1243],{"class":1164},[1143,13444,13035],{"class":1307},[1143,13446,1165],{"class":1164},[1143,13448,1406],{"class":1300},[1143,13450,1409],{"class":1164},[1143,13452,13453,13455,13457,13459],{"class":1145,"line":2447},[1143,13454,1901],{"class":1156},[1143,13456,1905],{"class":1904},[1143,13458,1908],{"class":1160},[1143,13460,1380],{"class":1164},[1143,13462,13463,13465,13467,13469,13471,13473,13475],{"class":1145,"line":2453},[1143,13464,1916],{"class":1156},[1143,13466,4085],{"class":1849},[1143,13468,1243],{"class":1164},[1143,13470,1981],{"class":1475},[1143,13472,1491],{"class":1479},[1143,13474,1981],{"class":1475},[1143,13476,1409],{"class":1164},[1143,13478,13479],{"class":1145,"line":2487},[1143,13480,1946],{"class":1160},[1143,13482,13483,13486,13488,13490,13492],{"class":1145,"line":2504},[1143,13484,13485],{"class":1160},"        old_price ",[1143,13487,1389],{"class":1164},[1143,13489,1908],{"class":1160},[1143,13491,1165],{"class":1164},[1143,13493,4421],{"class":1300},[1143,13495,13496],{"class":1145,"line":2509},[1143,13497,1946],{"class":1160},[1143,13499,13500],{"class":1145,"line":2515},[1143,13501,1952],{"class":1149},[1143,13503,13504,13506,13508,13510,13513,13516,13518],{"class":1145,"line":2547},[1143,13505,1901],{"class":1156},[1143,13507,12867],{"class":1160},[1143,13509,1165],{"class":1164},[1143,13511,13512],{"class":1300},"new_price",[1143,13514,13515],{"class":1904}," \u003C=",[1143,13517,4064],{"class":1505},[1143,13519,1380],{"class":1164},[1143,13521,13522,13524,13526,13528,13530,13532,13534],{"class":1145,"line":2565},[1143,13523,1916],{"class":1156},[1143,13525,2108],{"class":1307},[1143,13527,1243],{"class":1164},[1143,13529,1981],{"class":1475},[1143,13531,4689],{"class":1479},[1143,13533,1981],{"class":1475},[1143,13535,1409],{"class":1164},[1143,13537,13538],{"class":1145,"line":2570},[1143,13539,1946],{"class":1160},[1143,13541,13542,13544,13546,13548,13550,13552,13555,13558,13560,13562,13564,13566,13568],{"class":1145,"line":2584},[1143,13543,1901],{"class":1156},[1143,13545,12867],{"class":1160},[1143,13547,1165],{"class":1164},[1143,13549,13512],{"class":1300},[1143,13551,7960],{"class":1904},[1143,13553,13554],{"class":1160}," old_price ",[1143,13556,13557],{"class":1904},"*",[1143,13559,2402],{"class":1307},[1143,13561,1243],{"class":1164},[1143,13563,1476],{"class":1475},[1143,13565,2540],{"class":1479},[1143,13567,1476],{"class":1475},[1143,13569,1250],{"class":1164},[1143,13571,13572,13574,13576,13578,13580,13582,13584],{"class":1145,"line":2606},[1143,13573,1916],{"class":1156},[1143,13575,2108],{"class":1307},[1143,13577,1243],{"class":1164},[1143,13579,1981],{"class":1475},[1143,13581,2558],{"class":1479},[1143,13583,1981],{"class":1475},[1143,13585,1409],{"class":1164},[1143,13587,13588],{"class":1145,"line":2611},[1143,13589,1946],{"class":1160},[1143,13591,13592],{"class":1145,"line":2632},[1143,13593,13594],{"class":1149},"        # Update price\n",[1143,13596,13597,13599,13601,13603,13605,13607,13609],{"class":1145,"line":2637},[1143,13598,2321],{"class":1160},[1143,13600,1165],{"class":1164},[1143,13602,2283],{"class":1300},[1143,13604,1304],{"class":1164},[1143,13606,12867],{"class":1160},[1143,13608,1165],{"class":1164},[1143,13610,13611],{"class":1300},"new_price\n",[1143,13613,13614,13616,13618,13620,13622,13624,13626,13628],{"class":1145,"line":2643},[1143,13615,1295],{"class":1294},[1143,13617,1165],{"class":1164},[1143,13619,1816],{"class":1300},[1143,13621,1165],{"class":1164},[1143,13623,2361],{"class":1307},[1143,13625,1243],{"class":1164},[1143,13627,1433],{"class":1307},[1143,13629,1409],{"class":1164},[1143,13631,13632],{"class":1145,"line":2661},[1143,13633,1946],{"class":1160},[1143,13635,13636],{"class":1145,"line":2682},[1143,13637,13176],{"class":1149},[1143,13639,13640,13642,13644,13647],{"class":1145,"line":2687},[1143,13641,13181],{"class":1160},[1143,13643,1389],{"class":1164},[1143,13645,13646],{"class":1307}," ProductPriceUpdatedEvent",[1143,13648,2224],{"class":1164},[1143,13650,13651,13653,13655,13657,13659,13661],{"class":1145,"line":2696},[1143,13652,13193],{"class":1499},[1143,13654,1389],{"class":1164},[1143,13656,1433],{"class":1307},[1143,13658,1165],{"class":1164},[1143,13660,2150],{"class":1300},[1143,13662,5748],{"class":1164},[1143,13664,13665,13668,13670,13673],{"class":1145,"line":2706},[1143,13666,13667],{"class":1499},"            old_price",[1143,13669,1389],{"class":1164},[1143,13671,13672],{"class":1307},"old_price",[1143,13674,5748],{"class":1164},[1143,13676,13677,13680,13682,13684,13686,13688],{"class":1145,"line":2711},[1143,13678,13679],{"class":1499},"            new_price",[1143,13681,1389],{"class":1164},[1143,13683,13035],{"class":1307},[1143,13685,1165],{"class":1164},[1143,13687,13512],{"class":1300},[1143,13689,5748],{"class":1164},[1143,13691,13692,13695,13697,13699,13701,13703],{"class":1145,"line":2745},[1143,13693,13694],{"class":1499},"            updated_by",[1143,13696,1389],{"class":1164},[1143,13698,13035],{"class":1307},[1143,13700,1165],{"class":1164},[1143,13702,11340],{"class":1300},[1143,13704,5748],{"class":1164},[1143,13706,13707,13710,13712,13714,13716,13718],{"class":1145,"line":2755},[1143,13708,13709],{"class":1499},"            updated_at",[1143,13711,1389],{"class":1164},[1143,13713,13257],{"class":1307},[1143,13715,1165],{"class":1164},[1143,13717,2601],{"class":1307},[1143,13719,1311],{"class":1164},[1143,13721,13722],{"class":1145,"line":2762},[1143,13723,2304],{"class":1164},[1143,13725,13726,13728,13730,13732,13734,13736,13738,13740],{"class":1145,"line":2802},[1143,13727,1295],{"class":1294},[1143,13729,1165],{"class":1164},[1143,13731,12968],{"class":1300},[1143,13733,1165],{"class":1164},[1143,13735,4766],{"class":1307},[1143,13737,1243],{"class":1164},[1143,13739,13284],{"class":1307},[1143,13741,1409],{"class":1164},[1143,13743,13744],{"class":1145,"line":2816},[1143,13745,1229],{"emptyLinePlaceholder":1228},[1143,13747,13748],{"class":1145,"line":2824},[1143,13749,13750],{"class":1149},"# Queries - Read operations\n",[1143,13752,13753,13755],{"class":1145,"line":2829},[1143,13754,4329],{"class":1164},[1143,13756,4332],{"class":1341},[1143,13758,13759,13761,13764],{"class":1145,"line":2863},[1143,13760,1236],{"class":1235},[1143,13762,13763],{"class":1239}," GetProductQuery",[1143,13765,1380],{"class":1164},[1143,13767,13768,13770,13773],{"class":1145,"line":2873},[1143,13769,1257],{"class":1256},[1143,13771,13772],{"class":1260},"Query for getting a single product",[1143,13774,1264],{"class":1256},[1143,13776,13777,13779,13781],{"class":1145,"line":2880},[1143,13778,4355],{"class":1160},[1143,13780,1485],{"class":1164},[1143,13782,4360],{"class":1849},[1143,13784,13785],{"class":1145,"line":2905},[1143,13786,1229],{"emptyLinePlaceholder":1228},[1143,13788,13789,13791],{"class":1145,"line":2918},[1143,13790,4329],{"class":1164},[1143,13792,4332],{"class":1341},[1143,13794,13795,13797,13800],{"class":1145,"line":2925},[1143,13796,1236],{"class":1235},[1143,13798,13799],{"class":1239}," SearchProductsQuery",[1143,13801,1380],{"class":1164},[1143,13803,13804,13806,13809],{"class":1145,"line":2930},[1143,13805,1257],{"class":1256},[1143,13807,13808],{"class":1260},"Query for searching products",[1143,13810,1264],{"class":1256},[1143,13812,13813,13816,13818],{"class":1145,"line":2959},[1143,13814,13815],{"class":1160},"    search_term",[1143,13817,1485],{"class":1164},[1143,13819,12669],{"class":1849},[1143,13821,13822,13824,13826,13828,13830,13832,13834,13836],{"class":1145,"line":2969},[1143,13823,12691],{"class":1160},[1143,13825,1485],{"class":1164},[1143,13827,2653],{"class":1160},[1143,13829,2090],{"class":1164},[1143,13831,7585],{"class":1849},[1143,13833,4503],{"class":1164},[1143,13835,1304],{"class":1164},[1143,13837,2821],{"class":2500},[1143,13839,13840,13843,13845,13847,13849,13851,13853,13855],{"class":1145,"line":3000},[1143,13841,13842],{"class":1160},"    min_price",[1143,13844,1485],{"class":1164},[1143,13846,2653],{"class":1160},[1143,13848,2090],{"class":1164},[1143,13850,3841],{"class":1160},[1143,13852,4503],{"class":1164},[1143,13854,1304],{"class":1164},[1143,13856,2821],{"class":2500},[1143,13858,13859,13862,13864,13866,13868,13870,13872,13874],{"class":1145,"line":3005},[1143,13860,13861],{"class":1160},"    max_price",[1143,13863,1485],{"class":1164},[1143,13865,2653],{"class":1160},[1143,13867,2090],{"class":1164},[1143,13869,3841],{"class":1160},[1143,13871,4503],{"class":1164},[1143,13873,1304],{"class":1164},[1143,13875,2821],{"class":2500},[1143,13877,13878,13881,13883,13885,13887],{"class":1145,"line":3039},[1143,13879,13880],{"class":1160},"    page",[1143,13882,1485],{"class":1164},[1143,13884,1850],{"class":1849},[1143,13886,1304],{"class":1164},[1143,13888,13889],{"class":1505}," 1\n",[1143,13891,13892,13895,13897,13899,13901],{"class":1145,"line":3049},[1143,13893,13894],{"class":1160},"    page_size",[1143,13896,1485],{"class":1164},[1143,13898,1850],{"class":1849},[1143,13900,1304],{"class":1164},[1143,13902,13903],{"class":1505}," 20\n",[1143,13905,13906],{"class":1145,"line":3059},[1143,13907,1229],{"emptyLinePlaceholder":1228},[1143,13909,13910,13912],{"class":1145,"line":3093},[1143,13911,4329],{"class":1164},[1143,13913,4332],{"class":1341},[1143,13915,13916,13918,13921],{"class":1145,"line":3111},[1143,13917,1236],{"class":1235},[1143,13919,13920],{"class":1239}," GetProductStatsQuery",[1143,13922,1380],{"class":1164},[1143,13924,13925,13927,13930],{"class":1145,"line":3129},[1143,13926,1257],{"class":1256},[1143,13928,13929],{"class":1260},"Query for product statistics",[1143,13931,1264],{"class":1256},[1143,13933,13934,13936,13938],{"class":1145,"line":3134},[1143,13935,4355],{"class":1160},[1143,13937,1485],{"class":1164},[1143,13939,4360],{"class":1849},[1143,13941,13942],{"class":1145,"line":3139},[1143,13943,1229],{"emptyLinePlaceholder":1228},[1143,13945,13946],{"class":1145,"line":3172},[1143,13947,13948],{"class":1149},"# Query Handlers\n",[1143,13950,13951,13953,13956,13958,13960],{"class":1145,"line":3182},[1143,13952,1236],{"class":1235},[1143,13954,13955],{"class":1239}," QueryHandler",[1143,13957,1243],{"class":1164},[1143,13959,5284],{"class":1294},[1143,13961,1250],{"class":1164},[1143,13963,13964,13966,13969],{"class":1145,"line":3191},[1143,13965,1257],{"class":1256},[1143,13967,13968],{"class":1260},"Abstract base for query handlers",[1143,13970,1264],{"class":1256},[1143,13972,13973],{"class":1145,"line":3206},[1143,13974,1270],{"class":1160},[1143,13976,13977,13979],{"class":1145,"line":3242},[1143,13978,2013],{"class":1164},[1143,13980,5306],{"class":1341},[1143,13982,13983,13985,13987,13989,13991,13993,13995,13997,13999,14001],{"class":1145,"line":3253},[1143,13984,1276],{"class":1235},[1143,13986,12858],{"class":1341},[1143,13988,1243],{"class":1164},[1143,13990,1286],{"class":1285},[1143,13992,1349],{"class":1164},[1143,13994,3153],{"class":1352},[1143,13996,1853],{"class":1164},[1143,13998,1856],{"class":1164},[1143,14000,12874],{"class":1279},[1143,14002,1380],{"class":1164},[1143,14004,14005],{"class":1145,"line":3271},[1143,14006,5338],{"class":1156},[1143,14008,14009],{"class":1145,"line":3276},[1143,14010,1229],{"emptyLinePlaceholder":1228},[1143,14012,14013,14015,14018,14020,14023],{"class":1145,"line":3281},[1143,14014,1236],{"class":1235},[1143,14016,14017],{"class":1239}," GetProductQueryHandler",[1143,14019,1243],{"class":1164},[1143,14021,14022],{"class":1246},"QueryHandler",[1143,14024,1250],{"class":1164},[1143,14026,14027,14029,14032],{"class":1145,"line":3309},[1143,14028,1257],{"class":1256},[1143,14030,14031],{"class":1260},"Handler for single product queries",[1143,14033,1264],{"class":1256},[1143,14035,14036],{"class":1145,"line":3319},[1143,14037,1270],{"class":1160},[1143,14039,14040,14042,14044,14046,14048,14050,14053,14055,14058],{"class":1145,"line":3330},[1143,14041,1276],{"class":1235},[1143,14043,1280],{"class":1279},[1143,14045,1243],{"class":1164},[1143,14047,1286],{"class":1285},[1143,14049,1349],{"class":1164},[1143,14051,14052],{"class":1352}," read_model_repo",[1143,14054,1485],{"class":1164},[1143,14056,14057],{"class":1160}," ProductReadModelRepository",[1143,14059,1250],{"class":1164},[1143,14061,14062,14064,14066,14069,14071],{"class":1145,"line":3337},[1143,14063,1295],{"class":1294},[1143,14065,1165],{"class":1164},[1143,14067,14068],{"class":1300},"read_model_repo",[1143,14070,1304],{"class":1164},[1143,14072,14073],{"class":1160}," read_model_repo\n",[1143,14075,14076],{"class":1145,"line":3342},[1143,14077,1270],{"class":1160},[1143,14079,14080,14082,14084,14086,14088,14090,14092,14094,14096,14098,14100,14102,14104,14107],{"class":1145,"line":3371},[1143,14081,1276],{"class":1235},[1143,14083,12858],{"class":1341},[1143,14085,1243],{"class":1164},[1143,14087,1286],{"class":1285},[1143,14089,1349],{"class":1164},[1143,14091,3153],{"class":1352},[1143,14093,1485],{"class":1164},[1143,14095,13763],{"class":1160},[1143,14097,1853],{"class":1164},[1143,14099,1856],{"class":1164},[1143,14101,2653],{"class":1160},[1143,14103,2090],{"class":1164},[1143,14105,14106],{"class":1160},"ProductReadModel",[1143,14108,2742],{"class":1164},[1143,14110,14111,14113,14116],{"class":1145,"line":3381},[1143,14112,1366],{"class":1256},[1143,14114,14115],{"class":1260},"Handle get product query",[1143,14117,1264],{"class":1256},[1143,14119,14120,14122,14124,14126,14128,14130,14132,14134,14136,14138,14140],{"class":1145,"line":3393},[1143,14121,1999],{"class":1156},[1143,14123,1392],{"class":1294},[1143,14125,1165],{"class":1164},[1143,14127,14068],{"class":1300},[1143,14129,1165],{"class":1164},[1143,14131,1889],{"class":1307},[1143,14133,1243],{"class":1164},[1143,14135,3219],{"class":1307},[1143,14137,1165],{"class":1164},[1143,14139,1406],{"class":1300},[1143,14141,1409],{"class":1164},[1143,14143,14144],{"class":1145,"line":3398},[1143,14145,1229],{"emptyLinePlaceholder":1228},[1143,14147,14148,14150,14153,14155,14157],{"class":1145,"line":3404},[1143,14149,1236],{"class":1235},[1143,14151,14152],{"class":1239}," SearchProductsQueryHandler",[1143,14154,1243],{"class":1164},[1143,14156,14022],{"class":1246},[1143,14158,1250],{"class":1164},[1143,14160,14161,14163,14166],{"class":1145,"line":3420},[1143,14162,1257],{"class":1256},[1143,14164,14165],{"class":1260},"Handler for product search queries",[1143,14167,1264],{"class":1256},[1143,14169,14170],{"class":1145,"line":3433},[1143,14171,1270],{"class":1160},[1143,14173,14174,14176,14178,14180,14182,14184,14186,14188,14190],{"class":1145,"line":3438},[1143,14175,1276],{"class":1235},[1143,14177,1280],{"class":1279},[1143,14179,1243],{"class":1164},[1143,14181,1286],{"class":1285},[1143,14183,1349],{"class":1164},[1143,14185,14052],{"class":1352},[1143,14187,1485],{"class":1164},[1143,14189,14057],{"class":1160},[1143,14191,1250],{"class":1164},[1143,14193,14194,14196,14198,14200,14202],{"class":1145,"line":3457},[1143,14195,1295],{"class":1294},[1143,14197,1165],{"class":1164},[1143,14199,14068],{"class":1300},[1143,14201,1304],{"class":1164},[1143,14203,14073],{"class":1160},[1143,14205,14206],{"class":1145,"line":3467},[1143,14207,1270],{"class":1160},[1143,14209,14210,14212,14214,14216,14218,14220,14222,14224,14226,14228,14230,14232],{"class":1145,"line":3472},[1143,14211,1276],{"class":1235},[1143,14213,12858],{"class":1341},[1143,14215,1243],{"class":1164},[1143,14217,1286],{"class":1285},[1143,14219,1349],{"class":1164},[1143,14221,3153],{"class":1352},[1143,14223,1485],{"class":1164},[1143,14225,13799],{"class":1160},[1143,14227,1853],{"class":1164},[1143,14229,1856],{"class":1164},[1143,14231,2043],{"class":1849},[1143,14233,1380],{"class":1164},[1143,14235,14236,14238,14241],{"class":1145,"line":3509},[1143,14237,1366],{"class":1256},[1143,14239,14240],{"class":1260},"Handle product search query",[1143,14242,1264],{"class":1256},[1143,14244,14245,14248,14250],{"class":1145,"line":3526},[1143,14246,14247],{"class":1160},"        filters ",[1143,14249,1389],{"class":1164},[1143,14251,8714],{"class":1164},[1143,14253,14254],{"class":1145,"line":3563},[1143,14255,1946],{"class":1160},[1143,14257,14258,14260,14262,14264,14267],{"class":1145,"line":3604},[1143,14259,1901],{"class":1156},[1143,14261,3153],{"class":1160},[1143,14263,1165],{"class":1164},[1143,14265,14266],{"class":1300},"search_term",[1143,14268,1380],{"class":1164},[1143,14270,14271,14274,14276,14278,14280,14282,14284,14286,14288,14290],{"class":1145,"line":3630},[1143,14272,14273],{"class":1160},"            filters",[1143,14275,2090],{"class":1164},[1143,14277,1476],{"class":1475},[1143,14279,14266],{"class":1479},[1143,14281,1476],{"class":1475},[1143,14283,4503],{"class":1164},[1143,14285,1304],{"class":1164},[1143,14287,3153],{"class":1160},[1143,14289,1165],{"class":1164},[1143,14291,14292],{"class":1300},"search_term\n",[1143,14294,14295],{"class":1145,"line":3655},[1143,14296,1946],{"class":1160},[1143,14298,14299,14301,14303,14305,14307],{"class":1145,"line":3681},[1143,14300,1901],{"class":1156},[1143,14302,3153],{"class":1160},[1143,14304,1165],{"class":1164},[1143,14306,2161],{"class":1300},[1143,14308,1380],{"class":1164},[1143,14310,14311,14313,14315,14317,14319,14321,14323,14325,14327,14329],{"class":1145,"line":3706},[1143,14312,14273],{"class":1160},[1143,14314,2090],{"class":1164},[1143,14316,1476],{"class":1475},[1143,14318,2161],{"class":1479},[1143,14320,1476],{"class":1475},[1143,14322,4503],{"class":1164},[1143,14324,1304],{"class":1164},[1143,14326,3153],{"class":1160},[1143,14328,1165],{"class":1164},[1143,14330,13131],{"class":1300},[1143,14332,14333],{"class":1145,"line":3711},[1143,14334,1946],{"class":1160},[1143,14336,14337,14339,14341,14343,14346],{"class":1145,"line":3725},[1143,14338,1901],{"class":1156},[1143,14340,3153],{"class":1160},[1143,14342,1165],{"class":1164},[1143,14344,14345],{"class":1300},"min_price",[1143,14347,1380],{"class":1164},[1143,14349,14350,14352,14354,14356,14358,14360,14362,14364,14366,14368],{"class":1145,"line":3735},[1143,14351,14273],{"class":1160},[1143,14353,2090],{"class":1164},[1143,14355,1476],{"class":1475},[1143,14357,14345],{"class":1479},[1143,14359,1476],{"class":1475},[1143,14361,4503],{"class":1164},[1143,14363,1304],{"class":1164},[1143,14365,3153],{"class":1160},[1143,14367,1165],{"class":1164},[1143,14369,14370],{"class":1300},"min_price\n",[1143,14372,14373],{"class":1145,"line":3741},[1143,14374,1946],{"class":1160},[1143,14376,14377,14379,14381,14383,14386],{"class":1145,"line":3759},[1143,14378,1901],{"class":1156},[1143,14380,3153],{"class":1160},[1143,14382,1165],{"class":1164},[1143,14384,14385],{"class":1300},"max_price",[1143,14387,1380],{"class":1164},[1143,14389,14390,14392,14394,14396,14398,14400,14402,14404,14406,14408],{"class":1145,"line":3788},[1143,14391,14273],{"class":1160},[1143,14393,2090],{"class":1164},[1143,14395,1476],{"class":1475},[1143,14397,14385],{"class":1479},[1143,14399,1476],{"class":1475},[1143,14401,4503],{"class":1164},[1143,14403,1304],{"class":1164},[1143,14405,3153],{"class":1160},[1143,14407,1165],{"class":1164},[1143,14409,14410],{"class":1300},"max_price\n",[1143,14412,14413],{"class":1145,"line":3793},[1143,14414,1946],{"class":1160},[1143,14416,14417,14420,14422,14424,14426,14428,14430,14433],{"class":1145,"line":3799},[1143,14418,14419],{"class":1160},"        products ",[1143,14421,1389],{"class":1164},[1143,14423,1392],{"class":1294},[1143,14425,1165],{"class":1164},[1143,14427,14068],{"class":1300},[1143,14429,1165],{"class":1164},[1143,14431,14432],{"class":1307},"search",[1143,14434,2224],{"class":1164},[1143,14436,14437,14439,14441,14444],{"class":1145,"line":3817},[1143,14438,14273],{"class":1499},[1143,14440,1389],{"class":1164},[1143,14442,14443],{"class":1307},"filters",[1143,14445,5748],{"class":1164},[1143,14447,14448,14451,14453,14455,14457,14460],{"class":1145,"line":3859},[1143,14449,14450],{"class":1499},"            page",[1143,14452,1389],{"class":1164},[1143,14454,3219],{"class":1307},[1143,14456,1165],{"class":1164},[1143,14458,14459],{"class":1300},"page",[1143,14461,5748],{"class":1164},[1143,14463,14464,14467,14469,14471,14473],{"class":1145,"line":3864},[1143,14465,14466],{"class":1499},"            page_size",[1143,14468,1389],{"class":1164},[1143,14470,3219],{"class":1307},[1143,14472,1165],{"class":1164},[1143,14474,14475],{"class":1300},"page_size\n",[1143,14477,14478],{"class":1145,"line":3878},[1143,14479,2304],{"class":1164},[1143,14481,14482],{"class":1145,"line":3888},[1143,14483,1946],{"class":1160},[1143,14485,14486,14489,14491,14493,14495,14497,14499,14502,14504,14506],{"class":1145,"line":3894},[1143,14487,14488],{"class":1160},"        total_count ",[1143,14490,1389],{"class":1164},[1143,14492,1392],{"class":1294},[1143,14494,1165],{"class":1164},[1143,14496,14068],{"class":1300},[1143,14498,1165],{"class":1164},[1143,14500,14501],{"class":1307},"count",[1143,14503,1243],{"class":1164},[1143,14505,14443],{"class":1307},[1143,14507,1409],{"class":1164},[1143,14509,14510],{"class":1145,"line":3908},[1143,14511,1946],{"class":1160},[1143,14513,14514,14516],{"class":1145,"line":3913},[1143,14515,1999],{"class":1156},[1143,14517,14518],{"class":1164}," {\n",[1143,14520,14521,14524,14527,14529,14531,14534],{"class":1145,"line":3919},[1143,14522,14523],{"class":1475},"            '",[1143,14525,14526],{"class":1479},"products",[1143,14528,1476],{"class":1475},[1143,14530,1485],{"class":1164},[1143,14532,14533],{"class":1160}," products",[1143,14535,5748],{"class":1164},[1143,14537,14538,14540,14543,14545,14547,14550],{"class":1145,"line":3936},[1143,14539,14523],{"class":1475},[1143,14541,14542],{"class":1479},"total_count",[1143,14544,1476],{"class":1475},[1143,14546,1485],{"class":1164},[1143,14548,14549],{"class":1160}," total_count",[1143,14551,5748],{"class":1164},[1143,14553,14554,14556,14558,14560,14562,14564,14566,14568],{"class":1145,"line":3949},[1143,14555,14523],{"class":1475},[1143,14557,14459],{"class":1479},[1143,14559,1476],{"class":1475},[1143,14561,1485],{"class":1164},[1143,14563,3153],{"class":1160},[1143,14565,1165],{"class":1164},[1143,14567,14459],{"class":1300},[1143,14569,5748],{"class":1164},[1143,14571,14572,14574,14577,14579,14581,14583,14585,14587],{"class":1145,"line":3954},[1143,14573,14523],{"class":1475},[1143,14575,14576],{"class":1479},"page_size",[1143,14578,1476],{"class":1475},[1143,14580,1485],{"class":1164},[1143,14582,3153],{"class":1160},[1143,14584,1165],{"class":1164},[1143,14586,14576],{"class":1300},[1143,14588,5748],{"class":1164},[1143,14590,14591,14593,14596,14598,14600,14602,14605,14608,14610,14612,14614,14616,14619,14621,14624,14626,14628],{"class":1145,"line":3974},[1143,14592,14523],{"class":1475},[1143,14594,14595],{"class":1479},"total_pages",[1143,14597,1476],{"class":1475},[1143,14599,1485],{"class":1164},[1143,14601,4126],{"class":1164},[1143,14603,14604],{"class":1160},"total_count ",[1143,14606,14607],{"class":1904},"+",[1143,14609,3153],{"class":1160},[1143,14611,1165],{"class":1164},[1143,14613,14576],{"class":1300},[1143,14615,4150],{"class":1904},[1143,14617,14618],{"class":1505}," 1",[1143,14620,1853],{"class":1164},[1143,14622,14623],{"class":1904}," //",[1143,14625,3153],{"class":1160},[1143,14627,1165],{"class":1164},[1143,14629,14475],{"class":1300},[1143,14631,14632],{"class":1145,"line":3984},[1143,14633,14634],{"class":1164},"        }\n",[1143,14636,14637],{"class":1145,"line":3990},[1143,14638,1229],{"emptyLinePlaceholder":1228},[1143,14640,14641],{"class":1145,"line":4010},[1143,14642,14643],{"class":1149},"# Read Models - Optimized for queries\n",[1143,14645,14646,14648,14651],{"class":1145,"line":4015},[1143,14647,1236],{"class":1235},[1143,14649,14650],{"class":1239}," ProductReadModel",[1143,14652,1380],{"class":1164},[1143,14654,14655,14657,14660],{"class":1145,"line":4044},[1143,14656,1257],{"class":1256},[1143,14658,14659],{"class":1260},"Read model optimized for product queries",[1143,14661,1264],{"class":1256},[1143,14663,14664],{"class":1145,"line":4054},[1143,14665,1270],{"class":1160},[1143,14667,14668,14670,14672,14674,14676,14678,14680,14682,14684,14686,14688,14690,14692,14694,14697,14699,14701],{"class":1145,"line":4080},[1143,14669,1276],{"class":1235},[1143,14671,1280],{"class":1279},[1143,14673,1243],{"class":1164},[1143,14675,1286],{"class":1285},[1143,14677,1349],{"class":1164},[1143,14679,1358],{"class":1352},[1143,14681,1485],{"class":1164},[1143,14683,1850],{"class":1849},[1143,14685,1349],{"class":1164},[1143,14687,2843],{"class":1352},[1143,14689,1485],{"class":1164},[1143,14691,2848],{"class":1849},[1143,14693,1349],{"class":1164},[1143,14695,14696],{"class":1352}," description",[1143,14698,1485],{"class":1164},[1143,14700,2848],{"class":1849},[1143,14702,5748],{"class":1164},[1143,14704,14705,14708,14710,14712,14714,14717,14719,14721,14723,14725,14727,14729],{"class":1145,"line":4105},[1143,14706,14707],{"class":1352},"                 price",[1143,14709,1485],{"class":1164},[1143,14711,2402],{"class":1160},[1143,14713,1349],{"class":1164},[1143,14715,14716],{"class":1352}," category_name",[1143,14718,1485],{"class":1164},[1143,14720,2848],{"class":1849},[1143,14722,1349],{"class":1164},[1143,14724,3083],{"class":1352},[1143,14726,1485],{"class":1164},[1143,14728,2954],{"class":1849},[1143,14730,5748],{"class":1164},[1143,14732,14733,14736,14738,14741,14743,14746,14748,14750,14752,14754,14756,14758,14760],{"class":1145,"line":4110},[1143,14734,14735],{"class":1352},"                 created_at",[1143,14737,1485],{"class":1164},[1143,14739,14740],{"class":1160}," datetime",[1143,14742,1349],{"class":1164},[1143,14744,14745],{"class":1352}," average_rating",[1143,14747,1485],{"class":1164},[1143,14749,2653],{"class":1160},[1143,14751,2090],{"class":1164},[1143,14753,3841],{"class":1160},[1143,14755,4503],{"class":1164},[1143,14757,1304],{"class":1164},[1143,14759,3366],{"class":2500},[1143,14761,5748],{"class":1164},[1143,14763,14764,14767,14769,14771,14773,14775,14777,14780,14782,14784,14786,14788],{"class":1145,"line":4139},[1143,14765,14766],{"class":1352},"                 review_count",[1143,14768,1485],{"class":1164},[1143,14770,1850],{"class":1849},[1143,14772,1304],{"class":1164},[1143,14774,4064],{"class":1505},[1143,14776,1349],{"class":1164},[1143,14778,14779],{"class":1352}," view_count",[1143,14781,1485],{"class":1164},[1143,14783,1850],{"class":1849},[1143,14785,1304],{"class":1164},[1143,14787,4064],{"class":1505},[1143,14789,1250],{"class":1164},[1143,14791,14792,14794,14796,14798,14800],{"class":1145,"line":4156},[1143,14793,1295],{"class":1294},[1143,14795,1165],{"class":1164},[1143,14797,1406],{"class":1300},[1143,14799,1304],{"class":1164},[1143,14801,14802],{"class":1160}," product_id\n",[1143,14804,14805,14807,14809,14811,14813],{"class":1145,"line":4161},[1143,14806,1295],{"class":1294},[1143,14808,1165],{"class":1164},[1143,14810,2095],{"class":1300},[1143,14812,1304],{"class":1164},[1143,14814,14815],{"class":1160}," name\n",[1143,14817,14818,14820,14822,14824,14826],{"class":1145,"line":4172},[1143,14819,1295],{"class":1294},[1143,14821,1165],{"class":1164},[1143,14823,2262],{"class":1300},[1143,14825,1304],{"class":1164},[1143,14827,14828],{"class":1160}," description\n",[1143,14830,14831,14833,14835,14837,14839],{"class":1145,"line":4183},[1143,14832,1295],{"class":1294},[1143,14834,1165],{"class":1164},[1143,14836,2283],{"class":1300},[1143,14838,1304],{"class":1164},[1143,14840,14841],{"class":1160}," price\n",[1143,14843,14844,14846,14848,14851,14853],{"class":1145,"line":4219},[1143,14845,1295],{"class":1294},[1143,14847,1165],{"class":1164},[1143,14849,14850],{"class":1300},"category_name",[1143,14852,1304],{"class":1164},[1143,14854,14855],{"class":1160}," category_name\n",[1143,14857,14858,14860,14862,14864,14866],{"class":1145,"line":4242},[1143,14859,1295],{"class":1294},[1143,14861,1165],{"class":1164},[1143,14863,1966],{"class":1300},[1143,14865,1304],{"class":1164},[1143,14867,14868],{"class":1160}," is_active\n",[1143,14870,14871,14873,14875,14877,14879],{"class":1145,"line":6730},[1143,14872,1295],{"class":1294},[1143,14874,1165],{"class":1164},[1143,14876,4560],{"class":1300},[1143,14878,1304],{"class":1164},[1143,14880,14881],{"class":1160}," created_at\n",[1143,14883,14884,14886,14888,14891,14893],{"class":1145,"line":6748},[1143,14885,1295],{"class":1294},[1143,14887,1165],{"class":1164},[1143,14889,14890],{"class":1300},"average_rating",[1143,14892,1304],{"class":1164},[1143,14894,14895],{"class":1160}," average_rating\n",[1143,14897,14898,14900,14902,14905,14907],{"class":1145,"line":6753},[1143,14899,1295],{"class":1294},[1143,14901,1165],{"class":1164},[1143,14903,14904],{"class":1300},"review_count",[1143,14906,1304],{"class":1164},[1143,14908,14909],{"class":1160}," review_count\n",[1143,14911,14912,14914,14916,14919,14921],{"class":1145,"line":6759},[1143,14913,1295],{"class":1294},[1143,14915,1165],{"class":1164},[1143,14917,14918],{"class":1300},"view_count",[1143,14920,1304],{"class":1164},[1143,14922,14923],{"class":1160}," view_count\n",[1143,14925,14926],{"class":1145,"line":6777},[1143,14927,1229],{"emptyLinePlaceholder":1228},[1143,14929,14930,14932,14934],{"class":1145,"line":6793},[1143,14931,1236],{"class":1235},[1143,14933,14057],{"class":1239},[1143,14935,1380],{"class":1164},[1143,14937,14938,14940,14943],{"class":1145,"line":6806},[1143,14939,1257],{"class":1256},[1143,14941,14942],{"class":1260},"Repository for product read models",[1143,14944,1264],{"class":1256},[1143,14946,14947],{"class":1145,"line":6822},[1143,14948,1270],{"class":1160},[1143,14950,14951,14953,14955,14957,14959,14961,14963,14965,14967,14969,14971,14973,14975,14977],{"class":1145,"line":6838},[1143,14952,1276],{"class":1235},[1143,14954,2716],{"class":1341},[1143,14956,1243],{"class":1164},[1143,14958,1286],{"class":1285},[1143,14960,1349],{"class":1164},[1143,14962,1358],{"class":1352},[1143,14964,1485],{"class":1164},[1143,14966,1850],{"class":1849},[1143,14968,1853],{"class":1164},[1143,14970,1856],{"class":1164},[1143,14972,2653],{"class":1160},[1143,14974,2090],{"class":1164},[1143,14976,14106],{"class":1160},[1143,14978,2742],{"class":1164},[1143,14980,14981,14983,14986],{"class":1145,"line":6852},[1143,14982,1366],{"class":1256},[1143,14984,14985],{"class":1260},"Get product read model by ID",[1143,14987,1264],{"class":1256},[1143,14989,14990,14992],{"class":1145,"line":6857},[1143,14991,1377],{"class":1156},[1143,14993,1380],{"class":1164},[1143,14995,14996],{"class":1145,"line":6862},[1143,14997,14998],{"class":1149},"            # Use optimized read model table\n",[1143,15000,15001,15003,15005,15008,15010,15012,15014,15016,15018,15020,15022,15024],{"class":1145,"line":6870},[1143,15002,1415],{"class":1160},[1143,15004,1389],{"class":1164},[1143,15006,15007],{"class":1160}," ProductReadModelTable",[1143,15009,1165],{"class":1164},[1143,15011,2140],{"class":1300},[1143,15013,1165],{"class":1164},[1143,15015,2145],{"class":1307},[1143,15017,1243],{"class":1164},[1143,15019,1406],{"class":1499},[1143,15021,1389],{"class":1164},[1143,15023,1406],{"class":1307},[1143,15025,1409],{"class":1164},[1143,15027,15028,15030,15032,15034,15037,15039,15041],{"class":1145,"line":6875},[1143,15029,1441],{"class":1156},[1143,15031,1392],{"class":1294},[1143,15033,1165],{"class":1164},[1143,15035,15036],{"class":1307},"_to_read_model",[1143,15038,1243],{"class":1164},[1143,15040,1449],{"class":1307},[1143,15042,1409],{"class":1164},[1143,15044,15045,15047,15049,15051,15053],{"class":1145,"line":6906},[1143,15046,1457],{"class":1156},[1143,15048,15007],{"class":1160},[1143,15050,1165],{"class":1164},[1143,15052,2811],{"class":1300},[1143,15054,1380],{"class":1164},[1143,15056,15057,15059],{"class":1145,"line":6916},[1143,15058,1441],{"class":1156},[1143,15060,2821],{"class":2500},[1143,15062,15063],{"class":1145,"line":6923},[1143,15064,1270],{"class":1160},[1143,15066,15067,15069,15071,15073,15075,15077,15080,15082,15084,15086,15089,15091,15093,15095,15098,15100,15102,15104,15106,15108,15110,15112],{"class":1145,"line":6964},[1143,15068,1276],{"class":1235},[1143,15070,3144],{"class":1341},[1143,15072,1243],{"class":1164},[1143,15074,1286],{"class":1285},[1143,15076,1349],{"class":1164},[1143,15078,15079],{"class":1352}," filters",[1143,15081,1485],{"class":1164},[1143,15083,2043],{"class":1849},[1143,15085,1349],{"class":1164},[1143,15087,15088],{"class":1352}," page",[1143,15090,1485],{"class":1164},[1143,15092,1850],{"class":1849},[1143,15094,1349],{"class":1164},[1143,15096,15097],{"class":1352}," page_size",[1143,15099,1485],{"class":1164},[1143,15101,1850],{"class":1849},[1143,15103,1853],{"class":1164},[1143,15105,1856],{"class":1164},[1143,15107,3030],{"class":1160},[1143,15109,2090],{"class":1164},[1143,15111,14106],{"class":1160},[1143,15113,2742],{"class":1164},[1143,15115,15116,15118,15121],{"class":1145,"line":6982},[1143,15117,1366],{"class":1256},[1143,15119,15120],{"class":1260},"Search products with filters",[1143,15122,1264],{"class":1256},[1143,15124,15125,15128,15130,15132,15134,15136,15138,15140,15142,15144,15146,15148],{"class":1145,"line":6995},[1143,15126,15127],{"class":1160},"        queryset ",[1143,15129,1389],{"class":1164},[1143,15131,15007],{"class":1160},[1143,15133,1165],{"class":1164},[1143,15135,2140],{"class":1300},[1143,15137,1165],{"class":1164},[1143,15139,2982],{"class":1307},[1143,15141,1243],{"class":1164},[1143,15143,1966],{"class":1499},[1143,15145,1389],{"class":1164},[1143,15147,3088],{"class":2500},[1143,15149,1409],{"class":1164},[1143,15151,15152],{"class":1145,"line":7002},[1143,15153,1946],{"class":1160},[1143,15155,15156,15158,15160,15162,15164,15166,15168],{"class":1145,"line":7007},[1143,15157,1901],{"class":1156},[1143,15159,1488],{"class":1475},[1143,15161,14266],{"class":1479},[1143,15163,1476],{"class":1475},[1143,15165,5053],{"class":1904},[1143,15167,15079],{"class":1160},[1143,15169,1380],{"class":1164},[1143,15171,15172,15175,15177,15180,15182,15184],{"class":1145,"line":7038},[1143,15173,15174],{"class":1160},"            queryset ",[1143,15176,1389],{"class":1164},[1143,15178,15179],{"class":1160}," queryset",[1143,15181,1165],{"class":1164},[1143,15183,2982],{"class":1307},[1143,15185,2224],{"class":1164},[1143,15187,15188,15190,15192,15194,15196,15198,15200,15202,15204,15206,15208],{"class":1145,"line":7048},[1143,15189,3209],{"class":1307},[1143,15191,1243],{"class":1164},[1143,15193,3214],{"class":1499},[1143,15195,1389],{"class":1164},[1143,15197,14443],{"class":1307},[1143,15199,2090],{"class":1164},[1143,15201,1476],{"class":1475},[1143,15203,14266],{"class":1479},[1143,15205,1476],{"class":1475},[1143,15207,5568],{"class":1164},[1143,15209,15210],{"class":1904}," |\n",[1143,15212,15213,15215,15217,15219,15221,15223,15225,15227,15229,15231],{"class":1145,"line":7068},[1143,15214,3209],{"class":1307},[1143,15216,1243],{"class":1164},[1143,15218,3232],{"class":1499},[1143,15220,1389],{"class":1164},[1143,15222,14443],{"class":1307},[1143,15224,2090],{"class":1164},[1143,15226,1476],{"class":1475},[1143,15228,14266],{"class":1479},[1143,15230,1476],{"class":1475},[1143,15232,2166],{"class":1164},[1143,15234,15235],{"class":1145,"line":7079},[1143,15236,6003],{"class":1164},[1143,15238,15239],{"class":1145,"line":7110},[1143,15240,1946],{"class":1160},[1143,15242,15243,15245,15247,15249,15251,15253,15255],{"class":1145,"line":7115},[1143,15244,1901],{"class":1156},[1143,15246,1488],{"class":1475},[1143,15248,2161],{"class":1479},[1143,15250,1476],{"class":1475},[1143,15252,5053],{"class":1904},[1143,15254,15079],{"class":1160},[1143,15256,1380],{"class":1164},[1143,15258,15259,15261,15263,15265,15267,15269,15271,15273,15275,15277,15279,15281,15283,15285],{"class":1145,"line":7146},[1143,15260,15174],{"class":1160},[1143,15262,1389],{"class":1164},[1143,15264,15179],{"class":1160},[1143,15266,1165],{"class":1164},[1143,15268,2982],{"class":1307},[1143,15270,1243],{"class":1164},[1143,15272,2161],{"class":1499},[1143,15274,1389],{"class":1164},[1143,15276,14443],{"class":1307},[1143,15278,2090],{"class":1164},[1143,15280,1476],{"class":1475},[1143,15282,2161],{"class":1479},[1143,15284,1476],{"class":1475},[1143,15286,2166],{"class":1164},[1143,15288,15289],{"class":1145,"line":7151},[1143,15290,1946],{"class":1160},[1143,15292,15293,15295,15297,15299,15301,15303,15305],{"class":1145,"line":7175},[1143,15294,1901],{"class":1156},[1143,15296,1488],{"class":1475},[1143,15298,14345],{"class":1479},[1143,15300,1476],{"class":1475},[1143,15302,5053],{"class":1904},[1143,15304,15079],{"class":1160},[1143,15306,1380],{"class":1164},[1143,15308,15309,15311,15313,15315,15317,15319,15321,15324,15326,15328,15330,15332,15334,15336],{"class":1145,"line":7185},[1143,15310,15174],{"class":1160},[1143,15312,1389],{"class":1164},[1143,15314,15179],{"class":1160},[1143,15316,1165],{"class":1164},[1143,15318,2982],{"class":1307},[1143,15320,1243],{"class":1164},[1143,15322,15323],{"class":1499},"price__gte",[1143,15325,1389],{"class":1164},[1143,15327,14443],{"class":1307},[1143,15329,2090],{"class":1164},[1143,15331,1476],{"class":1475},[1143,15333,14345],{"class":1479},[1143,15335,1476],{"class":1475},[1143,15337,2166],{"class":1164},[1143,15339,15340],{"class":1145,"line":7204},[1143,15341,1946],{"class":1160},[1143,15343,15344,15346,15348,15350,15352,15354,15356],{"class":1145,"line":7222},[1143,15345,1901],{"class":1156},[1143,15347,1488],{"class":1475},[1143,15349,14385],{"class":1479},[1143,15351,1476],{"class":1475},[1143,15353,5053],{"class":1904},[1143,15355,15079],{"class":1160},[1143,15357,1380],{"class":1164},[1143,15359,15360,15362,15364,15366,15368,15370,15372,15375,15377,15379,15381,15383,15385,15387],{"class":1145,"line":7239},[1143,15361,15174],{"class":1160},[1143,15363,1389],{"class":1164},[1143,15365,15179],{"class":1160},[1143,15367,1165],{"class":1164},[1143,15369,2982],{"class":1307},[1143,15371,1243],{"class":1164},[1143,15373,15374],{"class":1499},"price__lte",[1143,15376,1389],{"class":1164},[1143,15378,14443],{"class":1307},[1143,15380,2090],{"class":1164},[1143,15382,1476],{"class":1475},[1143,15384,14385],{"class":1479},[1143,15386,1476],{"class":1475},[1143,15388,2166],{"class":1164},[1143,15390,15391],{"class":1145,"line":7256},[1143,15392,1946],{"class":1160},[1143,15394,15395],{"class":1145,"line":7273},[1143,15396,15397],{"class":1149},"        # Pagination\n",[1143,15399,15400,15403,15405,15407,15410,15413,15415,15417,15419],{"class":1145,"line":7278},[1143,15401,15402],{"class":1160},"        offset ",[1143,15404,1389],{"class":1164},[1143,15406,4126],{"class":1164},[1143,15408,15409],{"class":1160},"page ",[1143,15411,15412],{"class":1904},"-",[1143,15414,14618],{"class":1505},[1143,15416,1853],{"class":1164},[1143,15418,2531],{"class":1904},[1143,15420,15421],{"class":1160}," page_size\n",[1143,15423,15424,15426,15428,15430,15432,15435,15437,15440,15442,15444],{"class":1145,"line":7284},[1143,15425,15127],{"class":1160},[1143,15427,1389],{"class":1164},[1143,15429,15179],{"class":1160},[1143,15431,2090],{"class":1164},[1143,15433,15434],{"class":1160},"offset",[1143,15436,1485],{"class":1164},[1143,15438,15439],{"class":1160},"offset ",[1143,15441,14607],{"class":1904},[1143,15443,15097],{"class":1160},[1143,15445,4883],{"class":1164},[1143,15447,15448],{"class":1145,"line":7306},[1143,15449,1946],{"class":1160},[1143,15451,15452,15454,15456,15458,15460,15462,15464,15466,15468,15470,15473,15475,15477],{"class":1145,"line":7325},[1143,15453,1999],{"class":1156},[1143,15455,4847],{"class":1164},[1143,15457,1286],{"class":1294},[1143,15459,1165],{"class":1164},[1143,15461,15036],{"class":1307},[1143,15463,1243],{"class":1164},[1143,15465,1449],{"class":1307},[1143,15467,1853],{"class":1164},[1143,15469,5251],{"class":1156},[1143,15471,15472],{"class":1160}," data ",[1143,15474,4859],{"class":1156},[1143,15476,15179],{"class":1160},[1143,15478,4883],{"class":1164},[1143,15480,15481],{"class":1145,"line":7341},[1143,15482,1270],{"class":1160},[1143,15484,15485,15487,15490,15492,15494,15496,15498,15500,15502,15504,15506,15508],{"class":1145,"line":7356},[1143,15486,1276],{"class":1235},[1143,15488,15489],{"class":1341}," count",[1143,15491,1243],{"class":1164},[1143,15493,1286],{"class":1285},[1143,15495,1349],{"class":1164},[1143,15497,15079],{"class":1352},[1143,15499,1485],{"class":1164},[1143,15501,2043],{"class":1849},[1143,15503,1853],{"class":1164},[1143,15505,1856],{"class":1164},[1143,15507,1850],{"class":1849},[1143,15509,1380],{"class":1164},[1143,15511,15512,15514,15517],{"class":1145,"line":7369},[1143,15513,1366],{"class":1256},[1143,15515,15516],{"class":1260},"Count products matching filters",[1143,15518,1264],{"class":1256},[1143,15520,15521],{"class":1145,"line":7375},[1143,15522,15523],{"class":1149},"        # Similar filtering logic as search\n",[1143,15525,15526,15528,15530,15532,15534,15536,15538,15540,15542,15544,15546,15548],{"class":1145,"line":7380},[1143,15527,15127],{"class":1160},[1143,15529,1389],{"class":1164},[1143,15531,15007],{"class":1160},[1143,15533,1165],{"class":1164},[1143,15535,2140],{"class":1300},[1143,15537,1165],{"class":1164},[1143,15539,2982],{"class":1307},[1143,15541,1243],{"class":1164},[1143,15543,1966],{"class":1499},[1143,15545,1389],{"class":1164},[1143,15547,3088],{"class":2500},[1143,15549,1409],{"class":1164},[1143,15551,15552],{"class":1145,"line":7387},[1143,15553,15554],{"class":1149},"        # Apply filters...\n",[1143,15556,15557,15559,15561,15563,15565],{"class":1145,"line":7392},[1143,15558,1999],{"class":1156},[1143,15560,15179],{"class":1160},[1143,15562,1165],{"class":1164},[1143,15564,14501],{"class":1307},[1143,15566,1311],{"class":1164},[1143,15568,15569],{"class":1145,"line":7407},[1143,15570,1270],{"class":1160},[1143,15572,15573,15575,15578,15580,15582,15584,15586,15588,15590,15592],{"class":1145,"line":7417},[1143,15574,1276],{"class":1235},[1143,15576,15577],{"class":1341}," _to_read_model",[1143,15579,1243],{"class":1164},[1143,15581,1286],{"class":1285},[1143,15583,1349],{"class":1164},[1143,15585,2038],{"class":1352},[1143,15587,1853],{"class":1164},[1143,15589,1856],{"class":1164},[1143,15591,14650],{"class":1160},[1143,15593,1380],{"class":1164},[1143,15595,15596,15598,15601],{"class":1145,"line":7422},[1143,15597,1366],{"class":1256},[1143,15599,15600],{"class":1260},"Convert table data to read model",[1143,15602,1264],{"class":1256},[1143,15604,15605,15607,15609],{"class":1145,"line":7444},[1143,15606,1999],{"class":1156},[1143,15608,14650],{"class":1307},[1143,15610,2224],{"class":1164},[1143,15612,15613,15615,15617,15619,15621,15623],{"class":1145,"line":7459},[1143,15614,13193],{"class":1499},[1143,15616,1389],{"class":1164},[1143,15618,1449],{"class":1307},[1143,15620,1165],{"class":1164},[1143,15622,1406],{"class":1300},[1143,15624,5748],{"class":1164},[1143,15626,15627,15629,15631,15633,15635,15637],{"class":1145,"line":7464},[1143,15628,2230],{"class":1499},[1143,15630,1389],{"class":1164},[1143,15632,1449],{"class":1307},[1143,15634,1165],{"class":1164},[1143,15636,2095],{"class":1300},[1143,15638,5748],{"class":1164},[1143,15640,15641,15643,15645,15647,15649,15651],{"class":1145,"line":7499},[1143,15642,2251],{"class":1499},[1143,15644,1389],{"class":1164},[1143,15646,1449],{"class":1307},[1143,15648,1165],{"class":1164},[1143,15650,2262],{"class":1300},[1143,15652,5748],{"class":1164},[1143,15654,15655,15657,15659,15661,15663,15665],{"class":1145,"line":7509},[1143,15656,2272],{"class":1499},[1143,15658,1389],{"class":1164},[1143,15660,1449],{"class":1307},[1143,15662,1165],{"class":1164},[1143,15664,2283],{"class":1300},[1143,15666,5748],{"class":1164},[1143,15668,15669,15672,15674,15676,15678,15680],{"class":1145,"line":7516},[1143,15670,15671],{"class":1499},"            category_name",[1143,15673,1389],{"class":1164},[1143,15675,1449],{"class":1307},[1143,15677,1165],{"class":1164},[1143,15679,14850],{"class":1300},[1143,15681,5748],{"class":1164},[1143,15683,15684,15687,15689,15691,15693,15695],{"class":1145,"line":7522},[1143,15685,15686],{"class":1499},"            is_active",[1143,15688,1389],{"class":1164},[1143,15690,1449],{"class":1307},[1143,15692,1165],{"class":1164},[1143,15694,1966],{"class":1300},[1143,15696,5748],{"class":1164},[1143,15698,15699,15701,15703,15705,15707,15709],{"class":1145,"line":7531},[1143,15700,13252],{"class":1499},[1143,15702,1389],{"class":1164},[1143,15704,1449],{"class":1307},[1143,15706,1165],{"class":1164},[1143,15708,4560],{"class":1300},[1143,15710,5748],{"class":1164},[1143,15712,15713,15716,15718,15720,15722,15724],{"class":1145,"line":7550},[1143,15714,15715],{"class":1499},"            average_rating",[1143,15717,1389],{"class":1164},[1143,15719,1449],{"class":1307},[1143,15721,1165],{"class":1164},[1143,15723,14890],{"class":1300},[1143,15725,5748],{"class":1164},[1143,15727,15728,15731,15733,15735,15737,15739],{"class":1145,"line":7555},[1143,15729,15730],{"class":1499},"            review_count",[1143,15732,1389],{"class":1164},[1143,15734,1449],{"class":1307},[1143,15736,1165],{"class":1164},[1143,15738,14904],{"class":1300},[1143,15740,5748],{"class":1164},[1143,15742,15743,15746,15748,15750,15752],{"class":1145,"line":7577},[1143,15744,15745],{"class":1499},"            view_count",[1143,15747,1389],{"class":1164},[1143,15749,1449],{"class":1307},[1143,15751,1165],{"class":1164},[1143,15753,15754],{"class":1300},"view_count\n",[1143,15756,15757],{"class":1145,"line":7605},[1143,15758,2304],{"class":1164},[1143,15760,15761],{"class":1145,"line":7622},[1143,15762,1229],{"emptyLinePlaceholder":1228},[1143,15764,15765],{"class":1145,"line":7635},[1143,15766,15767],{"class":1149},"# Read Model Table (Denormalized for performance)\n",[1143,15769,15770,15772,15774,15776,15778,15780,15782],{"class":1145,"line":7660},[1143,15771,1236],{"class":1235},[1143,15773,15007],{"class":1239},[1143,15775,1243],{"class":1164},[1143,15777,3447],{"class":1246},[1143,15779,1165],{"class":1164},[1143,15781,3452],{"class":1246},[1143,15783,1250],{"class":1164},[1143,15785,15786,15788,15791],{"class":1145,"line":7665},[1143,15787,1257],{"class":1256},[1143,15789,15790],{"class":1260},"Denormalized table for product read operations",[1143,15792,1264],{"class":1256},[1143,15794,15795],{"class":1145,"line":7670},[1143,15796,1270],{"class":1160},[1143,15798,15799,15801,15803,15805,15807,15809,15811,15813,15815,15817,15819,15822,15824,15826],{"class":1145,"line":7683},[1143,15800,8593],{"class":1160},[1143,15802,1389],{"class":1164},[1143,15804,3480],{"class":1160},[1143,15806,1165],{"class":1164},[1143,15808,8375],{"class":1307},[1143,15810,1243],{"class":1164},[1143,15812,12248],{"class":1499},[1143,15814,1389],{"class":1164},[1143,15816,3088],{"class":2500},[1143,15818,1349],{"class":1164},[1143,15820,15821],{"class":1499}," db_index",[1143,15823,1389],{"class":1164},[1143,15825,3088],{"class":2500},[1143,15827,1409],{"class":1164},[1143,15829,15830,15832,15834,15836,15838,15840,15842,15844,15846,15848,15850,15852,15854,15856],{"class":1145,"line":7697},[1143,15831,3475],{"class":1160},[1143,15833,1389],{"class":1164},[1143,15835,3480],{"class":1160},[1143,15837,1165],{"class":1164},[1143,15839,3485],{"class":1307},[1143,15841,1243],{"class":1164},[1143,15843,3490],{"class":1499},[1143,15845,1389],{"class":1164},[1143,15847,3495],{"class":1505},[1143,15849,1349],{"class":1164},[1143,15851,15821],{"class":1499},[1143,15853,1389],{"class":1164},[1143,15855,3088],{"class":2500},[1143,15857,1409],{"class":1164},[1143,15859,15860,15862,15864,15866,15868,15870],{"class":1145,"line":7725},[1143,15861,3512],{"class":1160},[1143,15863,1389],{"class":1164},[1143,15865,3480],{"class":1160},[1143,15867,1165],{"class":1164},[1143,15869,3521],{"class":1307},[1143,15871,1311],{"class":1164},[1143,15873,15874,15876,15878,15880,15882,15884,15886,15888,15890,15892,15894,15896,15898,15900,15902,15904,15906,15908],{"class":1145,"line":7732},[1143,15875,3529],{"class":1160},[1143,15877,1389],{"class":1164},[1143,15879,3480],{"class":1160},[1143,15881,1165],{"class":1164},[1143,15883,3538],{"class":1307},[1143,15885,1243],{"class":1164},[1143,15887,3543],{"class":1499},[1143,15889,1389],{"class":1164},[1143,15891,3548],{"class":1505},[1143,15893,1349],{"class":1164},[1143,15895,3553],{"class":1499},[1143,15897,1389],{"class":1164},[1143,15899,3558],{"class":1505},[1143,15901,1349],{"class":1164},[1143,15903,15821],{"class":1499},[1143,15905,1389],{"class":1164},[1143,15907,3088],{"class":2500},[1143,15909,1409],{"class":1164},[1143,15911,15912,15915,15917,15919,15921,15923,15925,15928,15930,15932],{"class":1145,"line":7737},[1143,15913,15914],{"class":1160},"    category_id ",[1143,15916,1389],{"class":1164},[1143,15918,3480],{"class":1160},[1143,15920,1165],{"class":1164},[1143,15922,8375],{"class":1307},[1143,15924,1243],{"class":1164},[1143,15926,15927],{"class":1499},"db_index",[1143,15929,1389],{"class":1164},[1143,15931,3088],{"class":2500},[1143,15933,1409],{"class":1164},[1143,15935,15936,15939,15941,15943,15945,15947,15949,15951,15953,15956],{"class":1145,"line":7752},[1143,15937,15938],{"class":1160},"    category_name ",[1143,15940,1389],{"class":1164},[1143,15942,3480],{"class":1160},[1143,15944,1165],{"class":1164},[1143,15946,3485],{"class":1307},[1143,15948,1243],{"class":1164},[1143,15950,3490],{"class":1499},[1143,15952,1389],{"class":1164},[1143,15954,15955],{"class":1505},"100",[1143,15957,1409],{"class":1164},[1143,15959,15960,15962,15964,15966,15968,15970,15972,15974,15976,15978,15980,15982,15984,15986],{"class":1145,"line":7762},[1143,15961,3607],{"class":1160},[1143,15963,1389],{"class":1164},[1143,15965,3480],{"class":1160},[1143,15967,1165],{"class":1164},[1143,15969,3616],{"class":1307},[1143,15971,1243],{"class":1164},[1143,15973,3621],{"class":1499},[1143,15975,1389],{"class":1164},[1143,15977,3088],{"class":2500},[1143,15979,1349],{"class":1164},[1143,15981,15821],{"class":1499},[1143,15983,1389],{"class":1164},[1143,15985,3088],{"class":2500},[1143,15987,1409],{"class":1164},[1143,15989,15990,15992,15994,15996,15998,16000,16002,16004,16006,16008],{"class":1145,"line":7767},[1143,15991,3658],{"class":1160},[1143,15993,1389],{"class":1164},[1143,15995,3480],{"class":1160},[1143,15997,1165],{"class":1164},[1143,15999,3667],{"class":1307},[1143,16001,1243],{"class":1164},[1143,16003,15927],{"class":1499},[1143,16005,1389],{"class":1164},[1143,16007,3088],{"class":2500},[1143,16009,1409],{"class":1164},[1143,16011,16012,16015,16017,16019,16021,16023,16025,16027,16029,16032,16034,16036,16038,16040,16042,16045,16047,16049],{"class":1145,"line":7785},[1143,16013,16014],{"class":1160},"    average_rating ",[1143,16016,1389],{"class":1164},[1143,16018,3480],{"class":1160},[1143,16020,1165],{"class":1164},[1143,16022,3538],{"class":1307},[1143,16024,1243],{"class":1164},[1143,16026,3543],{"class":1499},[1143,16028,1389],{"class":1164},[1143,16030,16031],{"class":1505},"3",[1143,16033,1349],{"class":1164},[1143,16035,3553],{"class":1499},[1143,16037,1389],{"class":1164},[1143,16039,3558],{"class":1505},[1143,16041,1349],{"class":1164},[1143,16043,16044],{"class":1499}," null",[1143,16046,1389],{"class":1164},[1143,16048,3088],{"class":2500},[1143,16050,1409],{"class":1164},[1143,16052,16053,16056,16058,16060,16062,16064,16066,16068,16070,16072],{"class":1145,"line":7800},[1143,16054,16055],{"class":1160},"    review_count ",[1143,16057,1389],{"class":1164},[1143,16059,3480],{"class":1160},[1143,16061,1165],{"class":1164},[1143,16063,8375],{"class":1307},[1143,16065,1243],{"class":1164},[1143,16067,3621],{"class":1499},[1143,16069,1389],{"class":1164},[1143,16071,8454],{"class":1505},[1143,16073,1409],{"class":1164},[1143,16075,16076,16079,16081,16083,16085,16087,16089,16091,16093,16095],{"class":1145,"line":7805},[1143,16077,16078],{"class":1160},"    view_count ",[1143,16080,1389],{"class":1164},[1143,16082,3480],{"class":1160},[1143,16084,1165],{"class":1164},[1143,16086,8375],{"class":1307},[1143,16088,1243],{"class":1164},[1143,16090,3621],{"class":1499},[1143,16092,1389],{"class":1164},[1143,16094,8454],{"class":1505},[1143,16096,1409],{"class":1164},[1143,16098,16099],{"class":1145,"line":7836},[1143,16100,1270],{"class":1160},[1143,16102,16103,16105,16107],{"class":1145,"line":7846},[1143,16104,4164],{"class":1235},[1143,16106,4167],{"class":1239},[1143,16108,1380],{"class":1164},[1143,16110,16111,16113,16115],{"class":1145,"line":7867},[1143,16112,4175],{"class":1160},[1143,16114,1389],{"class":1164},[1143,16116,4180],{"class":1164},[1143,16118,16119,16121,16123,16125,16127,16129,16131,16133,16135,16137,16139,16141,16143,16145],{"class":1145,"line":7872},[1143,16120,4186],{"class":1160},[1143,16122,1165],{"class":1164},[1143,16124,4191],{"class":1307},[1143,16126,1243],{"class":1164},[1143,16128,4196],{"class":1499},[1143,16130,4199],{"class":1164},[1143,16132,1476],{"class":1475},[1143,16134,2161],{"class":1479},[1143,16136,1476],{"class":1475},[1143,16138,1349],{"class":1164},[1143,16140,1488],{"class":1475},[1143,16142,1966],{"class":1479},[1143,16144,1476],{"class":1475},[1143,16146,4216],{"class":1164},[1143,16148,16149,16151,16153,16155,16157,16159,16161,16163,16165,16167,16169,16171,16173,16175],{"class":1145,"line":7879},[1143,16150,4186],{"class":1160},[1143,16152,1165],{"class":1164},[1143,16154,4191],{"class":1307},[1143,16156,1243],{"class":1164},[1143,16158,4196],{"class":1499},[1143,16160,4199],{"class":1164},[1143,16162,1476],{"class":1475},[1143,16164,2283],{"class":1479},[1143,16166,1476],{"class":1475},[1143,16168,1349],{"class":1164},[1143,16170,1488],{"class":1475},[1143,16172,1966],{"class":1479},[1143,16174,1476],{"class":1475},[1143,16176,4216],{"class":1164},[1143,16178,16179,16181,16183,16185,16187,16189,16191,16193,16195,16197,16199,16201,16203,16205],{"class":1145,"line":7885},[1143,16180,4186],{"class":1160},[1143,16182,1165],{"class":1164},[1143,16184,4191],{"class":1307},[1143,16186,1243],{"class":1164},[1143,16188,4196],{"class":1499},[1143,16190,4199],{"class":1164},[1143,16192,1476],{"class":1475},[1143,16194,2095],{"class":1479},[1143,16196,1476],{"class":1475},[1143,16198,1349],{"class":1164},[1143,16200,1488],{"class":1475},[1143,16202,1966],{"class":1479},[1143,16204,1476],{"class":1475},[1143,16206,4216],{"class":1164},[1143,16208,16209],{"class":1145,"line":7898},[1143,16210,4245],{"class":1164},[1143,16212,16213],{"class":1145,"line":7937},[1143,16214,1229],{"emptyLinePlaceholder":1228},[1143,16216,16217],{"class":1145,"line":7971},[1143,16218,16219],{"class":1149},"# Event Store for CQRS\n",[1143,16221,16222,16224,16227],{"class":1145,"line":7979},[1143,16223,1236],{"class":1235},[1143,16225,16226],{"class":1239}," Event",[1143,16228,1380],{"class":1164},[1143,16230,16231,16233,16236],{"class":1145,"line":7984},[1143,16232,1257],{"class":1256},[1143,16234,16235],{"class":1260},"Base class for domain events",[1143,16237,1264],{"class":1256},[1143,16239,16240],{"class":1145,"line":7990},[1143,16241,1270],{"class":1160},[1143,16243,16244,16246,16248,16250,16252,16254,16257,16259,16261,16263,16266,16268,16270,16272],{"class":1145,"line":8003},[1143,16245,1276],{"class":1235},[1143,16247,1280],{"class":1279},[1143,16249,1243],{"class":1164},[1143,16251,1286],{"class":1285},[1143,16253,1349],{"class":1164},[1143,16255,16256],{"class":1352}," event_type",[1143,16258,1485],{"class":1164},[1143,16260,2848],{"class":1849},[1143,16262,1349],{"class":1164},[1143,16264,16265],{"class":1352}," aggregate_id",[1143,16267,1485],{"class":1164},[1143,16269,1850],{"class":1849},[1143,16271,1349],{"class":1164},[1143,16273,5736],{"class":1160},[1143,16275,16276,16279,16281,16283,16285,16288,16290,16292],{"class":1145,"line":8042},[1143,16277,16278],{"class":1352},"                 event_data",[1143,16280,1485],{"class":1164},[1143,16282,2043],{"class":1849},[1143,16284,1349],{"class":1164},[1143,16286,16287],{"class":1352}," occurred_at",[1143,16289,1485],{"class":1164},[1143,16291,14740],{"class":1160},[1143,16293,1250],{"class":1164},[1143,16295,16296,16298,16300,16303,16305],{"class":1145,"line":8047},[1143,16297,1295],{"class":1294},[1143,16299,1165],{"class":1164},[1143,16301,16302],{"class":1300},"event_type",[1143,16304,1304],{"class":1164},[1143,16306,16307],{"class":1160}," event_type\n",[1143,16309,16310,16312,16314,16317,16319],{"class":1145,"line":8060},[1143,16311,1295],{"class":1294},[1143,16313,1165],{"class":1164},[1143,16315,16316],{"class":1300},"aggregate_id",[1143,16318,1304],{"class":1164},[1143,16320,16321],{"class":1160}," aggregate_id\n",[1143,16323,16324,16326,16328,16331,16333],{"class":1145,"line":8067},[1143,16325,1295],{"class":1294},[1143,16327,1165],{"class":1164},[1143,16329,16330],{"class":1300},"event_data",[1143,16332,1304],{"class":1164},[1143,16334,16335],{"class":1160}," event_data\n",[1143,16337,16338,16340,16342,16345,16347],{"class":1145,"line":8072},[1143,16339,1295],{"class":1294},[1143,16341,1165],{"class":1164},[1143,16343,16344],{"class":1300},"occurred_at",[1143,16346,1304],{"class":1164},[1143,16348,16349],{"class":1160}," occurred_at\n",[1143,16351,16352],{"class":1145,"line":8085},[1143,16353,1229],{"emptyLinePlaceholder":1228},[1143,16355,16356,16358,16360],{"class":1145,"line":8111},[1143,16357,1236],{"class":1235},[1143,16359,12944],{"class":1239},[1143,16361,1380],{"class":1164},[1143,16363,16364,16366,16369],{"class":1145,"line":8118},[1143,16365,1257],{"class":1256},[1143,16367,16368],{"class":1260},"Store for domain events",[1143,16370,1264],{"class":1256},[1143,16372,16373],{"class":1145,"line":8123},[1143,16374,1270],{"class":1160},[1143,16376,16377,16379,16382,16384,16386,16388,16391,16393,16395,16397,16399,16401],{"class":1145,"line":8154},[1143,16378,1276],{"class":1235},[1143,16380,16381],{"class":1341}," append",[1143,16383,1243],{"class":1164},[1143,16385,1286],{"class":1285},[1143,16387,1349],{"class":1164},[1143,16389,16390],{"class":1352}," event",[1143,16392,1485],{"class":1164},[1143,16394,16226],{"class":1160},[1143,16396,1853],{"class":1164},[1143,16398,1856],{"class":1164},[1143,16400,3366],{"class":2500},[1143,16402,1380],{"class":1164},[1143,16404,16405,16407,16410],{"class":1145,"line":8164},[1143,16406,1366],{"class":1256},[1143,16408,16409],{"class":1260},"Append event to store",[1143,16411,1264],{"class":1256},[1143,16413,16414,16417,16419,16421,16423,16425],{"class":1145,"line":8183},[1143,16415,16416],{"class":1160},"        EventStoreTable",[1143,16418,1165],{"class":1164},[1143,16420,2140],{"class":1300},[1143,16422,1165],{"class":1164},[1143,16424,6658],{"class":1307},[1143,16426,2224],{"class":1164},[1143,16428,16429,16432,16434,16436,16438,16440],{"class":1145,"line":8188},[1143,16430,16431],{"class":1499},"            event_type",[1143,16433,1389],{"class":1164},[1143,16435,13284],{"class":1307},[1143,16437,1165],{"class":1164},[1143,16439,16302],{"class":1300},[1143,16441,5748],{"class":1164},[1143,16443,16444,16447,16449,16451,16453,16455],{"class":1145,"line":8195},[1143,16445,16446],{"class":1499},"            aggregate_id",[1143,16448,1389],{"class":1164},[1143,16450,13284],{"class":1307},[1143,16452,1165],{"class":1164},[1143,16454,16316],{"class":1300},[1143,16456,5748],{"class":1164},[1143,16458,16459,16462,16464,16466,16468,16470],{"class":1145,"line":8208},[1143,16460,16461],{"class":1499},"            event_data",[1143,16463,1389],{"class":1164},[1143,16465,13284],{"class":1307},[1143,16467,1165],{"class":1164},[1143,16469,16330],{"class":1300},[1143,16471,5748],{"class":1164},[1143,16473,16474,16477,16479,16481,16483],{"class":1145,"line":8246},[1143,16475,16476],{"class":1499},"            occurred_at",[1143,16478,1389],{"class":1164},[1143,16480,13284],{"class":1307},[1143,16482,1165],{"class":1164},[1143,16484,16485],{"class":1300},"occurred_at\n",[1143,16487,16488],{"class":1145,"line":8251},[1143,16489,2304],{"class":1164},[1143,16491,16492],{"class":1145,"line":8262},[1143,16493,1270],{"class":1160},[1143,16495,16496,16498,16501,16503,16505,16507,16509,16511,16513,16515,16517,16519,16521,16524],{"class":1145,"line":8269},[1143,16497,1276],{"class":1235},[1143,16499,16500],{"class":1341}," get_events",[1143,16502,1243],{"class":1164},[1143,16504,1286],{"class":1285},[1143,16506,1349],{"class":1164},[1143,16508,16265],{"class":1352},[1143,16510,1485],{"class":1164},[1143,16512,1850],{"class":1849},[1143,16514,1853],{"class":1164},[1143,16516,1856],{"class":1164},[1143,16518,3030],{"class":1160},[1143,16520,2090],{"class":1164},[1143,16522,16523],{"class":1160},"Event",[1143,16525,2742],{"class":1164},[1143,16527,16528,16530,16533],{"class":1145,"line":8274},[1143,16529,1366],{"class":1256},[1143,16531,16532],{"class":1260},"Get all events for an aggregate",[1143,16534,1264],{"class":1256},[1143,16536,16537,16540,16542,16545,16547,16549,16551,16553],{"class":1145,"line":8287},[1143,16538,16539],{"class":1160},"        events ",[1143,16541,1389],{"class":1164},[1143,16543,16544],{"class":1160}," EventStoreTable",[1143,16546,1165],{"class":1164},[1143,16548,2140],{"class":1300},[1143,16550,1165],{"class":1164},[1143,16552,2982],{"class":1307},[1143,16554,2224],{"class":1164},[1143,16556,16557,16559,16561],{"class":1145,"line":8313},[1143,16558,16446],{"class":1499},[1143,16560,1389],{"class":1164},[1143,16562,16563],{"class":1307},"aggregate_id\n",[1143,16565,16566,16568,16570,16572,16574,16576,16578],{"class":1145,"line":8320},[1143,16567,7082],{"class":1164},[1143,16569,3116],{"class":1307},[1143,16571,1243],{"class":1164},[1143,16573,1476],{"class":1475},[1143,16575,16344],{"class":1479},[1143,16577,1476],{"class":1475},[1143,16579,1409],{"class":1164},[1143,16581,16582],{"class":1145,"line":8325},[1143,16583,1946],{"class":1160},[1143,16585,16586,16588],{"class":1145,"line":8331},[1143,16587,1999],{"class":1156},[1143,16589,4180],{"class":1164},[1143,16591,16592,16595],{"class":1145,"line":8348},[1143,16593,16594],{"class":1307},"            Event",[1143,16596,2224],{"class":1164},[1143,16598,16599,16602,16604,16606,16608,16610],{"class":1145,"line":8358},[1143,16600,16601],{"class":1499},"                event_type",[1143,16603,1389],{"class":1164},[1143,16605,7716],{"class":1307},[1143,16607,1165],{"class":1164},[1143,16609,16302],{"class":1300},[1143,16611,5748],{"class":1164},[1143,16613,16614,16617,16619,16621,16623,16625],{"class":1145,"line":8363},[1143,16615,16616],{"class":1499},"                aggregate_id",[1143,16618,1389],{"class":1164},[1143,16620,7716],{"class":1307},[1143,16622,1165],{"class":1164},[1143,16624,16316],{"class":1300},[1143,16626,5748],{"class":1164},[1143,16628,16629,16632,16634,16636,16638,16640],{"class":1145,"line":8380},[1143,16630,16631],{"class":1499},"                event_data",[1143,16633,1389],{"class":1164},[1143,16635,7716],{"class":1307},[1143,16637,1165],{"class":1164},[1143,16639,16330],{"class":1300},[1143,16641,5748],{"class":1164},[1143,16643,16644,16647,16649,16651,16653],{"class":1145,"line":8418},[1143,16645,16646],{"class":1499},"                occurred_at",[1143,16648,1389],{"class":1164},[1143,16650,7716],{"class":1307},[1143,16652,1165],{"class":1164},[1143,16654,16485],{"class":1300},[1143,16656,16657],{"class":1145,"line":8459},[1143,16658,6003],{"class":1164},[1143,16660,16661,16663,16666,16668],{"class":1145,"line":8482},[1143,16662,6762],{"class":1156},[1143,16664,16665],{"class":1160}," e ",[1143,16667,4859],{"class":1156},[1143,16669,16670],{"class":1160}," events\n",[1143,16672,16673],{"class":1145,"line":8506},[1143,16674,4245],{"class":1164},[1143,16676,16677],{"class":1145,"line":8511},[1143,16678,1229],{"emptyLinePlaceholder":1228},[1143,16680,16681,16683,16685,16687,16689,16691,16693],{"class":1145,"line":8529},[1143,16682,1236],{"class":1235},[1143,16684,16544],{"class":1239},[1143,16686,1243],{"class":1164},[1143,16688,3447],{"class":1246},[1143,16690,1165],{"class":1164},[1143,16692,3452],{"class":1246},[1143,16694,1250],{"class":1164},[1143,16696,16697,16699,16702],{"class":1145,"line":8539},[1143,16698,1257],{"class":1256},[1143,16700,16701],{"class":1260},"Table for storing domain events",[1143,16703,1264],{"class":1256},[1143,16705,16706],{"class":1145,"line":8544},[1143,16707,1270],{"class":1160},[1143,16709,16710,16713,16715,16717,16719,16721,16723,16725,16727,16729],{"class":1145,"line":8590},[1143,16711,16712],{"class":1160},"    event_type ",[1143,16714,1389],{"class":1164},[1143,16716,3480],{"class":1160},[1143,16718,1165],{"class":1164},[1143,16720,3485],{"class":1307},[1143,16722,1243],{"class":1164},[1143,16724,3490],{"class":1499},[1143,16726,1389],{"class":1164},[1143,16728,15955],{"class":1505},[1143,16730,1409],{"class":1164},[1143,16732,16733,16736,16738,16740,16742,16744,16746,16748,16750,16752],{"class":1145,"line":8606},[1143,16734,16735],{"class":1160},"    aggregate_id ",[1143,16737,1389],{"class":1164},[1143,16739,3480],{"class":1160},[1143,16741,1165],{"class":1164},[1143,16743,8375],{"class":1307},[1143,16745,1243],{"class":1164},[1143,16747,15927],{"class":1499},[1143,16749,1389],{"class":1164},[1143,16751,3088],{"class":2500},[1143,16753,1409],{"class":1164},[1143,16755,16756,16759,16761,16763,16765,16768],{"class":1145,"line":8622},[1143,16757,16758],{"class":1160},"    event_data ",[1143,16760,1389],{"class":1164},[1143,16762,3480],{"class":1160},[1143,16764,1165],{"class":1164},[1143,16766,16767],{"class":1307},"JSONField",[1143,16769,1311],{"class":1164},[1143,16771,16772,16775,16777,16779,16781,16783,16785,16787,16789,16791],{"class":1145,"line":8653},[1143,16773,16774],{"class":1160},"    occurred_at ",[1143,16776,1389],{"class":1164},[1143,16778,3480],{"class":1160},[1143,16780,1165],{"class":1164},[1143,16782,3667],{"class":1307},[1143,16784,1243],{"class":1164},[1143,16786,15927],{"class":1499},[1143,16788,1389],{"class":1164},[1143,16790,3088],{"class":2500},[1143,16792,1409],{"class":1164},[1143,16794,16795],{"class":1145,"line":8658},[1143,16796,1270],{"class":1160},[1143,16798,16799,16801,16803],{"class":1145,"line":8664},[1143,16800,4164],{"class":1235},[1143,16802,4167],{"class":1239},[1143,16804,1380],{"class":1164},[1143,16806,16807,16809,16811],{"class":1145,"line":8674},[1143,16808,4175],{"class":1160},[1143,16810,1389],{"class":1164},[1143,16812,4180],{"class":1164},[1143,16814,16815,16817,16819,16821,16823,16825,16827,16829,16831,16833,16835,16837,16839,16841],{"class":1145,"line":8684},[1143,16816,4186],{"class":1160},[1143,16818,1165],{"class":1164},[1143,16820,4191],{"class":1307},[1143,16822,1243],{"class":1164},[1143,16824,4196],{"class":1499},[1143,16826,4199],{"class":1164},[1143,16828,1476],{"class":1475},[1143,16830,16316],{"class":1479},[1143,16832,1476],{"class":1475},[1143,16834,1349],{"class":1164},[1143,16836,1488],{"class":1475},[1143,16838,16344],{"class":1479},[1143,16840,1476],{"class":1475},[1143,16842,4216],{"class":1164},[1143,16844,16845,16847,16849,16851,16853,16855,16857,16859,16861,16863,16865,16867,16869,16871],{"class":1145,"line":8689},[1143,16846,4186],{"class":1160},[1143,16848,1165],{"class":1164},[1143,16850,4191],{"class":1307},[1143,16852,1243],{"class":1164},[1143,16854,4196],{"class":1499},[1143,16856,4199],{"class":1164},[1143,16858,1476],{"class":1475},[1143,16860,16302],{"class":1479},[1143,16862,1476],{"class":1475},[1143,16864,1349],{"class":1164},[1143,16866,1488],{"class":1475},[1143,16868,16344],{"class":1479},[1143,16870,1476],{"class":1475},[1143,16872,4216],{"class":1164},[1143,16874,16875],{"class":1145,"line":8702},[1143,16876,4245],{"class":1164},[1143,16878,16879],{"class":1145,"line":8717},[1143,16880,1229],{"emptyLinePlaceholder":1228},[1143,16882,16883],{"class":1145,"line":8722},[1143,16884,16885],{"class":1149},"# Command and Query Bus\n",[1143,16887,16888,16890,16893],{"class":1145,"line":8746},[1143,16889,1236],{"class":1235},[1143,16891,16892],{"class":1239}," CommandBus",[1143,16894,1380],{"class":1164},[1143,16896,16897,16899,16902],{"class":1145,"line":8756},[1143,16898,1257],{"class":1256},[1143,16900,16901],{"class":1260},"Bus for dispatching commands to handlers",[1143,16903,1264],{"class":1256},[1143,16905,16906],{"class":1145,"line":8777},[1143,16907,1270],{"class":1160},[1143,16909,16910,16912,16914,16916,16918],{"class":1145,"line":8782},[1143,16911,1276],{"class":1235},[1143,16913,1280],{"class":1279},[1143,16915,1243],{"class":1164},[1143,16917,1286],{"class":1285},[1143,16919,1250],{"class":1164},[1143,16921,16922,16924,16926,16929,16931],{"class":1145,"line":8799},[1143,16923,1295],{"class":1294},[1143,16925,1165],{"class":1164},[1143,16927,16928],{"class":1300},"handlers",[1143,16930,1304],{"class":1164},[1143,16932,8714],{"class":1164},[1143,16934,16935],{"class":1145,"line":8809},[1143,16936,1270],{"class":1160},[1143,16938,16939,16941,16944,16946,16948,16950,16953,16955,16958,16960,16963,16965,16967],{"class":1145,"line":8830},[1143,16940,1276],{"class":1235},[1143,16942,16943],{"class":1341}," register_handler",[1143,16945,1243],{"class":1164},[1143,16947,1286],{"class":1285},[1143,16949,1349],{"class":1164},[1143,16951,16952],{"class":1352}," command_type",[1143,16954,1485],{"class":1164},[1143,16956,16957],{"class":1849}," type",[1143,16959,1349],{"class":1164},[1143,16961,16962],{"class":1352}," handler",[1143,16964,1485],{"class":1164},[1143,16966,12826],{"class":1160},[1143,16968,1250],{"class":1164},[1143,16970,16971,16973,16976],{"class":1145,"line":8835},[1143,16972,1366],{"class":1256},[1143,16974,16975],{"class":1260},"Register command handler",[1143,16977,1264],{"class":1256},[1143,16979,16980,16982,16984,16986,16988,16991,16993,16995],{"class":1145,"line":8841},[1143,16981,1295],{"class":1294},[1143,16983,1165],{"class":1164},[1143,16985,16928],{"class":1300},[1143,16987,2090],{"class":1164},[1143,16989,16990],{"class":1300},"command_type",[1143,16992,4503],{"class":1164},[1143,16994,1304],{"class":1164},[1143,16996,16997],{"class":1160}," handler\n",[1143,16999,17000],{"class":1145,"line":8852},[1143,17001,1270],{"class":1160},[1143,17003,17004,17006,17009,17011,17013,17015,17017,17019,17021,17023],{"class":1145,"line":8862},[1143,17005,1276],{"class":1235},[1143,17007,17008],{"class":1341}," dispatch",[1143,17010,1243],{"class":1164},[1143,17012,1286],{"class":1285},[1143,17014,1349],{"class":1164},[1143,17016,12867],{"class":1352},[1143,17018,1853],{"class":1164},[1143,17020,1856],{"class":1164},[1143,17022,12874],{"class":1279},[1143,17024,1380],{"class":1164},[1143,17026,17027,17029,17032],{"class":1145,"line":8874},[1143,17028,1366],{"class":1256},[1143,17030,17031],{"class":1260},"Dispatch command to appropriate handler",[1143,17033,1264],{"class":1256},[1143,17035,17036,17039,17041,17043,17045,17047],{"class":1145,"line":8879},[1143,17037,17038],{"class":1160},"        command_type ",[1143,17040,1389],{"class":1164},[1143,17042,16957],{"class":1849},[1143,17044,1243],{"class":1164},[1143,17046,13035],{"class":1307},[1143,17048,1409],{"class":1164},[1143,17050,17051,17054,17056,17058,17060,17062,17064,17066,17068,17070],{"class":1145,"line":8885},[1143,17052,17053],{"class":1160},"        handler ",[1143,17055,1389],{"class":1164},[1143,17057,1392],{"class":1294},[1143,17059,1165],{"class":1164},[1143,17061,16928],{"class":1300},[1143,17063,1165],{"class":1164},[1143,17065,2145],{"class":1307},[1143,17067,1243],{"class":1164},[1143,17069,16990],{"class":1307},[1143,17071,1409],{"class":1164},[1143,17073,17074],{"class":1145,"line":8907},[1143,17075,1946],{"class":1160},[1143,17077,17078,17080,17082,17084],{"class":1145,"line":8936},[1143,17079,1901],{"class":1156},[1143,17081,1905],{"class":1904},[1143,17083,16962],{"class":1160},[1143,17085,1380],{"class":1164},[1143,17087,17088,17090,17092,17094,17096,17099,17101,17103,17105,17107],{"class":1145,"line":8960},[1143,17089,1916],{"class":1156},[1143,17091,4085],{"class":1849},[1143,17093,1243],{"class":1164},[1143,17095,1923],{"class":1235},[1143,17097,17098],{"class":1479},"\"No handler registered for ",[1143,17100,1930],{"class":1929},[1143,17102,16990],{"class":1307},[1143,17104,1935],{"class":1929},[1143,17106,1981],{"class":1479},[1143,17108,1409],{"class":1164},[1143,17110,17111],{"class":1145,"line":8981},[1143,17112,1946],{"class":1160},[1143,17114,17115,17117,17119,17121,17124,17126,17128],{"class":1145,"line":8986},[1143,17116,1999],{"class":1156},[1143,17118,16962],{"class":1160},[1143,17120,1165],{"class":1164},[1143,17122,17123],{"class":1307},"handle",[1143,17125,1243],{"class":1164},[1143,17127,13035],{"class":1307},[1143,17129,1409],{"class":1164},[1143,17131,17132],{"class":1145,"line":8995},[1143,17133,1229],{"emptyLinePlaceholder":1228},[1143,17135,17136,17138,17141],{"class":1145,"line":9000},[1143,17137,1236],{"class":1235},[1143,17139,17140],{"class":1239}," QueryBus",[1143,17142,1380],{"class":1164},[1143,17144,17145,17147,17150],{"class":1145,"line":9006},[1143,17146,1257],{"class":1256},[1143,17148,17149],{"class":1260},"Bus for dispatching queries to handlers",[1143,17151,1264],{"class":1256},[1143,17153,17154],{"class":1145,"line":9020},[1143,17155,1270],{"class":1160},[1143,17157,17158,17160,17162,17164,17166],{"class":1145,"line":9030},[1143,17159,1276],{"class":1235},[1143,17161,1280],{"class":1279},[1143,17163,1243],{"class":1164},[1143,17165,1286],{"class":1285},[1143,17167,1250],{"class":1164},[1143,17169,17170,17172,17174,17176,17178],{"class":1145,"line":9041},[1143,17171,1295],{"class":1294},[1143,17173,1165],{"class":1164},[1143,17175,16928],{"class":1300},[1143,17177,1304],{"class":1164},[1143,17179,8714],{"class":1164},[1143,17181,17182],{"class":1145,"line":9046},[1143,17183,1270],{"class":1160},[1143,17185,17186,17188,17190,17192,17194,17196,17199,17201,17203,17205,17207,17209,17211],{"class":1145,"line":9058},[1143,17187,1276],{"class":1235},[1143,17189,16943],{"class":1341},[1143,17191,1243],{"class":1164},[1143,17193,1286],{"class":1285},[1143,17195,1349],{"class":1164},[1143,17197,17198],{"class":1352}," query_type",[1143,17200,1485],{"class":1164},[1143,17202,16957],{"class":1849},[1143,17204,1349],{"class":1164},[1143,17206,16962],{"class":1352},[1143,17208,1485],{"class":1164},[1143,17210,13955],{"class":1160},[1143,17212,1250],{"class":1164},[1143,17214,17215,17217,17220],{"class":1145,"line":9079},[1143,17216,1366],{"class":1256},[1143,17218,17219],{"class":1260},"Register query handler",[1143,17221,1264],{"class":1256},[1143,17223,17224,17226,17228,17230,17232,17235,17237,17239],{"class":1145,"line":9099},[1143,17225,1295],{"class":1294},[1143,17227,1165],{"class":1164},[1143,17229,16928],{"class":1300},[1143,17231,2090],{"class":1164},[1143,17233,17234],{"class":1300},"query_type",[1143,17236,4503],{"class":1164},[1143,17238,1304],{"class":1164},[1143,17240,16997],{"class":1160},[1143,17242,17243],{"class":1145,"line":9119},[1143,17244,1270],{"class":1160},[1143,17246,17247,17249,17251,17253,17255,17257,17259,17261,17263,17265],{"class":1145,"line":9139},[1143,17248,1276],{"class":1235},[1143,17250,17008],{"class":1341},[1143,17252,1243],{"class":1164},[1143,17254,1286],{"class":1285},[1143,17256,1349],{"class":1164},[1143,17258,3153],{"class":1352},[1143,17260,1853],{"class":1164},[1143,17262,1856],{"class":1164},[1143,17264,12874],{"class":1279},[1143,17266,1380],{"class":1164},[1143,17268,17269,17271,17274],{"class":1145,"line":9145},[1143,17270,1366],{"class":1256},[1143,17272,17273],{"class":1260},"Dispatch query to appropriate handler",[1143,17275,1264],{"class":1256},[1143,17277,17278,17281,17283,17285,17287,17289],{"class":1145,"line":9150},[1143,17279,17280],{"class":1160},"        query_type ",[1143,17282,1389],{"class":1164},[1143,17284,16957],{"class":1849},[1143,17286,1243],{"class":1164},[1143,17288,3219],{"class":1307},[1143,17290,1409],{"class":1164},[1143,17292,17293,17295,17297,17299,17301,17303,17305,17307,17309,17311],{"class":1145,"line":9156},[1143,17294,17053],{"class":1160},[1143,17296,1389],{"class":1164},[1143,17298,1392],{"class":1294},[1143,17300,1165],{"class":1164},[1143,17302,16928],{"class":1300},[1143,17304,1165],{"class":1164},[1143,17306,2145],{"class":1307},[1143,17308,1243],{"class":1164},[1143,17310,17234],{"class":1307},[1143,17312,1409],{"class":1164},[1143,17314,17315],{"class":1145,"line":9174},[1143,17316,1946],{"class":1160},[1143,17318,17319,17321,17323,17325],{"class":1145,"line":9205},[1143,17320,1901],{"class":1156},[1143,17322,1905],{"class":1904},[1143,17324,16962],{"class":1160},[1143,17326,1380],{"class":1164},[1143,17328,17329,17331,17333,17335,17337,17339,17341,17343,17345,17347],{"class":1145,"line":9210},[1143,17330,1916],{"class":1156},[1143,17332,4085],{"class":1849},[1143,17334,1243],{"class":1164},[1143,17336,1923],{"class":1235},[1143,17338,17098],{"class":1479},[1143,17340,1930],{"class":1929},[1143,17342,17234],{"class":1307},[1143,17344,1935],{"class":1929},[1143,17346,1981],{"class":1479},[1143,17348,1409],{"class":1164},[1143,17350,17351],{"class":1145,"line":9216},[1143,17352,1946],{"class":1160},[1143,17354,17355,17357,17359,17361,17363,17365,17367],{"class":1145,"line":9241},[1143,17356,1999],{"class":1156},[1143,17358,16962],{"class":1160},[1143,17360,1165],{"class":1164},[1143,17362,17123],{"class":1307},[1143,17364,1243],{"class":1164},[1143,17366,3219],{"class":1307},[1143,17368,1409],{"class":1164},[1143,17370,17371],{"class":1145,"line":9246},[1143,17372,1229],{"emptyLinePlaceholder":1228},[1143,17374,17375],{"class":1145,"line":9256},[1143,17376,8838],{"class":1149},[1143,17378,17379,17381,17384],{"class":1145,"line":9276},[1143,17380,8844],{"class":1235},[1143,17382,17383],{"class":1341}," configure_cqrs",[1143,17385,6505],{"class":1164},[1143,17387,17388,17390,17393],{"class":1145,"line":9299},[1143,17389,1257],{"class":1256},[1143,17391,17392],{"class":1260},"Configure CQRS command and query buses",[1143,17394,1264],{"class":1256},[1143,17396,17397],{"class":1145,"line":9316},[1143,17398,17399],{"class":1149},"    # Command bus setup\n",[1143,17401,17403,17406,17408,17410],{"class":1145,"line":17402},387,[1143,17404,17405],{"class":1160},"    command_bus ",[1143,17407,1389],{"class":1164},[1143,17409,16892],{"class":1307},[1143,17411,1311],{"class":1164},[1143,17413,17415],{"class":1145,"line":17414},388,[1143,17416,1270],{"class":1160},[1143,17418,17420,17423,17425,17428],{"class":1145,"line":17419},389,[1143,17421,17422],{"class":1160},"    product_repo ",[1143,17424,1389],{"class":1164},[1143,17426,17427],{"class":1307}," DjangoProductRepository",[1143,17429,1311],{"class":1164},[1143,17431,17433,17436,17438,17440],{"class":1145,"line":17432},390,[1143,17434,17435],{"class":1160},"    event_store ",[1143,17437,1389],{"class":1164},[1143,17439,12944],{"class":1307},[1143,17441,1311],{"class":1164},[1143,17443,17445],{"class":1145,"line":17444},391,[1143,17446,1270],{"class":1160},[1143,17448,17450,17453,17455,17458],{"class":1145,"line":17449},392,[1143,17451,17452],{"class":1160},"    command_bus",[1143,17454,1165],{"class":1164},[1143,17456,17457],{"class":1307},"register_handler",[1143,17459,2224],{"class":1164},[1143,17461,17463,17466],{"class":1145,"line":17462},393,[1143,17464,17465],{"class":1307},"        CreateProductCommand",[1143,17467,5748],{"class":1164},[1143,17469,17471,17474,17476,17478,17480,17483],{"class":1145,"line":17470},394,[1143,17472,17473],{"class":1307},"        CreateProductCommandHandler",[1143,17475,1243],{"class":1164},[1143,17477,1816],{"class":1307},[1143,17479,1349],{"class":1164},[1143,17481,17482],{"class":1307}," event_store",[1143,17484,1409],{"class":1164},[1143,17486,17488],{"class":1145,"line":17487},395,[1143,17489,9142],{"class":1164},[1143,17491,17493,17495,17497,17499],{"class":1145,"line":17492},396,[1143,17494,17452],{"class":1160},[1143,17496,1165],{"class":1164},[1143,17498,17457],{"class":1307},[1143,17500,2224],{"class":1164},[1143,17502,17504,17507],{"class":1145,"line":17503},397,[1143,17505,17506],{"class":1307},"        UpdateProductPriceCommand",[1143,17508,5748],{"class":1164},[1143,17510,17512,17515,17517,17519,17521,17523],{"class":1145,"line":17511},398,[1143,17513,17514],{"class":1307},"        UpdateProductPriceCommandHandler",[1143,17516,1243],{"class":1164},[1143,17518,1816],{"class":1307},[1143,17520,1349],{"class":1164},[1143,17522,17482],{"class":1307},[1143,17524,1409],{"class":1164},[1143,17526,17528],{"class":1145,"line":17527},399,[1143,17529,9142],{"class":1164},[1143,17531,17533],{"class":1145,"line":17532},400,[1143,17534,1270],{"class":1160},[1143,17536,17538],{"class":1145,"line":17537},401,[1143,17539,17540],{"class":1149},"    # Query bus setup\n",[1143,17542,17544,17547,17549,17551],{"class":1145,"line":17543},402,[1143,17545,17546],{"class":1160},"    query_bus ",[1143,17548,1389],{"class":1164},[1143,17550,17140],{"class":1307},[1143,17552,1311],{"class":1164},[1143,17554,17556],{"class":1145,"line":17555},403,[1143,17557,1270],{"class":1160},[1143,17559,17561,17564,17566,17568],{"class":1145,"line":17560},404,[1143,17562,17563],{"class":1160},"    read_model_repo ",[1143,17565,1389],{"class":1164},[1143,17567,14057],{"class":1307},[1143,17569,1311],{"class":1164},[1143,17571,17573],{"class":1145,"line":17572},405,[1143,17574,1270],{"class":1160},[1143,17576,17578,17581,17583,17585],{"class":1145,"line":17577},406,[1143,17579,17580],{"class":1160},"    query_bus",[1143,17582,1165],{"class":1164},[1143,17584,17457],{"class":1307},[1143,17586,2224],{"class":1164},[1143,17588,17590,17593],{"class":1145,"line":17589},407,[1143,17591,17592],{"class":1307},"        GetProductQuery",[1143,17594,5748],{"class":1164},[1143,17596,17598,17601,17603,17605],{"class":1145,"line":17597},408,[1143,17599,17600],{"class":1307},"        GetProductQueryHandler",[1143,17602,1243],{"class":1164},[1143,17604,14068],{"class":1307},[1143,17606,1409],{"class":1164},[1143,17608,17610],{"class":1145,"line":17609},409,[1143,17611,9142],{"class":1164},[1143,17613,17615,17617,17619,17621],{"class":1145,"line":17614},410,[1143,17616,17580],{"class":1160},[1143,17618,1165],{"class":1164},[1143,17620,17457],{"class":1307},[1143,17622,2224],{"class":1164},[1143,17624,17626,17629],{"class":1145,"line":17625},411,[1143,17627,17628],{"class":1307},"        SearchProductsQuery",[1143,17630,5748],{"class":1164},[1143,17632,17634,17637,17639,17641],{"class":1145,"line":17633},412,[1143,17635,17636],{"class":1307},"        SearchProductsQueryHandler",[1143,17638,1243],{"class":1164},[1143,17640,14068],{"class":1307},[1143,17642,1409],{"class":1164},[1143,17644,17646],{"class":1145,"line":17645},413,[1143,17647,9142],{"class":1164},[1143,17649,17651],{"class":1145,"line":17650},414,[1143,17652,1270],{"class":1160},[1143,17654,17656,17658,17661,17663],{"class":1145,"line":17655},415,[1143,17657,8989],{"class":1156},[1143,17659,17660],{"class":1160}," command_bus",[1143,17662,1349],{"class":1164},[1143,17664,17665],{"class":1160}," query_bus\n",[1143,17667,17669],{"class":1145,"line":17668},416,[1143,17670,1229],{"emptyLinePlaceholder":1228},[1143,17672,17674],{"class":1145,"line":17673},417,[1143,17675,9003],{"class":1149},[1143,17677,17679,17681,17684,17686,17688],{"class":1145,"line":17678},418,[1143,17680,8844],{"class":1235},[1143,17682,17683],{"class":1341}," create_product_view",[1143,17685,1243],{"class":1164},[1143,17687,1571],{"class":1352},[1143,17689,1250],{"class":1164},[1143,17691,17693,17695,17698],{"class":1145,"line":17692},419,[1143,17694,1257],{"class":1256},[1143,17696,17697],{"class":1260},"View for creating products using CQRS",[1143,17699,1264],{"class":1256},[1143,17701,17703,17705,17707,17710,17712,17714],{"class":1145,"line":17702},420,[1143,17704,17452],{"class":1160},[1143,17706,1349],{"class":1164},[1143,17708,17709],{"class":1160}," _ ",[1143,17711,1389],{"class":1164},[1143,17713,17383],{"class":1307},[1143,17715,1311],{"class":1164},[1143,17717,17719],{"class":1145,"line":17718},421,[1143,17720,1270],{"class":1160},[1143,17722,17724,17727,17729,17731],{"class":1145,"line":17723},422,[1143,17725,17726],{"class":1160},"    command ",[1143,17728,1389],{"class":1164},[1143,17730,12648],{"class":1307},[1143,17732,2224],{"class":1164},[1143,17734,17736,17739,17741,17743,17745,17747,17749,17751,17753,17755],{"class":1145,"line":17735},423,[1143,17737,17738],{"class":1499},"        name",[1143,17740,1389],{"class":1164},[1143,17742,1571],{"class":1307},[1143,17744,1165],{"class":1164},[1143,17746,1449],{"class":1300},[1143,17748,2090],{"class":1164},[1143,17750,1476],{"class":1475},[1143,17752,2095],{"class":1479},[1143,17754,1476],{"class":1475},[1143,17756,2245],{"class":1164},[1143,17758,17760,17763,17765,17767,17769,17771,17773,17775,17777,17779],{"class":1145,"line":17759},424,[1143,17761,17762],{"class":1499},"        description",[1143,17764,1389],{"class":1164},[1143,17766,1571],{"class":1307},[1143,17768,1165],{"class":1164},[1143,17770,1449],{"class":1300},[1143,17772,2090],{"class":1164},[1143,17774,1476],{"class":1475},[1143,17776,2262],{"class":1479},[1143,17778,1476],{"class":1475},[1143,17780,2245],{"class":1164},[1143,17782,17784,17787,17789,17791,17793,17795,17797,17799,17801,17803,17805,17807],{"class":1145,"line":17783},425,[1143,17785,17786],{"class":1499},"        price",[1143,17788,1389],{"class":1164},[1143,17790,3841],{"class":1307},[1143,17792,1243],{"class":1164},[1143,17794,1571],{"class":1307},[1143,17796,1165],{"class":1164},[1143,17798,1449],{"class":1300},[1143,17800,2090],{"class":1164},[1143,17802,1476],{"class":1475},[1143,17804,2283],{"class":1479},[1143,17806,1476],{"class":1475},[1143,17808,4216],{"class":1164},[1143,17810,17812,17815,17817,17819,17821,17823,17825,17827,17829,17831],{"class":1145,"line":17811},426,[1143,17813,17814],{"class":1499},"        category_id",[1143,17816,1389],{"class":1164},[1143,17818,1571],{"class":1307},[1143,17820,1165],{"class":1164},[1143,17822,1449],{"class":1300},[1143,17824,2090],{"class":1164},[1143,17826,1476],{"class":1475},[1143,17828,2161],{"class":1479},[1143,17830,1476],{"class":1475},[1143,17832,2245],{"class":1164},[1143,17834,17836,17839,17841,17843,17845,17847,17849],{"class":1145,"line":17835},427,[1143,17837,17838],{"class":1499},"        user_id",[1143,17840,1389],{"class":1164},[1143,17842,1571],{"class":1307},[1143,17844,1165],{"class":1164},[1143,17846,9167],{"class":1300},[1143,17848,1165],{"class":1164},[1143,17850,6727],{"class":1300},[1143,17852,17854],{"class":1145,"line":17853},428,[1143,17855,9142],{"class":1164},[1143,17857,17859],{"class":1145,"line":17858},429,[1143,17860,1270],{"class":1160},[1143,17862,17864,17867],{"class":1145,"line":17863},430,[1143,17865,17866],{"class":1156},"    try",[1143,17868,1380],{"class":1164},[1143,17870,17872,17875,17877,17879,17881,17884,17886,17888],{"class":1145,"line":17871},431,[1143,17873,17874],{"class":1160},"        product_id ",[1143,17876,1389],{"class":1164},[1143,17878,17660],{"class":1160},[1143,17880,1165],{"class":1164},[1143,17882,17883],{"class":1307},"dispatch",[1143,17885,1243],{"class":1164},[1143,17887,13035],{"class":1307},[1143,17889,1409],{"class":1164},[1143,17891,17893,17895,17897,17899,17901,17903,17905,17907,17909,17911,17913,17915,17917],{"class":1145,"line":17892},432,[1143,17894,1999],{"class":1156},[1143,17896,1444],{"class":1307},[1143,17898,1472],{"class":1164},[1143,17900,1476],{"class":1475},[1143,17902,1406],{"class":1479},[1143,17904,1476],{"class":1475},[1143,17906,1485],{"class":1164},[1143,17908,1358],{"class":1307},[1143,17910,1496],{"class":1164},[1143,17912,1500],{"class":1499},[1143,17914,1389],{"class":1164},[1143,17916,1647],{"class":1505},[1143,17918,1409],{"class":1164},[1143,17920,17922,17925,17928,17930,17932],{"class":1145,"line":17921},433,[1143,17923,17924],{"class":1156},"    except",[1143,17926,17927],{"class":1160}," BusinessRuleError ",[1143,17929,1660],{"class":1156},[1143,17931,1663],{"class":1160},[1143,17933,1380],{"class":1164},[1143,17935,17937,17939,17941,17943,17945,17947,17949,17951,17953,17955,17957,17959,17961,17963,17965],{"class":1145,"line":17936},434,[1143,17938,1999],{"class":1156},[1143,17940,1444],{"class":1307},[1143,17942,1472],{"class":1164},[1143,17944,1476],{"class":1475},[1143,17946,1480],{"class":1479},[1143,17948,1476],{"class":1475},[1143,17950,1485],{"class":1164},[1143,17952,2848],{"class":1849},[1143,17954,1243],{"class":1164},[1143,17956,7716],{"class":1307},[1143,17958,11184],{"class":1164},[1143,17960,1500],{"class":1499},[1143,17962,1389],{"class":1164},[1143,17964,1699],{"class":1505},[1143,17966,1409],{"class":1164},[1143,17968,17970],{"class":1145,"line":17969},435,[1143,17971,1229],{"emptyLinePlaceholder":1228},[1143,17973,17975,17977,17980,17982,17984],{"class":1145,"line":17974},436,[1143,17976,8844],{"class":1235},[1143,17978,17979],{"class":1341}," search_products_view",[1143,17981,1243],{"class":1164},[1143,17983,1571],{"class":1352},[1143,17985,1250],{"class":1164},[1143,17987,17989,17991,17994],{"class":1145,"line":17988},437,[1143,17990,1257],{"class":1256},[1143,17992,17993],{"class":1260},"View for searching products using CQRS",[1143,17995,1264],{"class":1256},[1143,17997,17999,18002,18004,18007,18009,18011],{"class":1145,"line":17998},438,[1143,18000,18001],{"class":1160},"    _",[1143,18003,1349],{"class":1164},[1143,18005,18006],{"class":1160}," query_bus ",[1143,18008,1389],{"class":1164},[1143,18010,17383],{"class":1307},[1143,18012,1311],{"class":1164},[1143,18014,18016],{"class":1145,"line":18015},439,[1143,18017,1270],{"class":1160},[1143,18019,18021,18024,18026,18028],{"class":1145,"line":18020},440,[1143,18022,18023],{"class":1160},"    query ",[1143,18025,1389],{"class":1164},[1143,18027,13799],{"class":1307},[1143,18029,2224],{"class":1164},[1143,18031,18033,18036,18038,18040,18042,18045,18047,18049,18051,18053,18056,18058,18060,18063],{"class":1145,"line":18032},441,[1143,18034,18035],{"class":1499},"        search_term",[1143,18037,1389],{"class":1164},[1143,18039,1571],{"class":1307},[1143,18041,1165],{"class":1164},[1143,18043,18044],{"class":3598},"GET",[1143,18046,1165],{"class":1164},[1143,18048,2145],{"class":1307},[1143,18050,1243],{"class":1164},[1143,18052,1476],{"class":1475},[1143,18054,18055],{"class":1479},"q",[1143,18057,1476],{"class":1475},[1143,18059,1349],{"class":1164},[1143,18061,18062],{"class":1475}," ''",[1143,18064,3239],{"class":1164},[1143,18066,18068,18070,18072,18074,18076,18078,18080,18082,18084,18086,18088,18090],{"class":1145,"line":18067},442,[1143,18069,17814],{"class":1499},[1143,18071,1389],{"class":1164},[1143,18073,1571],{"class":1307},[1143,18075,1165],{"class":1164},[1143,18077,18044],{"class":3598},[1143,18079,1165],{"class":1164},[1143,18081,2145],{"class":1307},[1143,18083,1243],{"class":1164},[1143,18085,1476],{"class":1475},[1143,18087,2161],{"class":1479},[1143,18089,1476],{"class":1475},[1143,18091,3239],{"class":1164},[1143,18093,18095,18098,18100,18102,18104,18106,18108,18110,18112,18114,18116,18118],{"class":1145,"line":18094},443,[1143,18096,18097],{"class":1499},"        min_price",[1143,18099,1389],{"class":1164},[1143,18101,1571],{"class":1307},[1143,18103,1165],{"class":1164},[1143,18105,18044],{"class":3598},[1143,18107,1165],{"class":1164},[1143,18109,2145],{"class":1307},[1143,18111,1243],{"class":1164},[1143,18113,1476],{"class":1475},[1143,18115,14345],{"class":1479},[1143,18117,1476],{"class":1475},[1143,18119,3239],{"class":1164},[1143,18121,18123,18126,18128,18130,18132,18134,18136,18138,18140,18142,18144,18146],{"class":1145,"line":18122},444,[1143,18124,18125],{"class":1499},"        max_price",[1143,18127,1389],{"class":1164},[1143,18129,1571],{"class":1307},[1143,18131,1165],{"class":1164},[1143,18133,18044],{"class":3598},[1143,18135,1165],{"class":1164},[1143,18137,2145],{"class":1307},[1143,18139,1243],{"class":1164},[1143,18141,1476],{"class":1475},[1143,18143,14385],{"class":1479},[1143,18145,1476],{"class":1475},[1143,18147,3239],{"class":1164},[1143,18149,18151,18154,18156,18158,18160,18162,18164,18166,18168,18170,18172,18174,18176,18178,18180,18182],{"class":1145,"line":18150},445,[1143,18152,18153],{"class":1499},"        page",[1143,18155,1389],{"class":1164},[1143,18157,7585],{"class":1849},[1143,18159,1243],{"class":1164},[1143,18161,1571],{"class":1307},[1143,18163,1165],{"class":1164},[1143,18165,18044],{"class":3598},[1143,18167,1165],{"class":1164},[1143,18169,2145],{"class":1307},[1143,18171,1243],{"class":1164},[1143,18173,1476],{"class":1475},[1143,18175,14459],{"class":1479},[1143,18177,1476],{"class":1475},[1143,18179,1349],{"class":1164},[1143,18181,14618],{"class":1505},[1143,18183,18184],{"class":1164},")),\n",[1143,18186,18188,18191,18193,18195,18197,18199,18201,18203,18205,18207,18209,18211,18213,18215,18217,18220],{"class":1145,"line":18187},446,[1143,18189,18190],{"class":1499},"        page_size",[1143,18192,1389],{"class":1164},[1143,18194,7585],{"class":1849},[1143,18196,1243],{"class":1164},[1143,18198,1571],{"class":1307},[1143,18200,1165],{"class":1164},[1143,18202,18044],{"class":3598},[1143,18204,1165],{"class":1164},[1143,18206,2145],{"class":1307},[1143,18208,1243],{"class":1164},[1143,18210,1476],{"class":1475},[1143,18212,14576],{"class":1479},[1143,18214,1476],{"class":1475},[1143,18216,1349],{"class":1164},[1143,18218,18219],{"class":1505}," 20",[1143,18221,4785],{"class":1164},[1143,18223,18225],{"class":1145,"line":18224},447,[1143,18226,9142],{"class":1164},[1143,18228,18230],{"class":1145,"line":18229},448,[1143,18231,1270],{"class":1160},[1143,18233,18235,18238,18240,18243,18245,18247,18249,18251],{"class":1145,"line":18234},449,[1143,18236,18237],{"class":1160},"    result ",[1143,18239,1389],{"class":1164},[1143,18241,18242],{"class":1160}," query_bus",[1143,18244,1165],{"class":1164},[1143,18246,17883],{"class":1307},[1143,18248,1243],{"class":1164},[1143,18250,3219],{"class":1307},[1143,18252,1409],{"class":1164},[1143,18254,18256],{"class":1145,"line":18255},450,[1143,18257,1270],{"class":1160},[1143,18259,18261,18263,18265],{"class":1145,"line":18260},451,[1143,18262,8989],{"class":1156},[1143,18264,1444],{"class":1307},[1143,18266,9253],{"class":1164},[1143,18268,18270,18272,18274,18276,18278],{"class":1145,"line":18269},452,[1143,18271,9259],{"class":1475},[1143,18273,14526],{"class":1479},[1143,18275,1476],{"class":1475},[1143,18277,1485],{"class":1164},[1143,18279,4180],{"class":1164},[1143,18281,18283],{"class":1145,"line":18282},453,[1143,18284,18285],{"class":1164},"            {\n",[1143,18287,18289,18291,18293,18295,18297,18300,18302,18304],{"class":1145,"line":18288},454,[1143,18290,11075],{"class":1475},[1143,18292,2150],{"class":1479},[1143,18294,1476],{"class":1475},[1143,18296,1485],{"class":1164},[1143,18298,18299],{"class":1307}," p",[1143,18301,1165],{"class":1164},[1143,18303,1406],{"class":1300},[1143,18305,5748],{"class":1164},[1143,18307,18309,18311,18313,18315,18317,18319,18321,18323],{"class":1145,"line":18308},455,[1143,18310,11075],{"class":1475},[1143,18312,2095],{"class":1479},[1143,18314,1476],{"class":1475},[1143,18316,1485],{"class":1164},[1143,18318,18299],{"class":1307},[1143,18320,1165],{"class":1164},[1143,18322,2095],{"class":1300},[1143,18324,5748],{"class":1164},[1143,18326,18328,18330,18332,18334,18336,18338,18340,18342,18344,18346],{"class":1145,"line":18327},456,[1143,18329,11075],{"class":1475},[1143,18331,2283],{"class":1479},[1143,18333,1476],{"class":1475},[1143,18335,1485],{"class":1164},[1143,18337,2848],{"class":1849},[1143,18339,1243],{"class":1164},[1143,18341,1026],{"class":1307},[1143,18343,1165],{"class":1164},[1143,18345,2283],{"class":1300},[1143,18347,3239],{"class":1164},[1143,18349,18351,18353,18355,18357,18359,18361,18363,18365],{"class":1145,"line":18350},457,[1143,18352,11075],{"class":1475},[1143,18354,2782],{"class":1479},[1143,18356,1476],{"class":1475},[1143,18358,1485],{"class":1164},[1143,18360,18299],{"class":1307},[1143,18362,1165],{"class":1164},[1143,18364,14850],{"class":1300},[1143,18366,5748],{"class":1164},[1143,18368,18370,18372,18375,18377,18379,18381,18383,18385,18387,18389,18391,18393,18395,18397,18399,18401,18403],{"class":1145,"line":18369},458,[1143,18371,11075],{"class":1475},[1143,18373,18374],{"class":1479},"rating",[1143,18376,1476],{"class":1475},[1143,18378,1485],{"class":1164},[1143,18380,2848],{"class":1849},[1143,18382,1243],{"class":1164},[1143,18384,1026],{"class":1307},[1143,18386,1165],{"class":1164},[1143,18388,14890],{"class":1300},[1143,18390,1853],{"class":1164},[1143,18392,4868],{"class":1156},[1143,18394,18299],{"class":1307},[1143,18396,1165],{"class":1164},[1143,18398,14890],{"class":1300},[1143,18400,11433],{"class":1156},[1143,18402,3366],{"class":2500},[1143,18404,5748],{"class":1164},[1143,18406,18408,18410,18412,18414,18416,18418,18420],{"class":1145,"line":18407},459,[1143,18409,11075],{"class":1475},[1143,18411,14904],{"class":1479},[1143,18413,1476],{"class":1475},[1143,18415,1485],{"class":1164},[1143,18417,18299],{"class":1307},[1143,18419,1165],{"class":1164},[1143,18421,18422],{"class":1300},"review_count\n",[1143,18424,18426],{"class":1145,"line":18425},460,[1143,18427,18428],{"class":1164},"            }\n",[1143,18430,18432,18434,18437,18439,18442,18444,18446,18448,18450],{"class":1145,"line":18431},461,[1143,18433,6762],{"class":1156},[1143,18435,18436],{"class":1307}," p ",[1143,18438,4859],{"class":1156},[1143,18440,18441],{"class":1307}," result",[1143,18443,2090],{"class":1164},[1143,18445,1476],{"class":1475},[1143,18447,14526],{"class":1479},[1143,18449,1476],{"class":1475},[1143,18451,4883],{"class":1164},[1143,18453,18455],{"class":1145,"line":18454},462,[1143,18456,18457],{"class":1164},"        ],\n",[1143,18459,18461,18463,18466,18468,18470],{"class":1145,"line":18460},463,[1143,18462,9259],{"class":1475},[1143,18464,18465],{"class":1479},"pagination",[1143,18467,1476],{"class":1475},[1143,18469,1485],{"class":1164},[1143,18471,14518],{"class":1164},[1143,18473,18475,18477,18479,18481,18483,18485,18487,18489,18491,18493],{"class":1145,"line":18474},464,[1143,18476,14523],{"class":1475},[1143,18478,14542],{"class":1479},[1143,18480,1476],{"class":1475},[1143,18482,1485],{"class":1164},[1143,18484,18441],{"class":1307},[1143,18486,2090],{"class":1164},[1143,18488,1476],{"class":1475},[1143,18490,14542],{"class":1479},[1143,18492,1476],{"class":1475},[1143,18494,2245],{"class":1164},[1143,18496,18498,18500,18502,18504,18506,18508,18510,18512,18514,18516],{"class":1145,"line":18497},465,[1143,18499,14523],{"class":1475},[1143,18501,14459],{"class":1479},[1143,18503,1476],{"class":1475},[1143,18505,1485],{"class":1164},[1143,18507,18441],{"class":1307},[1143,18509,2090],{"class":1164},[1143,18511,1476],{"class":1475},[1143,18513,14459],{"class":1479},[1143,18515,1476],{"class":1475},[1143,18517,2245],{"class":1164},[1143,18519,18521,18523,18525,18527,18529,18531,18533,18535,18537,18539],{"class":1145,"line":18520},466,[1143,18522,14523],{"class":1475},[1143,18524,14576],{"class":1479},[1143,18526,1476],{"class":1475},[1143,18528,1485],{"class":1164},[1143,18530,18441],{"class":1307},[1143,18532,2090],{"class":1164},[1143,18534,1476],{"class":1475},[1143,18536,14576],{"class":1479},[1143,18538,1476],{"class":1475},[1143,18540,2245],{"class":1164},[1143,18542,18544,18546,18548,18550,18552,18554,18556,18558,18560,18562],{"class":1145,"line":18543},467,[1143,18545,14523],{"class":1475},[1143,18547,14595],{"class":1479},[1143,18549,1476],{"class":1475},[1143,18551,1485],{"class":1164},[1143,18553,18441],{"class":1307},[1143,18555,2090],{"class":1164},[1143,18557,1476],{"class":1475},[1143,18559,14595],{"class":1479},[1143,18561,1476],{"class":1475},[1143,18563,4883],{"class":1164},[1143,18565,18567],{"class":1145,"line":18566},468,[1143,18568,14634],{"class":1164},[1143,18570,18572],{"class":1145,"line":18571},469,[1143,18573,9319],{"class":1164},[1030,18575,18577],{"id":18576},"event-sourcing","Event Sourcing",[1026,18579,18580],{},"Event Sourcing stores all changes to application state as a sequence of events. This pattern provides complete audit trails and enables powerful features like time travel and event replay.",[1038,18582,18584],{"id":18583},"event-sourcing-implementation","Event Sourcing Implementation",[1133,18586,18588],{"className":1135,"code":18587,"language":1137,"meta":1138,"style":1138},"# Domain Events\nfrom dataclasses import dataclass\nfrom datetime import datetime\nfrom decimal import Decimal\nfrom typing import List, Optional\n\n@dataclass\nclass DomainEvent:\n    \"\"\"Base class for domain events\"\"\"\n    aggregate_id: int\n    event_id: str\n    occurred_at: datetime\n    version: int\n\n@dataclass\nclass ProductCreatedEvent(DomainEvent):\n    \"\"\"Event for product creation\"\"\"\n    name: str\n    description: str\n    price: Decimal\n    category_id: int\n    created_by: int\n\n@dataclass\nclass ProductPriceChangedEvent(DomainEvent):\n    \"\"\"Event for product price changes\"\"\"\n    old_price: Decimal\n    new_price: Decimal\n    changed_by: int\n\n@dataclass\nclass ProductDeactivatedEvent(DomainEvent):\n    \"\"\"Event for product deactivation\"\"\"\n    reason: str\n    deactivated_by: int\n\n# Event-Sourced Aggregate\nclass ProductAggregate:\n    \"\"\"Product aggregate using event sourcing\"\"\"\n    \n    def __init__(self, product_id: int):\n        self.id = product_id\n        self.name = None\n        self.description = None\n        self.price = None\n        self.category_id = None\n        self.is_active = True\n        self.version = 0\n        self.uncommitted_events = []\n    \n    @classmethod\n    def create(cls, product_id: int, name: str, description: str,\n               price: Decimal, category_id: int, created_by: int) -> 'ProductAggregate':\n        \"\"\"Create new product aggregate\"\"\"\n        aggregate = cls(product_id)\n        \n        event = ProductCreatedEvent(\n            aggregate_id=product_id,\n            event_id=str(uuid.uuid4()),\n            occurred_at=timezone.now(),\n            version=1,\n            name=name,\n            description=description,\n            price=price,\n            category_id=category_id,\n            created_by=created_by\n        )\n        \n        aggregate._apply_event(event)\n        aggregate.uncommitted_events.append(event)\n        \n        return aggregate\n    \n    def change_price(self, new_price: Decimal, changed_by: int):\n        \"\"\"Change product price\"\"\"\n        if new_price \u003C= 0:\n            raise ValueError(\"Price must be positive\")\n        \n        if new_price == self.price:\n            return  # No change needed\n        \n        old_price = self.price\n        \n        event = ProductPriceChangedEvent(\n            aggregate_id=self.id,\n            event_id=str(uuid.uuid4()),\n            occurred_at=timezone.now(),\n            version=self.version + 1,\n            old_price=old_price,\n            new_price=new_price,\n            changed_by=changed_by\n        )\n        \n        self._apply_event(event)\n        self.uncommitted_events.append(event)\n    \n    def deactivate(self, reason: str, deactivated_by: int):\n        \"\"\"Deactivate product\"\"\"\n        if not self.is_active:\n            raise ValueError(\"Product is already deactivated\")\n        \n        event = ProductDeactivatedEvent(\n            aggregate_id=self.id,\n            event_id=str(uuid.uuid4()),\n            occurred_at=timezone.now(),\n            version=self.version + 1,\n            reason=reason,\n            deactivated_by=deactivated_by\n        )\n        \n        self._apply_event(event)\n        self.uncommitted_events.append(event)\n    \n    def load_from_history(self, events: List[DomainEvent]):\n        \"\"\"Rebuild aggregate from event history\"\"\"\n        for event in events:\n            self._apply_event(event)\n    \n    def mark_events_as_committed(self):\n        \"\"\"Mark uncommitted events as committed\"\"\"\n        self.uncommitted_events.clear()\n    \n    def _apply_event(self, event: DomainEvent):\n        \"\"\"Apply event to aggregate state\"\"\"\n        if isinstance(event, ProductCreatedEvent):\n            self.name = event.name\n            self.description = event.description\n            self.price = event.price\n            self.category_id = event.category_id\n            self.is_active = True\n        \n        elif isinstance(event, ProductPriceChangedEvent):\n            self.price = event.new_price\n        \n        elif isinstance(event, ProductDeactivatedEvent):\n            self.is_active = False\n        \n        self.version = event.version\n\n# Event Store\nclass EventStore:\n    \"\"\"Store for domain events with event sourcing\"\"\"\n    \n    def save_events(self, aggregate_id: int, events: List[DomainEvent],\n                   expected_version: int) -> None:\n        \"\"\"Save events with optimistic concurrency control\"\"\"\n        with transaction.atomic():\n            # Check current version\n            current_version = self._get_current_version(aggregate_id)\n            \n            if current_version != expected_version:\n                raise ConcurrencyError(\n                    f\"Expected version {expected_version}, \"\n                    f\"but current version is {current_version}\"\n                )\n            \n            # Save events\n            for event in events:\n                EventStoreRecord.objects.create(\n                    aggregate_id=event.aggregate_id,\n                    event_id=event.event_id,\n                    event_type=event.__class__.__name__,\n                    event_data=self._serialize_event(event),\n                    version=event.version,\n                    occurred_at=event.occurred_at\n                )\n    \n    def get_events(self, aggregate_id: int, from_version: int = 0) -> List[DomainEvent]:\n        \"\"\"Get events for aggregate from specific version\"\"\"\n        records = EventStoreRecord.objects.filter(\n            aggregate_id=aggregate_id,\n            version__gt=from_version\n        ).order_by('version')\n        \n        return [self._deserialize_event(record) for record in records]\n    \n    def get_all_events(self, from_timestamp: Optional[datetime] = None) -> List[DomainEvent]:\n        \"\"\"Get all events from specific timestamp\"\"\"\n        queryset = EventStoreRecord.objects.all()\n        \n        if from_timestamp:\n            queryset = queryset.filter(occurred_at__gte=from_timestamp)\n        \n        return [self._deserialize_event(record) for record in queryset.order_by('occurred_at')]\n    \n    def _get_current_version(self, aggregate_id: int) -> int:\n        \"\"\"Get current version of aggregate\"\"\"\n        latest_event = EventStoreRecord.objects.filter(\n            aggregate_id=aggregate_id\n        ).order_by('-version').first()\n        \n        return latest_event.version if latest_event else 0\n    \n    def _serialize_event(self, event: DomainEvent) -> dict:\n        \"\"\"Serialize event to dictionary\"\"\"\n        return {\n            'aggregate_id': event.aggregate_id,\n            'event_id': event.event_id,\n            'occurred_at': event.occurred_at.isoformat(),\n            'version': event.version,\n            **{k: v for k, v in event.__dict__.items() \n               if k not in ['aggregate_id', 'event_id', 'occurred_at', 'version']}\n        }\n    \n    def _deserialize_event(self, record) -> DomainEvent:\n        \"\"\"Deserialize event from record\"\"\"\n        event_data = record.event_data\n        event_class = globals()[record.event_type]  # Get event class by name\n        \n        return event_class(\n            aggregate_id=record.aggregate_id,\n            event_id=record.event_id,\n            occurred_at=record.occurred_at,\n            version=record.version,\n            **{k: v for k, v in event_data.items() \n               if k not in ['aggregate_id', 'event_id', 'occurred_at', 'version']}\n        )\n\nclass EventStoreRecord(models.Model):\n    \"\"\"Database table for event store\"\"\"\n    \n    aggregate_id = models.IntegerField(db_index=True)\n    event_id = models.CharField(max_length=36, unique=True)\n    event_type = models.CharField(max_length=100)\n    event_data = models.JSONField()\n    version = models.IntegerField()\n    occurred_at = models.DateTimeField(db_index=True)\n    \n    class Meta:\n        indexes = [\n            models.Index(fields=['aggregate_id', 'version']),\n            models.Index(fields=['event_type', 'occurred_at']),\n        ]\n        unique_together = [['aggregate_id', 'version']]\n\n# Repository for Event-Sourced Aggregates\nclass ProductAggregateRepository:\n    \"\"\"Repository for product aggregates using event sourcing\"\"\"\n    \n    def __init__(self, event_store: EventStore):\n        self.event_store = event_store\n    \n    def get_by_id(self, product_id: int) -> Optional[ProductAggregate]:\n        \"\"\"Get product aggregate by ID\"\"\"\n        events = self.event_store.get_events(product_id)\n        \n        if not events:\n            return None\n        \n        aggregate = ProductAggregate(product_id)\n        aggregate.load_from_history(events)\n        \n        return aggregate\n    \n    def save(self, aggregate: ProductAggregate) -> None:\n        \"\"\"Save aggregate by storing uncommitted events\"\"\"\n        if not aggregate.uncommitted_events:\n            return\n        \n        expected_version = aggregate.version - len(aggregate.uncommitted_events)\n        \n        self.event_store.save_events(\n            aggregate.id,\n            aggregate.uncommitted_events,\n            expected_version\n        )\n        \n        aggregate.mark_events_as_committed()\n\n# Event Projections for Read Models\nclass ProductProjection:\n    \"\"\"Projection that builds read models from events\"\"\"\n    \n    def __init__(self):\n        self.handlers = {\n            ProductCreatedEvent: self._handle_product_created,\n            ProductPriceChangedEvent: self._handle_price_changed,\n            ProductDeactivatedEvent: self._handle_product_deactivated,\n        }\n    \n    def project_event(self, event: DomainEvent):\n        \"\"\"Project event to read model\"\"\"\n        handler = self.handlers.get(type(event))\n        if handler:\n            handler(event)\n    \n    def _handle_product_created(self, event: ProductCreatedEvent):\n        \"\"\"Handle product created event\"\"\"\n        ProductReadModel.objects.create(\n            product_id=event.aggregate_id,\n            name=event.name,\n            description=event.description,\n            price=event.price,\n            category_id=event.category_id,\n            is_active=True,\n            created_at=event.occurred_at\n        )\n    \n    def _handle_price_changed(self, event: ProductPriceChangedEvent):\n        \"\"\"Handle price changed event\"\"\"\n        ProductReadModel.objects.filter(\n            product_id=event.aggregate_id\n        ).update(price=event.new_price)\n    \n    def _handle_product_deactivated(self, event: ProductDeactivatedEvent):\n        \"\"\"Handle product deactivated event\"\"\"\n        ProductReadModel.objects.filter(\n            product_id=event.aggregate_id\n        ).update(is_active=False)\n\n# Event Processing\nclass EventProcessor:\n    \"\"\"Process events for projections and side effects\"\"\"\n    \n    def __init__(self, event_store: EventStore):\n        self.event_store = event_store\n        self.projections = []\n        self.event_handlers = []\n    \n    def add_projection(self, projection):\n        \"\"\"Add projection to process events\"\"\"\n        self.projections.append(projection)\n    \n    def add_event_handler(self, handler):\n        \"\"\"Add event handler for side effects\"\"\"\n        self.event_handlers.append(handler)\n    \n    def process_new_events(self, from_timestamp: Optional[datetime] = None):\n        \"\"\"Process new events\"\"\"\n        events = self.event_store.get_all_events(from_timestamp)\n        \n        for event in events:\n            # Update projections\n            for projection in self.projections:\n                projection.project_event(event)\n            \n            # Handle side effects\n            for handler in self.event_handlers:\n                handler.handle(event)\n\n# Usage Example\ndef create_product_with_event_sourcing(request):\n    \"\"\"Create product using event sourcing\"\"\"\n    event_store = EventStore()\n    repo = ProductAggregateRepository(event_store)\n    \n    # Create aggregate\n    product_id = generate_product_id()\n    aggregate = ProductAggregate.create(\n        product_id=product_id,\n        name=request.data['name'],\n        description=request.data['description'],\n        price=Decimal(request.data['price']),\n        category_id=request.data['category_id'],\n        created_by=request.user.id\n    )\n    \n    # Save aggregate (stores events)\n    repo.save(aggregate)\n    \n    # Process events for projections\n    processor = EventProcessor(event_store)\n    processor.add_projection(ProductProjection())\n    processor.process_new_events()\n    \n    return JsonResponse({'product_id': product_id}, status=201)\n",[1140,18589,18590,18595,18605,18617,18627,18641,18645,18651,18660,18668,18677,18686,18695,18704,18708,18714,18727,18736,18744,18752,18760,18768,18777,18781,18787,18800,18809,18818,18826,18835,18839,18845,18858,18867,18875,18884,18888,18893,18902,18911,18915,18935,18947,18959,18971,18983,18995,19007,19021,19034,19038,19045,19083,19122,19131,19147,19151,19161,19171,19194,19209,19221,19231,19241,19251,19261,19270,19274,19278,19294,19312,19316,19323,19327,19357,19366,19378,19394,19398,19415,19422,19426,19438,19442,19452,19466,19484,19498,19517,19527,19537,19547,19551,19555,19569,19587,19591,19621,19630,19644,19661,19665,19675,19689,19707,19721,19739,19751,19761,19765,19769,19783,19801,19805,19831,19840,19853,19867,19871,19884,19893,19908,19912,19933,19942,19959,19976,19993,20009,20025,20037,20041,20058,20074,20078,20094,20106,20110,20127,20131,20136,20144,20153,20157,20190,20207,20216,20228,20233,20253,20257,20271,20280,20298,20315,20319,20323,20328,20340,20355,20370,20386,20408,20428,20443,20456,20460,20464,20507,20516,20536,20546,20556,20572,20576,20608,20612,20655,20664,20682,20686,20694,20718,20722,20763,20767,20794,20803,20822,20830,20852,20856,20877,20881,20908,20917,20923,20941,20959,20981,20999,21040,21088,21092,21096,21120,21129,21143,21167,21171,21180,21194,21208,21222,21236,21269,21313,21317,21321,21337,21346,21350,21372,21404,21426,21440,21455,21477,21481,21489,21497,21527,21557,21561,21588,21592,21597,21606,21615,21619,21639,21651,21655,21685,21694,21717,21721,21731,21737,21741,21755,21771,21775,21781,21785,21812,21821,21835,21840,21844,21872,21876,21891,21902,21912,21917,21921,21925,21936,21940,21945,21954,21963,21967,21979,21991,22007,22023,22039,22043,22047,22068,22077,22104,22112,22123,22127,22148,22157,22172,22186,22200,22214,22228,22242,22252,22264,22268,22272,22293,22302,22316,22328,22349,22353,22374,22383,22397,22409,22425,22429,22434,22443,22452,22456,22476,22488,22501,22514,22518,22536,22545,22564,22568,22585,22594,22613,22617,22648,22657,22680,22684,22696,22701,22718,22734,22738,22743,22760,22775,22779,22784,22797,22806,22816,22831,22835,22840,22851,22866,22877,22899,22921,22947,22969,22986,22990,22994,22999,23014,23018,23023,23038,23055,23066,23070],{"__ignoreMap":1138},[1143,18591,18592],{"class":1145,"line":1146},[1143,18593,18594],{"class":1149},"# Domain Events\n",[1143,18596,18597,18599,18601,18603],{"class":1145,"line":1153},[1143,18598,1157],{"class":1156},[1143,18600,4305],{"class":1160},[1143,18602,1171],{"class":1156},[1143,18604,4310],{"class":1160},[1143,18606,18607,18609,18612,18614],{"class":1145,"line":1177},[1143,18608,1157],{"class":1156},[1143,18610,18611],{"class":1160}," datetime ",[1143,18613,1171],{"class":1156},[1143,18615,18616],{"class":1160}," datetime\n",[1143,18618,18619,18621,18623,18625],{"class":1145,"line":1194},[1143,18620,1157],{"class":1156},[1143,18622,3425],{"class":1160},[1143,18624,1171],{"class":1156},[1143,18626,3430],{"class":1160},[1143,18628,18629,18631,18633,18635,18637,18639],{"class":1145,"line":1210},[1143,18630,1157],{"class":1156},[1143,18632,2648],{"class":1160},[1143,18634,1171],{"class":1156},[1143,18636,3030],{"class":1160},[1143,18638,1349],{"class":1164},[1143,18640,4298],{"class":1160},[1143,18642,18643],{"class":1145,"line":1225},[1143,18644,1229],{"emptyLinePlaceholder":1228},[1143,18646,18647,18649],{"class":1145,"line":1232},[1143,18648,4329],{"class":1164},[1143,18650,4332],{"class":1341},[1143,18652,18653,18655,18658],{"class":1145,"line":1253},[1143,18654,1236],{"class":1235},[1143,18656,18657],{"class":1239}," DomainEvent",[1143,18659,1380],{"class":1164},[1143,18661,18662,18664,18666],{"class":1145,"line":1267},[1143,18663,1257],{"class":1256},[1143,18665,16235],{"class":1260},[1143,18667,1264],{"class":1256},[1143,18669,18670,18673,18675],{"class":1145,"line":1273},[1143,18671,18672],{"class":1160},"    aggregate_id",[1143,18674,1485],{"class":1164},[1143,18676,4360],{"class":1849},[1143,18678,18679,18682,18684],{"class":1145,"line":1291},[1143,18680,18681],{"class":1160},"    event_id",[1143,18683,1485],{"class":1164},[1143,18685,12669],{"class":1849},[1143,18687,18688,18691,18693],{"class":1145,"line":1314},[1143,18689,18690],{"class":1160},"    occurred_at",[1143,18692,1485],{"class":1164},[1143,18694,18616],{"class":1160},[1143,18696,18697,18700,18702],{"class":1145,"line":1331},[1143,18698,18699],{"class":1160},"    version",[1143,18701,1485],{"class":1164},[1143,18703,4360],{"class":1849},[1143,18705,18706],{"class":1145,"line":1336},[1143,18707,1229],{"emptyLinePlaceholder":1228},[1143,18709,18710,18712],{"class":1145,"line":1363},[1143,18711,4329],{"class":1164},[1143,18713,4332],{"class":1341},[1143,18715,18716,18718,18720,18722,18725],{"class":1145,"line":1374},[1143,18717,1236],{"class":1235},[1143,18719,13186],{"class":1239},[1143,18721,1243],{"class":1164},[1143,18723,18724],{"class":1246},"DomainEvent",[1143,18726,1250],{"class":1164},[1143,18728,18729,18731,18734],{"class":1145,"line":1383},[1143,18730,1257],{"class":1256},[1143,18732,18733],{"class":1260},"Event for product creation",[1143,18735,1264],{"class":1256},[1143,18737,18738,18740,18742],{"class":1145,"line":1412},[1143,18739,12664],{"class":1160},[1143,18741,1485],{"class":1164},[1143,18743,12669],{"class":1849},[1143,18745,18746,18748,18750],{"class":1145,"line":1438},[1143,18747,12674],{"class":1160},[1143,18749,1485],{"class":1164},[1143,18751,12669],{"class":1849},[1143,18753,18754,18756,18758],{"class":1145,"line":1454},[1143,18755,4374],{"class":1160},[1143,18757,1485],{"class":1164},[1143,18759,3430],{"class":1160},[1143,18761,18762,18764,18766],{"class":1145,"line":1465},[1143,18763,12691],{"class":1160},[1143,18765,1485],{"class":1164},[1143,18767,4360],{"class":1849},[1143,18769,18770,18773,18775],{"class":1145,"line":1511},[1143,18771,18772],{"class":1160},"    created_by",[1143,18774,1485],{"class":1164},[1143,18776,4360],{"class":1849},[1143,18778,18779],{"class":1145,"line":1516},[1143,18780,1229],{"emptyLinePlaceholder":1228},[1143,18782,18783,18785],{"class":1145,"line":1534},[1143,18784,4329],{"class":1164},[1143,18786,4332],{"class":1341},[1143,18788,18789,18791,18794,18796,18798],{"class":1145,"line":1544},[1143,18790,1236],{"class":1235},[1143,18792,18793],{"class":1239}," ProductPriceChangedEvent",[1143,18795,1243],{"class":1164},[1143,18797,18724],{"class":1246},[1143,18799,1250],{"class":1164},[1143,18801,18802,18804,18807],{"class":1145,"line":1551},[1143,18803,1257],{"class":1256},[1143,18805,18806],{"class":1260},"Event for product price changes",[1143,18808,1264],{"class":1256},[1143,18810,18811,18814,18816],{"class":1145,"line":1581},[1143,18812,18813],{"class":1160},"    old_price",[1143,18815,1485],{"class":1164},[1143,18817,3430],{"class":1160},[1143,18819,18820,18822,18824],{"class":1145,"line":1605},[1143,18821,12745],{"class":1160},[1143,18823,1485],{"class":1164},[1143,18825,3430],{"class":1160},[1143,18827,18828,18831,18833],{"class":1145,"line":1629},[1143,18829,18830],{"class":1160},"    changed_by",[1143,18832,1485],{"class":1164},[1143,18834,4360],{"class":1849},[1143,18836,18837],{"class":1145,"line":1652},[1143,18838,1229],{"emptyLinePlaceholder":1228},[1143,18840,18841,18843],{"class":1145,"line":1668},[1143,18842,4329],{"class":1164},[1143,18844,4332],{"class":1341},[1143,18846,18847,18849,18852,18854,18856],{"class":1145,"line":1704},[1143,18848,1236],{"class":1235},[1143,18850,18851],{"class":1239}," ProductDeactivatedEvent",[1143,18853,1243],{"class":1164},[1143,18855,18724],{"class":1246},[1143,18857,1250],{"class":1164},[1143,18859,18860,18862,18865],{"class":1145,"line":1709},[1143,18861,1257],{"class":1256},[1143,18863,18864],{"class":1260},"Event for product deactivation",[1143,18866,1264],{"class":1256},[1143,18868,18869,18871,18873],{"class":1145,"line":1715},[1143,18870,12798],{"class":1160},[1143,18872,1485],{"class":1164},[1143,18874,12669],{"class":1849},[1143,18876,18877,18880,18882],{"class":1145,"line":1735},[1143,18878,18879],{"class":1160},"    deactivated_by",[1143,18881,1485],{"class":1164},[1143,18883,4360],{"class":1849},[1143,18885,18886],{"class":1145,"line":1750},[1143,18887,1229],{"emptyLinePlaceholder":1228},[1143,18889,18890],{"class":1145,"line":1767},[1143,18891,18892],{"class":1149},"# Event-Sourced Aggregate\n",[1143,18894,18895,18897,18900],{"class":1145,"line":1772},[1143,18896,1236],{"class":1235},[1143,18898,18899],{"class":1239}," ProductAggregate",[1143,18901,1380],{"class":1164},[1143,18903,18904,18906,18909],{"class":1145,"line":1781},[1143,18905,1257],{"class":1256},[1143,18907,18908],{"class":1260},"Product aggregate using event sourcing",[1143,18910,1264],{"class":1256},[1143,18912,18913],{"class":1145,"line":1791},[1143,18914,1270],{"class":1160},[1143,18916,18917,18919,18921,18923,18925,18927,18929,18931,18933],{"class":1145,"line":1796},[1143,18918,1276],{"class":1235},[1143,18920,1280],{"class":1279},[1143,18922,1243],{"class":1164},[1143,18924,1286],{"class":1285},[1143,18926,1349],{"class":1164},[1143,18928,1358],{"class":1352},[1143,18930,1485],{"class":1164},[1143,18932,1850],{"class":1849},[1143,18934,1250],{"class":1164},[1143,18936,18937,18939,18941,18943,18945],{"class":1145,"line":1809},[1143,18938,1295],{"class":1294},[1143,18940,1165],{"class":1164},[1143,18942,2150],{"class":1300},[1143,18944,1304],{"class":1164},[1143,18946,14802],{"class":1160},[1143,18948,18949,18951,18953,18955,18957],{"class":1145,"line":1826},[1143,18950,1295],{"class":1294},[1143,18952,1165],{"class":1164},[1143,18954,2095],{"class":1300},[1143,18956,1304],{"class":1164},[1143,18958,2821],{"class":2500},[1143,18960,18961,18963,18965,18967,18969],{"class":1145,"line":1831},[1143,18962,1295],{"class":1294},[1143,18964,1165],{"class":1164},[1143,18966,2262],{"class":1300},[1143,18968,1304],{"class":1164},[1143,18970,2821],{"class":2500},[1143,18972,18973,18975,18977,18979,18981],{"class":1145,"line":1863},[1143,18974,1295],{"class":1294},[1143,18976,1165],{"class":1164},[1143,18978,2283],{"class":1300},[1143,18980,1304],{"class":1164},[1143,18982,2821],{"class":2500},[1143,18984,18985,18987,18989,18991,18993],{"class":1145,"line":1873},[1143,18986,1295],{"class":1294},[1143,18988,1165],{"class":1164},[1143,18990,2161],{"class":1300},[1143,18992,1304],{"class":1164},[1143,18994,2821],{"class":2500},[1143,18996,18997,18999,19001,19003,19005],{"class":1145,"line":1898},[1143,18998,1295],{"class":1294},[1143,19000,1165],{"class":1164},[1143,19002,1966],{"class":1300},[1143,19004,1304],{"class":1164},[1143,19006,2501],{"class":2500},[1143,19008,19009,19011,19013,19016,19018],{"class":1145,"line":1913},[1143,19010,1295],{"class":1294},[1143,19012,1165],{"class":1164},[1143,19014,19015],{"class":1300},"version",[1143,19017,1304],{"class":1164},[1143,19019,19020],{"class":1505}," 0\n",[1143,19022,19023,19025,19027,19030,19032],{"class":1145,"line":1943},[1143,19024,1295],{"class":1294},[1143,19026,1165],{"class":1164},[1143,19028,19029],{"class":1300},"uncommitted_events",[1143,19031,1304],{"class":1164},[1143,19033,4508],{"class":1164},[1143,19035,19036],{"class":1145,"line":1949},[1143,19037,1270],{"class":1160},[1143,19039,19040,19042],{"class":1145,"line":1955},[1143,19041,2013],{"class":1164},[1143,19043,19044],{"class":1849},"classmethod\n",[1143,19046,19047,19049,19052,19054,19057,19059,19061,19063,19065,19067,19069,19071,19073,19075,19077,19079,19081],{"class":1145,"line":1971},[1143,19048,1276],{"class":1235},[1143,19050,19051],{"class":1341}," create",[1143,19053,1243],{"class":1164},[1143,19055,19056],{"class":1352},"cls",[1143,19058,1349],{"class":1164},[1143,19060,1358],{"class":1352},[1143,19062,1485],{"class":1164},[1143,19064,1850],{"class":1849},[1143,19066,1349],{"class":1164},[1143,19068,2843],{"class":1352},[1143,19070,1485],{"class":1164},[1143,19072,2848],{"class":1849},[1143,19074,1349],{"class":1164},[1143,19076,14696],{"class":1352},[1143,19078,1485],{"class":1164},[1143,19080,2848],{"class":1849},[1143,19082,5748],{"class":1164},[1143,19084,19085,19088,19090,19092,19094,19096,19098,19100,19102,19105,19107,19109,19111,19113,19115,19118,19120],{"class":1145,"line":1991},[1143,19086,19087],{"class":1352},"               price",[1143,19089,1485],{"class":1164},[1143,19091,2402],{"class":1160},[1143,19093,1349],{"class":1164},[1143,19095,3019],{"class":1352},[1143,19097,1485],{"class":1164},[1143,19099,1850],{"class":1849},[1143,19101,1349],{"class":1164},[1143,19103,19104],{"class":1352}," created_by",[1143,19106,1485],{"class":1164},[1143,19108,1850],{"class":1849},[1143,19110,1853],{"class":1164},[1143,19112,1856],{"class":1164},[1143,19114,1488],{"class":1475},[1143,19116,19117],{"class":1479},"ProductAggregate",[1143,19119,1476],{"class":1475},[1143,19121,1380],{"class":1164},[1143,19123,19124,19126,19129],{"class":1145,"line":1996},[1143,19125,1366],{"class":1256},[1143,19127,19128],{"class":1260},"Create new product aggregate",[1143,19130,1264],{"class":1256},[1143,19132,19133,19136,19138,19141,19143,19145],{"class":1145,"line":2005},[1143,19134,19135],{"class":1160},"        aggregate ",[1143,19137,1389],{"class":1164},[1143,19139,19140],{"class":1294}," cls",[1143,19142,1243],{"class":1164},[1143,19144,1406],{"class":1307},[1143,19146,1409],{"class":1164},[1143,19148,19149],{"class":1145,"line":2010},[1143,19150,1946],{"class":1160},[1143,19152,19153,19155,19157,19159],{"class":1145,"line":2024},[1143,19154,13181],{"class":1160},[1143,19156,1389],{"class":1164},[1143,19158,13186],{"class":1307},[1143,19160,2224],{"class":1164},[1143,19162,19163,19165,19167,19169],{"class":1145,"line":2054},[1143,19164,16446],{"class":1499},[1143,19166,1389],{"class":1164},[1143,19168,1406],{"class":1307},[1143,19170,5748],{"class":1164},[1143,19172,19173,19176,19178,19181,19183,19186,19188,19191],{"class":1145,"line":2064},[1143,19174,19175],{"class":1499},"            event_id",[1143,19177,1389],{"class":1164},[1143,19179,19180],{"class":1849},"str",[1143,19182,1243],{"class":1164},[1143,19184,19185],{"class":1307},"uuid",[1143,19187,1165],{"class":1164},[1143,19189,19190],{"class":1307},"uuid4",[1143,19192,19193],{"class":1164},"()),\n",[1143,19195,19196,19198,19200,19202,19204,19206],{"class":1145,"line":2070},[1143,19197,16476],{"class":1499},[1143,19199,1389],{"class":1164},[1143,19201,13257],{"class":1307},[1143,19203,1165],{"class":1164},[1143,19205,2601],{"class":1307},[1143,19207,19208],{"class":1164},"(),\n",[1143,19210,19211,19214,19216,19219],{"class":1145,"line":2103},[1143,19212,19213],{"class":1499},"            version",[1143,19215,1389],{"class":1164},[1143,19217,19218],{"class":1505},"1",[1143,19220,5748],{"class":1164},[1143,19222,19223,19225,19227,19229],{"class":1145,"line":2122},[1143,19224,2230],{"class":1499},[1143,19226,1389],{"class":1164},[1143,19228,2095],{"class":1307},[1143,19230,5748],{"class":1164},[1143,19232,19233,19235,19237,19239],{"class":1145,"line":2127},[1143,19234,2251],{"class":1499},[1143,19236,1389],{"class":1164},[1143,19238,2262],{"class":1307},[1143,19240,5748],{"class":1164},[1143,19242,19243,19245,19247,19249],{"class":1145,"line":2169},[1143,19244,2272],{"class":1499},[1143,19246,1389],{"class":1164},[1143,19248,2283],{"class":1307},[1143,19250,5748],{"class":1164},[1143,19252,19253,19255,19257,19259],{"class":1145,"line":2186},[1143,19254,13122],{"class":1499},[1143,19256,1389],{"class":1164},[1143,19258,2161],{"class":1307},[1143,19260,5748],{"class":1164},[1143,19262,19263,19265,19267],{"class":1145,"line":2204},[1143,19264,13237],{"class":1499},[1143,19266,1389],{"class":1164},[1143,19268,19269],{"class":1307},"created_by\n",[1143,19271,19272],{"class":1145,"line":2209},[1143,19273,2304],{"class":1164},[1143,19275,19276],{"class":1145,"line":2215},[1143,19277,1946],{"class":1160},[1143,19279,19280,19283,19285,19288,19290,19292],{"class":1145,"line":2227},[1143,19281,19282],{"class":1160},"        aggregate",[1143,19284,1165],{"class":1164},[1143,19286,19287],{"class":1307},"_apply_event",[1143,19289,1243],{"class":1164},[1143,19291,13284],{"class":1307},[1143,19293,1409],{"class":1164},[1143,19295,19296,19298,19300,19302,19304,19306,19308,19310],{"class":1145,"line":2248},[1143,19297,19282],{"class":1160},[1143,19299,1165],{"class":1164},[1143,19301,19029],{"class":1300},[1143,19303,1165],{"class":1164},[1143,19305,4766],{"class":1307},[1143,19307,1243],{"class":1164},[1143,19309,13284],{"class":1307},[1143,19311,1409],{"class":1164},[1143,19313,19314],{"class":1145,"line":2269},[1143,19315,1946],{"class":1160},[1143,19317,19318,19320],{"class":1145,"line":2290},[1143,19319,1999],{"class":1156},[1143,19321,19322],{"class":1160}," aggregate\n",[1143,19324,19325],{"class":1145,"line":2301},[1143,19326,1270],{"class":1160},[1143,19328,19329,19331,19334,19336,19338,19340,19342,19344,19346,19348,19351,19353,19355],{"class":1145,"line":2307},[1143,19330,1276],{"class":1235},[1143,19332,19333],{"class":1341}," change_price",[1143,19335,1243],{"class":1164},[1143,19337,1286],{"class":1285},[1143,19339,1349],{"class":1164},[1143,19341,2397],{"class":1352},[1143,19343,1485],{"class":1164},[1143,19345,2402],{"class":1160},[1143,19347,1349],{"class":1164},[1143,19349,19350],{"class":1352}," changed_by",[1143,19352,1485],{"class":1164},[1143,19354,1850],{"class":1849},[1143,19356,1250],{"class":1164},[1143,19358,19359,19361,19364],{"class":1145,"line":2312},[1143,19360,1366],{"class":1256},[1143,19362,19363],{"class":1260},"Change product price",[1143,19365,1264],{"class":1256},[1143,19367,19368,19370,19372,19374,19376],{"class":1145,"line":2318},[1143,19369,1901],{"class":1156},[1143,19371,2473],{"class":1160},[1143,19373,4638],{"class":1904},[1143,19375,4064],{"class":1505},[1143,19377,1380],{"class":1164},[1143,19379,19380,19382,19384,19386,19388,19390,19392],{"class":1145,"line":2331},[1143,19381,1916],{"class":1156},[1143,19383,4085],{"class":1849},[1143,19385,1243],{"class":1164},[1143,19387,1981],{"class":1475},[1143,19389,4689],{"class":1479},[1143,19391,1981],{"class":1475},[1143,19393,1409],{"class":1164},[1143,19395,19396],{"class":1145,"line":2343},[1143,19397,1946],{"class":1160},[1143,19399,19400,19402,19404,19407,19409,19411,19413],{"class":1145,"line":2348},[1143,19401,1901],{"class":1156},[1143,19403,2473],{"class":1160},[1143,19405,19406],{"class":1904},"==",[1143,19408,1392],{"class":1294},[1143,19410,1165],{"class":1164},[1143,19412,2283],{"class":1300},[1143,19414,1380],{"class":1164},[1143,19416,19417,19419],{"class":1145,"line":2370},[1143,19418,1441],{"class":1156},[1143,19420,19421],{"class":1149},"  # No change needed\n",[1143,19423,19424],{"class":1145,"line":2375},[1143,19425,1946],{"class":1160},[1143,19427,19428,19430,19432,19434,19436],{"class":1145,"line":2413},[1143,19429,13485],{"class":1160},[1143,19431,1389],{"class":1164},[1143,19433,1392],{"class":1294},[1143,19435,1165],{"class":1164},[1143,19437,4421],{"class":1300},[1143,19439,19440],{"class":1145,"line":2423},[1143,19441,1946],{"class":1160},[1143,19443,19444,19446,19448,19450],{"class":1145,"line":2442},[1143,19445,13181],{"class":1160},[1143,19447,1389],{"class":1164},[1143,19449,18793],{"class":1307},[1143,19451,2224],{"class":1164},[1143,19453,19454,19456,19458,19460,19462,19464],{"class":1145,"line":2447},[1143,19455,16446],{"class":1499},[1143,19457,1389],{"class":1164},[1143,19459,1286],{"class":1294},[1143,19461,1165],{"class":1164},[1143,19463,2150],{"class":1300},[1143,19465,5748],{"class":1164},[1143,19467,19468,19470,19472,19474,19476,19478,19480,19482],{"class":1145,"line":2453},[1143,19469,19175],{"class":1499},[1143,19471,1389],{"class":1164},[1143,19473,19180],{"class":1849},[1143,19475,1243],{"class":1164},[1143,19477,19185],{"class":1307},[1143,19479,1165],{"class":1164},[1143,19481,19190],{"class":1307},[1143,19483,19193],{"class":1164},[1143,19485,19486,19488,19490,19492,19494,19496],{"class":1145,"line":2487},[1143,19487,16476],{"class":1499},[1143,19489,1389],{"class":1164},[1143,19491,13257],{"class":1307},[1143,19493,1165],{"class":1164},[1143,19495,2601],{"class":1307},[1143,19497,19208],{"class":1164},[1143,19499,19500,19502,19504,19506,19508,19510,19513,19515],{"class":1145,"line":2504},[1143,19501,19213],{"class":1499},[1143,19503,1389],{"class":1164},[1143,19505,1286],{"class":1294},[1143,19507,1165],{"class":1164},[1143,19509,19015],{"class":1300},[1143,19511,19512],{"class":1904}," +",[1143,19514,14618],{"class":1505},[1143,19516,5748],{"class":1164},[1143,19518,19519,19521,19523,19525],{"class":1145,"line":2509},[1143,19520,13667],{"class":1499},[1143,19522,1389],{"class":1164},[1143,19524,13672],{"class":1307},[1143,19526,5748],{"class":1164},[1143,19528,19529,19531,19533,19535],{"class":1145,"line":2515},[1143,19530,13679],{"class":1499},[1143,19532,1389],{"class":1164},[1143,19534,13512],{"class":1307},[1143,19536,5748],{"class":1164},[1143,19538,19539,19542,19544],{"class":1145,"line":2547},[1143,19540,19541],{"class":1499},"            changed_by",[1143,19543,1389],{"class":1164},[1143,19545,19546],{"class":1307},"changed_by\n",[1143,19548,19549],{"class":1145,"line":2565},[1143,19550,2304],{"class":1164},[1143,19552,19553],{"class":1145,"line":2570},[1143,19554,1946],{"class":1160},[1143,19556,19557,19559,19561,19563,19565,19567],{"class":1145,"line":2584},[1143,19558,1295],{"class":1294},[1143,19560,1165],{"class":1164},[1143,19562,19287],{"class":1307},[1143,19564,1243],{"class":1164},[1143,19566,13284],{"class":1307},[1143,19568,1409],{"class":1164},[1143,19570,19571,19573,19575,19577,19579,19581,19583,19585],{"class":1145,"line":2606},[1143,19572,1295],{"class":1294},[1143,19574,1165],{"class":1164},[1143,19576,19029],{"class":1300},[1143,19578,1165],{"class":1164},[1143,19580,4766],{"class":1307},[1143,19582,1243],{"class":1164},[1143,19584,13284],{"class":1307},[1143,19586,1409],{"class":1164},[1143,19588,19589],{"class":1145,"line":2611},[1143,19590,1270],{"class":1160},[1143,19592,19593,19595,19597,19599,19601,19603,19606,19608,19610,19612,19615,19617,19619],{"class":1145,"line":2632},[1143,19594,1276],{"class":1235},[1143,19596,9723],{"class":1341},[1143,19598,1243],{"class":1164},[1143,19600,1286],{"class":1285},[1143,19602,1349],{"class":1164},[1143,19604,19605],{"class":1352}," reason",[1143,19607,1485],{"class":1164},[1143,19609,2848],{"class":1849},[1143,19611,1349],{"class":1164},[1143,19613,19614],{"class":1352}," deactivated_by",[1143,19616,1485],{"class":1164},[1143,19618,1850],{"class":1849},[1143,19620,1250],{"class":1164},[1143,19622,19623,19625,19628],{"class":1145,"line":2637},[1143,19624,1366],{"class":1256},[1143,19626,19627],{"class":1260},"Deactivate product",[1143,19629,1264],{"class":1256},[1143,19631,19632,19634,19636,19638,19640,19642],{"class":1145,"line":2643},[1143,19633,1901],{"class":1156},[1143,19635,1905],{"class":1904},[1143,19637,1392],{"class":1294},[1143,19639,1165],{"class":1164},[1143,19641,1966],{"class":1300},[1143,19643,1380],{"class":1164},[1143,19645,19646,19648,19650,19652,19654,19657,19659],{"class":1145,"line":2661},[1143,19647,1916],{"class":1156},[1143,19649,4085],{"class":1849},[1143,19651,1243],{"class":1164},[1143,19653,1981],{"class":1475},[1143,19655,19656],{"class":1479},"Product is already deactivated",[1143,19658,1981],{"class":1475},[1143,19660,1409],{"class":1164},[1143,19662,19663],{"class":1145,"line":2682},[1143,19664,1946],{"class":1160},[1143,19666,19667,19669,19671,19673],{"class":1145,"line":2687},[1143,19668,13181],{"class":1160},[1143,19670,1389],{"class":1164},[1143,19672,18851],{"class":1307},[1143,19674,2224],{"class":1164},[1143,19676,19677,19679,19681,19683,19685,19687],{"class":1145,"line":2696},[1143,19678,16446],{"class":1499},[1143,19680,1389],{"class":1164},[1143,19682,1286],{"class":1294},[1143,19684,1165],{"class":1164},[1143,19686,2150],{"class":1300},[1143,19688,5748],{"class":1164},[1143,19690,19691,19693,19695,19697,19699,19701,19703,19705],{"class":1145,"line":2706},[1143,19692,19175],{"class":1499},[1143,19694,1389],{"class":1164},[1143,19696,19180],{"class":1849},[1143,19698,1243],{"class":1164},[1143,19700,19185],{"class":1307},[1143,19702,1165],{"class":1164},[1143,19704,19190],{"class":1307},[1143,19706,19193],{"class":1164},[1143,19708,19709,19711,19713,19715,19717,19719],{"class":1145,"line":2711},[1143,19710,16476],{"class":1499},[1143,19712,1389],{"class":1164},[1143,19714,13257],{"class":1307},[1143,19716,1165],{"class":1164},[1143,19718,2601],{"class":1307},[1143,19720,19208],{"class":1164},[1143,19722,19723,19725,19727,19729,19731,19733,19735,19737],{"class":1145,"line":2745},[1143,19724,19213],{"class":1499},[1143,19726,1389],{"class":1164},[1143,19728,1286],{"class":1294},[1143,19730,1165],{"class":1164},[1143,19732,19015],{"class":1300},[1143,19734,19512],{"class":1904},[1143,19736,14618],{"class":1505},[1143,19738,5748],{"class":1164},[1143,19740,19741,19744,19746,19749],{"class":1145,"line":2755},[1143,19742,19743],{"class":1499},"            reason",[1143,19745,1389],{"class":1164},[1143,19747,19748],{"class":1307},"reason",[1143,19750,5748],{"class":1164},[1143,19752,19753,19756,19758],{"class":1145,"line":2762},[1143,19754,19755],{"class":1499},"            deactivated_by",[1143,19757,1389],{"class":1164},[1143,19759,19760],{"class":1307},"deactivated_by\n",[1143,19762,19763],{"class":1145,"line":2802},[1143,19764,2304],{"class":1164},[1143,19766,19767],{"class":1145,"line":2816},[1143,19768,1946],{"class":1160},[1143,19770,19771,19773,19775,19777,19779,19781],{"class":1145,"line":2824},[1143,19772,1295],{"class":1294},[1143,19774,1165],{"class":1164},[1143,19776,19287],{"class":1307},[1143,19778,1243],{"class":1164},[1143,19780,13284],{"class":1307},[1143,19782,1409],{"class":1164},[1143,19784,19785,19787,19789,19791,19793,19795,19797,19799],{"class":1145,"line":2829},[1143,19786,1295],{"class":1294},[1143,19788,1165],{"class":1164},[1143,19790,19029],{"class":1300},[1143,19792,1165],{"class":1164},[1143,19794,4766],{"class":1307},[1143,19796,1243],{"class":1164},[1143,19798,13284],{"class":1307},[1143,19800,1409],{"class":1164},[1143,19802,19803],{"class":1145,"line":2863},[1143,19804,1270],{"class":1160},[1143,19806,19807,19809,19812,19814,19816,19818,19821,19823,19825,19827,19829],{"class":1145,"line":2873},[1143,19808,1276],{"class":1235},[1143,19810,19811],{"class":1341}," load_from_history",[1143,19813,1243],{"class":1164},[1143,19815,1286],{"class":1285},[1143,19817,1349],{"class":1164},[1143,19819,19820],{"class":1352}," events",[1143,19822,1485],{"class":1164},[1143,19824,3030],{"class":1160},[1143,19826,2090],{"class":1164},[1143,19828,18724],{"class":1160},[1143,19830,2100],{"class":1164},[1143,19832,19833,19835,19838],{"class":1145,"line":2880},[1143,19834,1366],{"class":1256},[1143,19836,19837],{"class":1260},"Rebuild aggregate from event history",[1143,19839,1264],{"class":1256},[1143,19841,19842,19844,19847,19849,19851],{"class":1145,"line":2905},[1143,19843,5919],{"class":1156},[1143,19845,19846],{"class":1160}," event ",[1143,19848,4859],{"class":1156},[1143,19850,19820],{"class":1160},[1143,19852,1380],{"class":1164},[1143,19854,19855,19857,19859,19861,19863,19865],{"class":1145,"line":2918},[1143,19856,3762],{"class":1294},[1143,19858,1165],{"class":1164},[1143,19860,19287],{"class":1307},[1143,19862,1243],{"class":1164},[1143,19864,13284],{"class":1307},[1143,19866,1409],{"class":1164},[1143,19868,19869],{"class":1145,"line":2925},[1143,19870,1270],{"class":1160},[1143,19872,19873,19875,19878,19880,19882],{"class":1145,"line":2930},[1143,19874,1276],{"class":1235},[1143,19876,19877],{"class":1341}," mark_events_as_committed",[1143,19879,1243],{"class":1164},[1143,19881,1286],{"class":1285},[1143,19883,1250],{"class":1164},[1143,19885,19886,19888,19891],{"class":1145,"line":2959},[1143,19887,1366],{"class":1256},[1143,19889,19890],{"class":1260},"Mark uncommitted events as committed",[1143,19892,1264],{"class":1256},[1143,19894,19895,19897,19899,19901,19903,19906],{"class":1145,"line":2969},[1143,19896,1295],{"class":1294},[1143,19898,1165],{"class":1164},[1143,19900,19029],{"class":1300},[1143,19902,1165],{"class":1164},[1143,19904,19905],{"class":1307},"clear",[1143,19907,1311],{"class":1164},[1143,19909,19910],{"class":1145,"line":3000},[1143,19911,1270],{"class":1160},[1143,19913,19914,19916,19919,19921,19923,19925,19927,19929,19931],{"class":1145,"line":3005},[1143,19915,1276],{"class":1235},[1143,19917,19918],{"class":1341}," _apply_event",[1143,19920,1243],{"class":1164},[1143,19922,1286],{"class":1285},[1143,19924,1349],{"class":1164},[1143,19926,16390],{"class":1352},[1143,19928,1485],{"class":1164},[1143,19930,18657],{"class":1160},[1143,19932,1250],{"class":1164},[1143,19934,19935,19937,19940],{"class":1145,"line":3039},[1143,19936,1366],{"class":1256},[1143,19938,19939],{"class":1260},"Apply event to aggregate state",[1143,19941,1264],{"class":1256},[1143,19943,19944,19946,19949,19951,19953,19955,19957],{"class":1145,"line":3049},[1143,19945,1901],{"class":1156},[1143,19947,19948],{"class":1279}," isinstance",[1143,19950,1243],{"class":1164},[1143,19952,13284],{"class":1307},[1143,19954,1349],{"class":1164},[1143,19956,13186],{"class":1307},[1143,19958,1250],{"class":1164},[1143,19960,19961,19963,19965,19967,19969,19971,19973],{"class":1145,"line":3059},[1143,19962,3762],{"class":1294},[1143,19964,1165],{"class":1164},[1143,19966,2095],{"class":1300},[1143,19968,1304],{"class":1164},[1143,19970,16390],{"class":1160},[1143,19972,1165],{"class":1164},[1143,19974,19975],{"class":1300},"name\n",[1143,19977,19978,19980,19982,19984,19986,19988,19990],{"class":1145,"line":3093},[1143,19979,3762],{"class":1294},[1143,19981,1165],{"class":1164},[1143,19983,2262],{"class":1300},[1143,19985,1304],{"class":1164},[1143,19987,16390],{"class":1160},[1143,19989,1165],{"class":1164},[1143,19991,19992],{"class":1300},"description\n",[1143,19994,19995,19997,19999,20001,20003,20005,20007],{"class":1145,"line":3111},[1143,19996,3762],{"class":1294},[1143,19998,1165],{"class":1164},[1143,20000,2283],{"class":1300},[1143,20002,1304],{"class":1164},[1143,20004,16390],{"class":1160},[1143,20006,1165],{"class":1164},[1143,20008,4421],{"class":1300},[1143,20010,20011,20013,20015,20017,20019,20021,20023],{"class":1145,"line":3129},[1143,20012,3762],{"class":1294},[1143,20014,1165],{"class":1164},[1143,20016,2161],{"class":1300},[1143,20018,1304],{"class":1164},[1143,20020,16390],{"class":1160},[1143,20022,1165],{"class":1164},[1143,20024,13131],{"class":1300},[1143,20026,20027,20029,20031,20033,20035],{"class":1145,"line":3134},[1143,20028,3762],{"class":1294},[1143,20030,1165],{"class":1164},[1143,20032,1966],{"class":1300},[1143,20034,1304],{"class":1164},[1143,20036,2501],{"class":2500},[1143,20038,20039],{"class":1145,"line":3139},[1143,20040,1946],{"class":1160},[1143,20042,20043,20046,20048,20050,20052,20054,20056],{"class":1145,"line":3172},[1143,20044,20045],{"class":1156},"        elif",[1143,20047,19948],{"class":1279},[1143,20049,1243],{"class":1164},[1143,20051,13284],{"class":1307},[1143,20053,1349],{"class":1164},[1143,20055,18793],{"class":1307},[1143,20057,1250],{"class":1164},[1143,20059,20060,20062,20064,20066,20068,20070,20072],{"class":1145,"line":3182},[1143,20061,3762],{"class":1294},[1143,20063,1165],{"class":1164},[1143,20065,2283],{"class":1300},[1143,20067,1304],{"class":1164},[1143,20069,16390],{"class":1160},[1143,20071,1165],{"class":1164},[1143,20073,13611],{"class":1300},[1143,20075,20076],{"class":1145,"line":3191},[1143,20077,1946],{"class":1160},[1143,20079,20080,20082,20084,20086,20088,20090,20092],{"class":1145,"line":3206},[1143,20081,20045],{"class":1156},[1143,20083,19948],{"class":1279},[1143,20085,1243],{"class":1164},[1143,20087,13284],{"class":1307},[1143,20089,1349],{"class":1164},[1143,20091,18851],{"class":1307},[1143,20093,1250],{"class":1164},[1143,20095,20096,20098,20100,20102,20104],{"class":1145,"line":3242},[1143,20097,3762],{"class":1294},[1143,20099,1165],{"class":1164},[1143,20101,1966],{"class":1300},[1143,20103,1304],{"class":1164},[1143,20105,3905],{"class":2500},[1143,20107,20108],{"class":1145,"line":3253},[1143,20109,1946],{"class":1160},[1143,20111,20112,20114,20116,20118,20120,20122,20124],{"class":1145,"line":3271},[1143,20113,1295],{"class":1294},[1143,20115,1165],{"class":1164},[1143,20117,19015],{"class":1300},[1143,20119,1304],{"class":1164},[1143,20121,16390],{"class":1160},[1143,20123,1165],{"class":1164},[1143,20125,20126],{"class":1300},"version\n",[1143,20128,20129],{"class":1145,"line":3276},[1143,20130,1229],{"emptyLinePlaceholder":1228},[1143,20132,20133],{"class":1145,"line":3281},[1143,20134,20135],{"class":1149},"# Event Store\n",[1143,20137,20138,20140,20142],{"class":1145,"line":3309},[1143,20139,1236],{"class":1235},[1143,20141,12944],{"class":1239},[1143,20143,1380],{"class":1164},[1143,20145,20146,20148,20151],{"class":1145,"line":3319},[1143,20147,1257],{"class":1256},[1143,20149,20150],{"class":1260},"Store for domain events with event sourcing",[1143,20152,1264],{"class":1256},[1143,20154,20155],{"class":1145,"line":3330},[1143,20156,1270],{"class":1160},[1143,20158,20159,20161,20164,20166,20168,20170,20172,20174,20176,20178,20180,20182,20184,20186,20188],{"class":1145,"line":3337},[1143,20160,1276],{"class":1235},[1143,20162,20163],{"class":1341}," save_events",[1143,20165,1243],{"class":1164},[1143,20167,1286],{"class":1285},[1143,20169,1349],{"class":1164},[1143,20171,16265],{"class":1352},[1143,20173,1485],{"class":1164},[1143,20175,1850],{"class":1849},[1143,20177,1349],{"class":1164},[1143,20179,19820],{"class":1352},[1143,20181,1485],{"class":1164},[1143,20183,3030],{"class":1160},[1143,20185,2090],{"class":1164},[1143,20187,18724],{"class":1160},[1143,20189,2245],{"class":1164},[1143,20191,20192,20195,20197,20199,20201,20203,20205],{"class":1145,"line":3342},[1143,20193,20194],{"class":1352},"                   expected_version",[1143,20196,1485],{"class":1164},[1143,20198,1850],{"class":1849},[1143,20200,1853],{"class":1164},[1143,20202,1856],{"class":1164},[1143,20204,3366],{"class":2500},[1143,20206,1380],{"class":1164},[1143,20208,20209,20211,20214],{"class":1145,"line":3371},[1143,20210,1366],{"class":1256},[1143,20212,20213],{"class":1260},"Save events with optimistic concurrency control",[1143,20215,1264],{"class":1256},[1143,20217,20218,20220,20222,20224,20226],{"class":1145,"line":3381},[1143,20219,6494],{"class":1156},[1143,20221,6497],{"class":1160},[1143,20223,1165],{"class":1164},[1143,20225,6502],{"class":1307},[1143,20227,6505],{"class":1164},[1143,20229,20230],{"class":1145,"line":3393},[1143,20231,20232],{"class":1149},"            # Check current version\n",[1143,20234,20235,20238,20240,20242,20244,20247,20249,20251],{"class":1145,"line":3398},[1143,20236,20237],{"class":1160},"            current_version ",[1143,20239,1389],{"class":1164},[1143,20241,1392],{"class":1294},[1143,20243,1165],{"class":1164},[1143,20245,20246],{"class":1307},"_get_current_version",[1143,20248,1243],{"class":1164},[1143,20250,16316],{"class":1307},[1143,20252,1409],{"class":1164},[1143,20254,20255],{"class":1145,"line":3404},[1143,20256,6279],{"class":1160},[1143,20258,20259,20261,20264,20266,20269],{"class":1145,"line":3420},[1143,20260,6204],{"class":1156},[1143,20262,20263],{"class":1160}," current_version ",[1143,20265,2476],{"class":1904},[1143,20267,20268],{"class":1160}," expected_version",[1143,20270,1380],{"class":1164},[1143,20272,20273,20275,20278],{"class":1145,"line":3433},[1143,20274,6261],{"class":1156},[1143,20276,20277],{"class":1307}," ConcurrencyError",[1143,20279,2224],{"class":1164},[1143,20281,20282,20285,20288,20290,20293,20295],{"class":1145,"line":3438},[1143,20283,20284],{"class":1235},"                    f",[1143,20286,20287],{"class":1479},"\"Expected version ",[1143,20289,1930],{"class":1929},[1143,20291,20292],{"class":1307},"expected_version",[1143,20294,1935],{"class":1929},[1143,20296,20297],{"class":1479},", \"\n",[1143,20299,20300,20302,20305,20307,20310,20312],{"class":1145,"line":3457},[1143,20301,20284],{"class":1235},[1143,20303,20304],{"class":1479},"\"but current version is ",[1143,20306,1930],{"class":1929},[1143,20308,20309],{"class":1307},"current_version",[1143,20311,1935],{"class":1929},[1143,20313,20314],{"class":1479},"\"\n",[1143,20316,20317],{"class":1145,"line":3467},[1143,20318,6708],{"class":1164},[1143,20320,20321],{"class":1145,"line":3472},[1143,20322,6279],{"class":1160},[1143,20324,20325],{"class":1145,"line":3509},[1143,20326,20327],{"class":1149},"            # Save events\n",[1143,20329,20330,20332,20334,20336,20338],{"class":1145,"line":3526},[1143,20331,6762],{"class":1156},[1143,20333,19846],{"class":1160},[1143,20335,4859],{"class":1156},[1143,20337,19820],{"class":1160},[1143,20339,1380],{"class":1164},[1143,20341,20342,20345,20347,20349,20351,20353],{"class":1145,"line":3563},[1143,20343,20344],{"class":1160},"                EventStoreRecord",[1143,20346,1165],{"class":1164},[1143,20348,2140],{"class":1300},[1143,20350,1165],{"class":1164},[1143,20352,6658],{"class":1307},[1143,20354,2224],{"class":1164},[1143,20356,20357,20360,20362,20364,20366,20368],{"class":1145,"line":3604},[1143,20358,20359],{"class":1499},"                    aggregate_id",[1143,20361,1389],{"class":1164},[1143,20363,13284],{"class":1307},[1143,20365,1165],{"class":1164},[1143,20367,16316],{"class":1300},[1143,20369,5748],{"class":1164},[1143,20371,20372,20375,20377,20379,20381,20384],{"class":1145,"line":3630},[1143,20373,20374],{"class":1499},"                    event_id",[1143,20376,1389],{"class":1164},[1143,20378,13284],{"class":1307},[1143,20380,1165],{"class":1164},[1143,20382,20383],{"class":1300},"event_id",[1143,20385,5748],{"class":1164},[1143,20387,20388,20391,20393,20395,20397,20401,20403,20406],{"class":1145,"line":3655},[1143,20389,20390],{"class":1499},"                    event_type",[1143,20392,1389],{"class":1164},[1143,20394,13284],{"class":1307},[1143,20396,1165],{"class":1164},[1143,20398,20400],{"class":20399},"s131V","__class__",[1143,20402,1165],{"class":1164},[1143,20404,20405],{"class":20399},"__name__",[1143,20407,5748],{"class":1164},[1143,20409,20410,20413,20415,20417,20419,20422,20424,20426],{"class":1145,"line":3681},[1143,20411,20412],{"class":1499},"                    event_data",[1143,20414,1389],{"class":1164},[1143,20416,1286],{"class":1294},[1143,20418,1165],{"class":1164},[1143,20420,20421],{"class":1307},"_serialize_event",[1143,20423,1243],{"class":1164},[1143,20425,13284],{"class":1307},[1143,20427,3239],{"class":1164},[1143,20429,20430,20433,20435,20437,20439,20441],{"class":1145,"line":3706},[1143,20431,20432],{"class":1499},"                    version",[1143,20434,1389],{"class":1164},[1143,20436,13284],{"class":1307},[1143,20438,1165],{"class":1164},[1143,20440,19015],{"class":1300},[1143,20442,5748],{"class":1164},[1143,20444,20445,20448,20450,20452,20454],{"class":1145,"line":3711},[1143,20446,20447],{"class":1499},"                    occurred_at",[1143,20449,1389],{"class":1164},[1143,20451,13284],{"class":1307},[1143,20453,1165],{"class":1164},[1143,20455,16485],{"class":1300},[1143,20457,20458],{"class":1145,"line":3725},[1143,20459,6708],{"class":1164},[1143,20461,20462],{"class":1145,"line":3735},[1143,20463,1270],{"class":1160},[1143,20465,20466,20468,20470,20472,20474,20476,20478,20480,20482,20484,20487,20489,20491,20493,20495,20497,20499,20501,20503,20505],{"class":1145,"line":3741},[1143,20467,1276],{"class":1235},[1143,20469,16500],{"class":1341},[1143,20471,1243],{"class":1164},[1143,20473,1286],{"class":1285},[1143,20475,1349],{"class":1164},[1143,20477,16265],{"class":1352},[1143,20479,1485],{"class":1164},[1143,20481,1850],{"class":1849},[1143,20483,1349],{"class":1164},[1143,20485,20486],{"class":1352}," from_version",[1143,20488,1485],{"class":1164},[1143,20490,1850],{"class":1849},[1143,20492,1304],{"class":1164},[1143,20494,4064],{"class":1505},[1143,20496,1853],{"class":1164},[1143,20498,1856],{"class":1164},[1143,20500,3030],{"class":1160},[1143,20502,2090],{"class":1164},[1143,20504,18724],{"class":1160},[1143,20506,2742],{"class":1164},[1143,20508,20509,20511,20514],{"class":1145,"line":3759},[1143,20510,1366],{"class":1256},[1143,20512,20513],{"class":1260},"Get events for aggregate from specific version",[1143,20515,1264],{"class":1256},[1143,20517,20518,20521,20523,20526,20528,20530,20532,20534],{"class":1145,"line":3788},[1143,20519,20520],{"class":1160},"        records ",[1143,20522,1389],{"class":1164},[1143,20524,20525],{"class":1160}," EventStoreRecord",[1143,20527,1165],{"class":1164},[1143,20529,2140],{"class":1300},[1143,20531,1165],{"class":1164},[1143,20533,2982],{"class":1307},[1143,20535,2224],{"class":1164},[1143,20537,20538,20540,20542,20544],{"class":1145,"line":3793},[1143,20539,16446],{"class":1499},[1143,20541,1389],{"class":1164},[1143,20543,16316],{"class":1307},[1143,20545,5748],{"class":1164},[1143,20547,20548,20551,20553],{"class":1145,"line":3799},[1143,20549,20550],{"class":1499},"            version__gt",[1143,20552,1389],{"class":1164},[1143,20554,20555],{"class":1307},"from_version\n",[1143,20557,20558,20560,20562,20564,20566,20568,20570],{"class":1145,"line":3817},[1143,20559,7082],{"class":1164},[1143,20561,3116],{"class":1307},[1143,20563,1243],{"class":1164},[1143,20565,1476],{"class":1475},[1143,20567,19015],{"class":1479},[1143,20569,1476],{"class":1475},[1143,20571,1409],{"class":1164},[1143,20573,20574],{"class":1145,"line":3859},[1143,20575,1946],{"class":1160},[1143,20577,20578,20580,20582,20584,20586,20589,20591,20594,20596,20598,20601,20603,20606],{"class":1145,"line":3864},[1143,20579,1999],{"class":1156},[1143,20581,4847],{"class":1164},[1143,20583,1286],{"class":1294},[1143,20585,1165],{"class":1164},[1143,20587,20588],{"class":1307},"_deserialize_event",[1143,20590,1243],{"class":1164},[1143,20592,20593],{"class":1307},"record",[1143,20595,1853],{"class":1164},[1143,20597,5251],{"class":1156},[1143,20599,20600],{"class":1160}," record ",[1143,20602,4859],{"class":1156},[1143,20604,20605],{"class":1160}," records",[1143,20607,4883],{"class":1164},[1143,20609,20610],{"class":1145,"line":3878},[1143,20611,1270],{"class":1160},[1143,20613,20614,20616,20619,20621,20623,20625,20628,20630,20632,20634,20637,20639,20641,20643,20645,20647,20649,20651,20653],{"class":1145,"line":3888},[1143,20615,1276],{"class":1235},[1143,20617,20618],{"class":1341}," get_all_events",[1143,20620,1243],{"class":1164},[1143,20622,1286],{"class":1285},[1143,20624,1349],{"class":1164},[1143,20626,20627],{"class":1352}," from_timestamp",[1143,20629,1485],{"class":1164},[1143,20631,2653],{"class":1160},[1143,20633,2090],{"class":1164},[1143,20635,20636],{"class":1160},"datetime",[1143,20638,4503],{"class":1164},[1143,20640,1304],{"class":1164},[1143,20642,3366],{"class":2500},[1143,20644,1853],{"class":1164},[1143,20646,1856],{"class":1164},[1143,20648,3030],{"class":1160},[1143,20650,2090],{"class":1164},[1143,20652,18724],{"class":1160},[1143,20654,2742],{"class":1164},[1143,20656,20657,20659,20662],{"class":1145,"line":3894},[1143,20658,1366],{"class":1256},[1143,20660,20661],{"class":1260},"Get all events from specific timestamp",[1143,20663,1264],{"class":1256},[1143,20665,20666,20668,20670,20672,20674,20676,20678,20680],{"class":1145,"line":3908},[1143,20667,15127],{"class":1160},[1143,20669,1389],{"class":1164},[1143,20671,20525],{"class":1160},[1143,20673,1165],{"class":1164},[1143,20675,2140],{"class":1300},[1143,20677,1165],{"class":1164},[1143,20679,6622],{"class":1307},[1143,20681,1311],{"class":1164},[1143,20683,20684],{"class":1145,"line":3913},[1143,20685,1946],{"class":1160},[1143,20687,20688,20690,20692],{"class":1145,"line":3919},[1143,20689,1901],{"class":1156},[1143,20691,20627],{"class":1160},[1143,20693,1380],{"class":1164},[1143,20695,20696,20698,20700,20702,20704,20706,20708,20711,20713,20716],{"class":1145,"line":3936},[1143,20697,15174],{"class":1160},[1143,20699,1389],{"class":1164},[1143,20701,15179],{"class":1160},[1143,20703,1165],{"class":1164},[1143,20705,2982],{"class":1307},[1143,20707,1243],{"class":1164},[1143,20709,20710],{"class":1499},"occurred_at__gte",[1143,20712,1389],{"class":1164},[1143,20714,20715],{"class":1307},"from_timestamp",[1143,20717,1409],{"class":1164},[1143,20719,20720],{"class":1145,"line":3949},[1143,20721,1946],{"class":1160},[1143,20723,20724,20726,20728,20730,20732,20734,20736,20738,20740,20742,20744,20746,20748,20750,20752,20754,20756,20758,20760],{"class":1145,"line":3954},[1143,20725,1999],{"class":1156},[1143,20727,4847],{"class":1164},[1143,20729,1286],{"class":1294},[1143,20731,1165],{"class":1164},[1143,20733,20588],{"class":1307},[1143,20735,1243],{"class":1164},[1143,20737,20593],{"class":1307},[1143,20739,1853],{"class":1164},[1143,20741,5251],{"class":1156},[1143,20743,20600],{"class":1160},[1143,20745,4859],{"class":1156},[1143,20747,15179],{"class":1160},[1143,20749,1165],{"class":1164},[1143,20751,3116],{"class":1307},[1143,20753,1243],{"class":1164},[1143,20755,1476],{"class":1475},[1143,20757,16344],{"class":1479},[1143,20759,1476],{"class":1475},[1143,20761,20762],{"class":1164},")]\n",[1143,20764,20765],{"class":1145,"line":3974},[1143,20766,1270],{"class":1160},[1143,20768,20769,20771,20774,20776,20778,20780,20782,20784,20786,20788,20790,20792],{"class":1145,"line":3984},[1143,20770,1276],{"class":1235},[1143,20772,20773],{"class":1341}," _get_current_version",[1143,20775,1243],{"class":1164},[1143,20777,1286],{"class":1285},[1143,20779,1349],{"class":1164},[1143,20781,16265],{"class":1352},[1143,20783,1485],{"class":1164},[1143,20785,1850],{"class":1849},[1143,20787,1853],{"class":1164},[1143,20789,1856],{"class":1164},[1143,20791,1850],{"class":1849},[1143,20793,1380],{"class":1164},[1143,20795,20796,20798,20801],{"class":1145,"line":3990},[1143,20797,1366],{"class":1256},[1143,20799,20800],{"class":1260},"Get current version of aggregate",[1143,20802,1264],{"class":1256},[1143,20804,20805,20808,20810,20812,20814,20816,20818,20820],{"class":1145,"line":4010},[1143,20806,20807],{"class":1160},"        latest_event ",[1143,20809,1389],{"class":1164},[1143,20811,20525],{"class":1160},[1143,20813,1165],{"class":1164},[1143,20815,2140],{"class":1300},[1143,20817,1165],{"class":1164},[1143,20819,2982],{"class":1307},[1143,20821,2224],{"class":1164},[1143,20823,20824,20826,20828],{"class":1145,"line":4015},[1143,20825,16446],{"class":1499},[1143,20827,1389],{"class":1164},[1143,20829,16563],{"class":1307},[1143,20831,20832,20834,20836,20838,20840,20843,20845,20847,20850],{"class":1145,"line":4044},[1143,20833,7082],{"class":1164},[1143,20835,3116],{"class":1307},[1143,20837,1243],{"class":1164},[1143,20839,1476],{"class":1475},[1143,20841,20842],{"class":1479},"-version",[1143,20844,1476],{"class":1475},[1143,20846,2787],{"class":1164},[1143,20848,20849],{"class":1307},"first",[1143,20851,1311],{"class":1164},[1143,20853,20854],{"class":1145,"line":4054},[1143,20855,1946],{"class":1160},[1143,20857,20858,20860,20863,20865,20867,20869,20872,20875],{"class":1145,"line":4080},[1143,20859,1999],{"class":1156},[1143,20861,20862],{"class":1160}," latest_event",[1143,20864,1165],{"class":1164},[1143,20866,19015],{"class":1300},[1143,20868,4868],{"class":1156},[1143,20870,20871],{"class":1160}," latest_event ",[1143,20873,20874],{"class":1156},"else",[1143,20876,19020],{"class":1505},[1143,20878,20879],{"class":1145,"line":4105},[1143,20880,1270],{"class":1160},[1143,20882,20883,20885,20888,20890,20892,20894,20896,20898,20900,20902,20904,20906],{"class":1145,"line":4110},[1143,20884,1276],{"class":1235},[1143,20886,20887],{"class":1341}," _serialize_event",[1143,20889,1243],{"class":1164},[1143,20891,1286],{"class":1285},[1143,20893,1349],{"class":1164},[1143,20895,16390],{"class":1352},[1143,20897,1485],{"class":1164},[1143,20899,18657],{"class":1160},[1143,20901,1853],{"class":1164},[1143,20903,1856],{"class":1164},[1143,20905,2043],{"class":1849},[1143,20907,1380],{"class":1164},[1143,20909,20910,20912,20915],{"class":1145,"line":4139},[1143,20911,1366],{"class":1256},[1143,20913,20914],{"class":1260},"Serialize event to dictionary",[1143,20916,1264],{"class":1256},[1143,20918,20919,20921],{"class":1145,"line":4156},[1143,20920,1999],{"class":1156},[1143,20922,14518],{"class":1164},[1143,20924,20925,20927,20929,20931,20933,20935,20937,20939],{"class":1145,"line":4161},[1143,20926,14523],{"class":1475},[1143,20928,16316],{"class":1479},[1143,20930,1476],{"class":1475},[1143,20932,1485],{"class":1164},[1143,20934,16390],{"class":1160},[1143,20936,1165],{"class":1164},[1143,20938,16316],{"class":1300},[1143,20940,5748],{"class":1164},[1143,20942,20943,20945,20947,20949,20951,20953,20955,20957],{"class":1145,"line":4172},[1143,20944,14523],{"class":1475},[1143,20946,20383],{"class":1479},[1143,20948,1476],{"class":1475},[1143,20950,1485],{"class":1164},[1143,20952,16390],{"class":1160},[1143,20954,1165],{"class":1164},[1143,20956,20383],{"class":1300},[1143,20958,5748],{"class":1164},[1143,20960,20961,20963,20965,20967,20969,20971,20973,20975,20977,20979],{"class":1145,"line":4183},[1143,20962,14523],{"class":1475},[1143,20964,16344],{"class":1479},[1143,20966,1476],{"class":1475},[1143,20968,1485],{"class":1164},[1143,20970,16390],{"class":1160},[1143,20972,1165],{"class":1164},[1143,20974,16344],{"class":1300},[1143,20976,1165],{"class":1164},[1143,20978,11128],{"class":1307},[1143,20980,19208],{"class":1164},[1143,20982,20983,20985,20987,20989,20991,20993,20995,20997],{"class":1145,"line":4219},[1143,20984,14523],{"class":1475},[1143,20986,19015],{"class":1479},[1143,20988,1476],{"class":1475},[1143,20990,1485],{"class":1164},[1143,20992,16390],{"class":1160},[1143,20994,1165],{"class":1164},[1143,20996,19015],{"class":1300},[1143,20998,5748],{"class":1164},[1143,21000,21001,21004,21006,21009,21011,21014,21016,21019,21021,21023,21025,21027,21029,21032,21034,21036,21038],{"class":1145,"line":4242},[1143,21002,21003],{"class":1904},"            **",[1143,21005,1930],{"class":1164},[1143,21007,21008],{"class":1160},"k",[1143,21010,1485],{"class":1164},[1143,21012,21013],{"class":1160}," v ",[1143,21015,4853],{"class":1156},[1143,21017,21018],{"class":1160}," k",[1143,21020,1349],{"class":1164},[1143,21022,21013],{"class":1160},[1143,21024,4859],{"class":1156},[1143,21026,16390],{"class":1160},[1143,21028,1165],{"class":1164},[1143,21030,21031],{"class":20399},"__dict__",[1143,21033,1165],{"class":1164},[1143,21035,4491],{"class":1307},[1143,21037,5248],{"class":1164},[1143,21039,5736],{"class":1160},[1143,21041,21042,21045,21048,21051,21053,21055,21057,21059,21061,21063,21065,21067,21069,21071,21073,21075,21077,21079,21081,21083,21085],{"class":1145,"line":6730},[1143,21043,21044],{"class":1156},"               if",[1143,21046,21047],{"class":1160}," k ",[1143,21049,21050],{"class":1904},"not",[1143,21052,5053],{"class":1904},[1143,21054,4847],{"class":1164},[1143,21056,1476],{"class":1475},[1143,21058,16316],{"class":1479},[1143,21060,1476],{"class":1475},[1143,21062,1349],{"class":1164},[1143,21064,1488],{"class":1475},[1143,21066,20383],{"class":1479},[1143,21068,1476],{"class":1475},[1143,21070,1349],{"class":1164},[1143,21072,1488],{"class":1475},[1143,21074,16344],{"class":1479},[1143,21076,1476],{"class":1475},[1143,21078,1349],{"class":1164},[1143,21080,1488],{"class":1475},[1143,21082,19015],{"class":1479},[1143,21084,1476],{"class":1475},[1143,21086,21087],{"class":1164},"]}\n",[1143,21089,21090],{"class":1145,"line":6748},[1143,21091,14634],{"class":1164},[1143,21093,21094],{"class":1145,"line":6753},[1143,21095,1270],{"class":1160},[1143,21097,21098,21100,21103,21105,21107,21109,21112,21114,21116,21118],{"class":1145,"line":6759},[1143,21099,1276],{"class":1235},[1143,21101,21102],{"class":1341}," _deserialize_event",[1143,21104,1243],{"class":1164},[1143,21106,1286],{"class":1285},[1143,21108,1349],{"class":1164},[1143,21110,21111],{"class":1352}," record",[1143,21113,1853],{"class":1164},[1143,21115,1856],{"class":1164},[1143,21117,18657],{"class":1160},[1143,21119,1380],{"class":1164},[1143,21121,21122,21124,21127],{"class":1145,"line":6777},[1143,21123,1366],{"class":1256},[1143,21125,21126],{"class":1260},"Deserialize event from record",[1143,21128,1264],{"class":1256},[1143,21130,21131,21134,21136,21138,21140],{"class":1145,"line":6793},[1143,21132,21133],{"class":1160},"        event_data ",[1143,21135,1389],{"class":1164},[1143,21137,21111],{"class":1160},[1143,21139,1165],{"class":1164},[1143,21141,21142],{"class":1300},"event_data\n",[1143,21144,21145,21148,21150,21153,21156,21158,21160,21162,21164],{"class":1145,"line":6806},[1143,21146,21147],{"class":1160},"        event_class ",[1143,21149,1389],{"class":1164},[1143,21151,21152],{"class":1279}," globals",[1143,21154,21155],{"class":1164},"()[",[1143,21157,20593],{"class":1160},[1143,21159,1165],{"class":1164},[1143,21161,16302],{"class":1300},[1143,21163,4503],{"class":1164},[1143,21165,21166],{"class":1149},"  # Get event class by name\n",[1143,21168,21169],{"class":1145,"line":6822},[1143,21170,1946],{"class":1160},[1143,21172,21173,21175,21178],{"class":1145,"line":6838},[1143,21174,1999],{"class":1156},[1143,21176,21177],{"class":1307}," event_class",[1143,21179,2224],{"class":1164},[1143,21181,21182,21184,21186,21188,21190,21192],{"class":1145,"line":6852},[1143,21183,16446],{"class":1499},[1143,21185,1389],{"class":1164},[1143,21187,20593],{"class":1307},[1143,21189,1165],{"class":1164},[1143,21191,16316],{"class":1300},[1143,21193,5748],{"class":1164},[1143,21195,21196,21198,21200,21202,21204,21206],{"class":1145,"line":6857},[1143,21197,19175],{"class":1499},[1143,21199,1389],{"class":1164},[1143,21201,20593],{"class":1307},[1143,21203,1165],{"class":1164},[1143,21205,20383],{"class":1300},[1143,21207,5748],{"class":1164},[1143,21209,21210,21212,21214,21216,21218,21220],{"class":1145,"line":6862},[1143,21211,16476],{"class":1499},[1143,21213,1389],{"class":1164},[1143,21215,20593],{"class":1307},[1143,21217,1165],{"class":1164},[1143,21219,16344],{"class":1300},[1143,21221,5748],{"class":1164},[1143,21223,21224,21226,21228,21230,21232,21234],{"class":1145,"line":6870},[1143,21225,19213],{"class":1499},[1143,21227,1389],{"class":1164},[1143,21229,20593],{"class":1307},[1143,21231,1165],{"class":1164},[1143,21233,19015],{"class":1300},[1143,21235,5748],{"class":1164},[1143,21237,21238,21240,21242,21244,21246,21248,21250,21252,21254,21256,21258,21261,21263,21265,21267],{"class":1145,"line":6875},[1143,21239,21003],{"class":1904},[1143,21241,1930],{"class":1164},[1143,21243,21008],{"class":1307},[1143,21245,1485],{"class":1164},[1143,21247,21013],{"class":1307},[1143,21249,4853],{"class":1156},[1143,21251,21018],{"class":1307},[1143,21253,1349],{"class":1164},[1143,21255,21013],{"class":1307},[1143,21257,4859],{"class":1156},[1143,21259,21260],{"class":1307}," event_data",[1143,21262,1165],{"class":1164},[1143,21264,4491],{"class":1307},[1143,21266,5248],{"class":1164},[1143,21268,5736],{"class":1307},[1143,21270,21271,21273,21275,21277,21279,21281,21283,21285,21287,21289,21291,21293,21295,21297,21299,21301,21303,21305,21307,21309,21311],{"class":1145,"line":6906},[1143,21272,21044],{"class":1156},[1143,21274,21047],{"class":1307},[1143,21276,21050],{"class":1904},[1143,21278,5053],{"class":1904},[1143,21280,4847],{"class":1164},[1143,21282,1476],{"class":1475},[1143,21284,16316],{"class":1479},[1143,21286,1476],{"class":1475},[1143,21288,1349],{"class":1164},[1143,21290,1488],{"class":1475},[1143,21292,20383],{"class":1479},[1143,21294,1476],{"class":1475},[1143,21296,1349],{"class":1164},[1143,21298,1488],{"class":1475},[1143,21300,16344],{"class":1479},[1143,21302,1476],{"class":1475},[1143,21304,1349],{"class":1164},[1143,21306,1488],{"class":1475},[1143,21308,19015],{"class":1479},[1143,21310,1476],{"class":1475},[1143,21312,21087],{"class":1164},[1143,21314,21315],{"class":1145,"line":6916},[1143,21316,2304],{"class":1164},[1143,21318,21319],{"class":1145,"line":6923},[1143,21320,1229],{"emptyLinePlaceholder":1228},[1143,21322,21323,21325,21327,21329,21331,21333,21335],{"class":1145,"line":6964},[1143,21324,1236],{"class":1235},[1143,21326,20525],{"class":1239},[1143,21328,1243],{"class":1164},[1143,21330,3447],{"class":1246},[1143,21332,1165],{"class":1164},[1143,21334,3452],{"class":1246},[1143,21336,1250],{"class":1164},[1143,21338,21339,21341,21344],{"class":1145,"line":6982},[1143,21340,1257],{"class":1256},[1143,21342,21343],{"class":1260},"Database table for event store",[1143,21345,1264],{"class":1256},[1143,21347,21348],{"class":1145,"line":6995},[1143,21349,1270],{"class":1160},[1143,21351,21352,21354,21356,21358,21360,21362,21364,21366,21368,21370],{"class":1145,"line":7002},[1143,21353,16735],{"class":1160},[1143,21355,1389],{"class":1164},[1143,21357,3480],{"class":1160},[1143,21359,1165],{"class":1164},[1143,21361,8375],{"class":1307},[1143,21363,1243],{"class":1164},[1143,21365,15927],{"class":1499},[1143,21367,1389],{"class":1164},[1143,21369,3088],{"class":2500},[1143,21371,1409],{"class":1164},[1143,21373,21374,21377,21379,21381,21383,21385,21387,21389,21391,21394,21396,21398,21400,21402],{"class":1145,"line":7007},[1143,21375,21376],{"class":1160},"    event_id ",[1143,21378,1389],{"class":1164},[1143,21380,3480],{"class":1160},[1143,21382,1165],{"class":1164},[1143,21384,3485],{"class":1307},[1143,21386,1243],{"class":1164},[1143,21388,3490],{"class":1499},[1143,21390,1389],{"class":1164},[1143,21392,21393],{"class":1505},"36",[1143,21395,1349],{"class":1164},[1143,21397,3500],{"class":1499},[1143,21399,1389],{"class":1164},[1143,21401,3088],{"class":2500},[1143,21403,1409],{"class":1164},[1143,21405,21406,21408,21410,21412,21414,21416,21418,21420,21422,21424],{"class":1145,"line":7038},[1143,21407,16712],{"class":1160},[1143,21409,1389],{"class":1164},[1143,21411,3480],{"class":1160},[1143,21413,1165],{"class":1164},[1143,21415,3485],{"class":1307},[1143,21417,1243],{"class":1164},[1143,21419,3490],{"class":1499},[1143,21421,1389],{"class":1164},[1143,21423,15955],{"class":1505},[1143,21425,1409],{"class":1164},[1143,21427,21428,21430,21432,21434,21436,21438],{"class":1145,"line":7048},[1143,21429,16758],{"class":1160},[1143,21431,1389],{"class":1164},[1143,21433,3480],{"class":1160},[1143,21435,1165],{"class":1164},[1143,21437,16767],{"class":1307},[1143,21439,1311],{"class":1164},[1143,21441,21442,21445,21447,21449,21451,21453],{"class":1145,"line":7068},[1143,21443,21444],{"class":1160},"    version ",[1143,21446,1389],{"class":1164},[1143,21448,3480],{"class":1160},[1143,21450,1165],{"class":1164},[1143,21452,8375],{"class":1307},[1143,21454,1311],{"class":1164},[1143,21456,21457,21459,21461,21463,21465,21467,21469,21471,21473,21475],{"class":1145,"line":7079},[1143,21458,16774],{"class":1160},[1143,21460,1389],{"class":1164},[1143,21462,3480],{"class":1160},[1143,21464,1165],{"class":1164},[1143,21466,3667],{"class":1307},[1143,21468,1243],{"class":1164},[1143,21470,15927],{"class":1499},[1143,21472,1389],{"class":1164},[1143,21474,3088],{"class":2500},[1143,21476,1409],{"class":1164},[1143,21478,21479],{"class":1145,"line":7110},[1143,21480,1270],{"class":1160},[1143,21482,21483,21485,21487],{"class":1145,"line":7115},[1143,21484,4164],{"class":1235},[1143,21486,4167],{"class":1239},[1143,21488,1380],{"class":1164},[1143,21490,21491,21493,21495],{"class":1145,"line":7146},[1143,21492,4175],{"class":1160},[1143,21494,1389],{"class":1164},[1143,21496,4180],{"class":1164},[1143,21498,21499,21501,21503,21505,21507,21509,21511,21513,21515,21517,21519,21521,21523,21525],{"class":1145,"line":7151},[1143,21500,4186],{"class":1160},[1143,21502,1165],{"class":1164},[1143,21504,4191],{"class":1307},[1143,21506,1243],{"class":1164},[1143,21508,4196],{"class":1499},[1143,21510,4199],{"class":1164},[1143,21512,1476],{"class":1475},[1143,21514,16316],{"class":1479},[1143,21516,1476],{"class":1475},[1143,21518,1349],{"class":1164},[1143,21520,1488],{"class":1475},[1143,21522,19015],{"class":1479},[1143,21524,1476],{"class":1475},[1143,21526,4216],{"class":1164},[1143,21528,21529,21531,21533,21535,21537,21539,21541,21543,21545,21547,21549,21551,21553,21555],{"class":1145,"line":7175},[1143,21530,4186],{"class":1160},[1143,21532,1165],{"class":1164},[1143,21534,4191],{"class":1307},[1143,21536,1243],{"class":1164},[1143,21538,4196],{"class":1499},[1143,21540,4199],{"class":1164},[1143,21542,1476],{"class":1475},[1143,21544,16302],{"class":1479},[1143,21546,1476],{"class":1475},[1143,21548,1349],{"class":1164},[1143,21550,1488],{"class":1475},[1143,21552,16344],{"class":1479},[1143,21554,1476],{"class":1475},[1143,21556,4216],{"class":1164},[1143,21558,21559],{"class":1145,"line":7185},[1143,21560,4245],{"class":1164},[1143,21562,21563,21566,21568,21571,21573,21575,21577,21579,21581,21583,21585],{"class":1145,"line":7204},[1143,21564,21565],{"class":1160},"        unique_together ",[1143,21567,1389],{"class":1164},[1143,21569,21570],{"class":1164}," [[",[1143,21572,1476],{"class":1475},[1143,21574,16316],{"class":1479},[1143,21576,1476],{"class":1475},[1143,21578,1349],{"class":1164},[1143,21580,1488],{"class":1475},[1143,21582,19015],{"class":1479},[1143,21584,1476],{"class":1475},[1143,21586,21587],{"class":1164},"]]\n",[1143,21589,21590],{"class":1145,"line":7222},[1143,21591,1229],{"emptyLinePlaceholder":1228},[1143,21593,21594],{"class":1145,"line":7239},[1143,21595,21596],{"class":1149},"# Repository for Event-Sourced Aggregates\n",[1143,21598,21599,21601,21604],{"class":1145,"line":7256},[1143,21600,1236],{"class":1235},[1143,21602,21603],{"class":1239}," ProductAggregateRepository",[1143,21605,1380],{"class":1164},[1143,21607,21608,21610,21613],{"class":1145,"line":7273},[1143,21609,1257],{"class":1256},[1143,21611,21612],{"class":1260},"Repository for product aggregates using event sourcing",[1143,21614,1264],{"class":1256},[1143,21616,21617],{"class":1145,"line":7278},[1143,21618,1270],{"class":1160},[1143,21620,21621,21623,21625,21627,21629,21631,21633,21635,21637],{"class":1145,"line":7284},[1143,21622,1276],{"class":1235},[1143,21624,1280],{"class":1279},[1143,21626,1243],{"class":1164},[1143,21628,1286],{"class":1285},[1143,21630,1349],{"class":1164},[1143,21632,17482],{"class":1352},[1143,21634,1485],{"class":1164},[1143,21636,12944],{"class":1160},[1143,21638,1250],{"class":1164},[1143,21640,21641,21643,21645,21647,21649],{"class":1145,"line":7306},[1143,21642,1295],{"class":1294},[1143,21644,1165],{"class":1164},[1143,21646,12968],{"class":1300},[1143,21648,1304],{"class":1164},[1143,21650,12973],{"class":1160},[1143,21652,21653],{"class":1145,"line":7325},[1143,21654,1270],{"class":1160},[1143,21656,21657,21659,21661,21663,21665,21667,21669,21671,21673,21675,21677,21679,21681,21683],{"class":1145,"line":7341},[1143,21658,1276],{"class":1235},[1143,21660,2716],{"class":1341},[1143,21662,1243],{"class":1164},[1143,21664,1286],{"class":1285},[1143,21666,1349],{"class":1164},[1143,21668,1358],{"class":1352},[1143,21670,1485],{"class":1164},[1143,21672,1850],{"class":1849},[1143,21674,1853],{"class":1164},[1143,21676,1856],{"class":1164},[1143,21678,2653],{"class":1160},[1143,21680,2090],{"class":1164},[1143,21682,19117],{"class":1160},[1143,21684,2742],{"class":1164},[1143,21686,21687,21689,21692],{"class":1145,"line":7356},[1143,21688,1366],{"class":1256},[1143,21690,21691],{"class":1260},"Get product aggregate by ID",[1143,21693,1264],{"class":1256},[1143,21695,21696,21698,21700,21702,21704,21706,21708,21711,21713,21715],{"class":1145,"line":7369},[1143,21697,16539],{"class":1160},[1143,21699,1389],{"class":1164},[1143,21701,1392],{"class":1294},[1143,21703,1165],{"class":1164},[1143,21705,12968],{"class":1300},[1143,21707,1165],{"class":1164},[1143,21709,21710],{"class":1307},"get_events",[1143,21712,1243],{"class":1164},[1143,21714,1406],{"class":1307},[1143,21716,1409],{"class":1164},[1143,21718,21719],{"class":1145,"line":7375},[1143,21720,1946],{"class":1160},[1143,21722,21723,21725,21727,21729],{"class":1145,"line":7380},[1143,21724,1901],{"class":1156},[1143,21726,1905],{"class":1904},[1143,21728,19820],{"class":1160},[1143,21730,1380],{"class":1164},[1143,21732,21733,21735],{"class":1145,"line":7387},[1143,21734,1441],{"class":1156},[1143,21736,2821],{"class":2500},[1143,21738,21739],{"class":1145,"line":7392},[1143,21740,1946],{"class":1160},[1143,21742,21743,21745,21747,21749,21751,21753],{"class":1145,"line":7407},[1143,21744,19135],{"class":1160},[1143,21746,1389],{"class":1164},[1143,21748,18899],{"class":1307},[1143,21750,1243],{"class":1164},[1143,21752,1406],{"class":1307},[1143,21754,1409],{"class":1164},[1143,21756,21757,21759,21761,21764,21766,21769],{"class":1145,"line":7417},[1143,21758,19282],{"class":1160},[1143,21760,1165],{"class":1164},[1143,21762,21763],{"class":1307},"load_from_history",[1143,21765,1243],{"class":1164},[1143,21767,21768],{"class":1307},"events",[1143,21770,1409],{"class":1164},[1143,21772,21773],{"class":1145,"line":7422},[1143,21774,1946],{"class":1160},[1143,21776,21777,21779],{"class":1145,"line":7444},[1143,21778,1999],{"class":1156},[1143,21780,19322],{"class":1160},[1143,21782,21783],{"class":1145,"line":7459},[1143,21784,1270],{"class":1160},[1143,21786,21787,21789,21791,21793,21795,21797,21800,21802,21804,21806,21808,21810],{"class":1145,"line":7464},[1143,21788,1276],{"class":1235},[1143,21790,3286],{"class":1341},[1143,21792,1243],{"class":1164},[1143,21794,1286],{"class":1285},[1143,21796,1349],{"class":1164},[1143,21798,21799],{"class":1352}," aggregate",[1143,21801,1485],{"class":1164},[1143,21803,18899],{"class":1160},[1143,21805,1853],{"class":1164},[1143,21807,1856],{"class":1164},[1143,21809,3366],{"class":2500},[1143,21811,1380],{"class":1164},[1143,21813,21814,21816,21819],{"class":1145,"line":7499},[1143,21815,1366],{"class":1256},[1143,21817,21818],{"class":1260},"Save aggregate by storing uncommitted events",[1143,21820,1264],{"class":1256},[1143,21822,21823,21825,21827,21829,21831,21833],{"class":1145,"line":7509},[1143,21824,1901],{"class":1156},[1143,21826,1905],{"class":1904},[1143,21828,21799],{"class":1160},[1143,21830,1165],{"class":1164},[1143,21832,19029],{"class":1300},[1143,21834,1380],{"class":1164},[1143,21836,21837],{"class":1145,"line":7516},[1143,21838,21839],{"class":1156},"            return\n",[1143,21841,21842],{"class":1145,"line":7522},[1143,21843,1946],{"class":1160},[1143,21845,21846,21849,21851,21853,21855,21857,21859,21861,21863,21866,21868,21870],{"class":1145,"line":7531},[1143,21847,21848],{"class":1160},"        expected_version ",[1143,21850,1389],{"class":1164},[1143,21852,21799],{"class":1160},[1143,21854,1165],{"class":1164},[1143,21856,19015],{"class":1300},[1143,21858,4150],{"class":1904},[1143,21860,9655],{"class":1279},[1143,21862,1243],{"class":1164},[1143,21864,21865],{"class":1307},"aggregate",[1143,21867,1165],{"class":1164},[1143,21869,19029],{"class":1300},[1143,21871,1409],{"class":1164},[1143,21873,21874],{"class":1145,"line":7550},[1143,21875,1946],{"class":1160},[1143,21877,21878,21880,21882,21884,21886,21889],{"class":1145,"line":7555},[1143,21879,1295],{"class":1294},[1143,21881,1165],{"class":1164},[1143,21883,12968],{"class":1300},[1143,21885,1165],{"class":1164},[1143,21887,21888],{"class":1307},"save_events",[1143,21890,2224],{"class":1164},[1143,21892,21893,21896,21898,21900],{"class":1145,"line":7577},[1143,21894,21895],{"class":1307},"            aggregate",[1143,21897,1165],{"class":1164},[1143,21899,2150],{"class":1300},[1143,21901,5748],{"class":1164},[1143,21903,21904,21906,21908,21910],{"class":1145,"line":7605},[1143,21905,21895],{"class":1307},[1143,21907,1165],{"class":1164},[1143,21909,19029],{"class":1300},[1143,21911,5748],{"class":1164},[1143,21913,21914],{"class":1145,"line":7622},[1143,21915,21916],{"class":1307},"            expected_version\n",[1143,21918,21919],{"class":1145,"line":7635},[1143,21920,2304],{"class":1164},[1143,21922,21923],{"class":1145,"line":7660},[1143,21924,1946],{"class":1160},[1143,21926,21927,21929,21931,21934],{"class":1145,"line":7665},[1143,21928,19282],{"class":1160},[1143,21930,1165],{"class":1164},[1143,21932,21933],{"class":1307},"mark_events_as_committed",[1143,21935,1311],{"class":1164},[1143,21937,21938],{"class":1145,"line":7670},[1143,21939,1229],{"emptyLinePlaceholder":1228},[1143,21941,21942],{"class":1145,"line":7683},[1143,21943,21944],{"class":1149},"# Event Projections for Read Models\n",[1143,21946,21947,21949,21952],{"class":1145,"line":7697},[1143,21948,1236],{"class":1235},[1143,21950,21951],{"class":1239}," ProductProjection",[1143,21953,1380],{"class":1164},[1143,21955,21956,21958,21961],{"class":1145,"line":7725},[1143,21957,1257],{"class":1256},[1143,21959,21960],{"class":1260},"Projection that builds read models from events",[1143,21962,1264],{"class":1256},[1143,21964,21965],{"class":1145,"line":7732},[1143,21966,1270],{"class":1160},[1143,21968,21969,21971,21973,21975,21977],{"class":1145,"line":7737},[1143,21970,1276],{"class":1235},[1143,21972,1280],{"class":1279},[1143,21974,1243],{"class":1164},[1143,21976,1286],{"class":1285},[1143,21978,1250],{"class":1164},[1143,21980,21981,21983,21985,21987,21989],{"class":1145,"line":7752},[1143,21982,1295],{"class":1294},[1143,21984,1165],{"class":1164},[1143,21986,16928],{"class":1300},[1143,21988,1304],{"class":1164},[1143,21990,14518],{"class":1164},[1143,21992,21993,21996,21998,22000,22002,22005],{"class":1145,"line":7762},[1143,21994,21995],{"class":1160},"            ProductCreatedEvent",[1143,21997,1485],{"class":1164},[1143,21999,1392],{"class":1294},[1143,22001,1165],{"class":1164},[1143,22003,22004],{"class":1300},"_handle_product_created",[1143,22006,5748],{"class":1164},[1143,22008,22009,22012,22014,22016,22018,22021],{"class":1145,"line":7767},[1143,22010,22011],{"class":1160},"            ProductPriceChangedEvent",[1143,22013,1485],{"class":1164},[1143,22015,1392],{"class":1294},[1143,22017,1165],{"class":1164},[1143,22019,22020],{"class":1300},"_handle_price_changed",[1143,22022,5748],{"class":1164},[1143,22024,22025,22028,22030,22032,22034,22037],{"class":1145,"line":7785},[1143,22026,22027],{"class":1160},"            ProductDeactivatedEvent",[1143,22029,1485],{"class":1164},[1143,22031,1392],{"class":1294},[1143,22033,1165],{"class":1164},[1143,22035,22036],{"class":1300},"_handle_product_deactivated",[1143,22038,5748],{"class":1164},[1143,22040,22041],{"class":1145,"line":7800},[1143,22042,14634],{"class":1164},[1143,22044,22045],{"class":1145,"line":7805},[1143,22046,1270],{"class":1160},[1143,22048,22049,22051,22054,22056,22058,22060,22062,22064,22066],{"class":1145,"line":7836},[1143,22050,1276],{"class":1235},[1143,22052,22053],{"class":1341}," project_event",[1143,22055,1243],{"class":1164},[1143,22057,1286],{"class":1285},[1143,22059,1349],{"class":1164},[1143,22061,16390],{"class":1352},[1143,22063,1485],{"class":1164},[1143,22065,18657],{"class":1160},[1143,22067,1250],{"class":1164},[1143,22069,22070,22072,22075],{"class":1145,"line":7846},[1143,22071,1366],{"class":1256},[1143,22073,22074],{"class":1260},"Project event to read model",[1143,22076,1264],{"class":1256},[1143,22078,22079,22081,22083,22085,22087,22089,22091,22093,22095,22098,22100,22102],{"class":1145,"line":7867},[1143,22080,17053],{"class":1160},[1143,22082,1389],{"class":1164},[1143,22084,1392],{"class":1294},[1143,22086,1165],{"class":1164},[1143,22088,16928],{"class":1300},[1143,22090,1165],{"class":1164},[1143,22092,2145],{"class":1307},[1143,22094,1243],{"class":1164},[1143,22096,22097],{"class":1849},"type",[1143,22099,1243],{"class":1164},[1143,22101,13284],{"class":1307},[1143,22103,4785],{"class":1164},[1143,22105,22106,22108,22110],{"class":1145,"line":7872},[1143,22107,1901],{"class":1156},[1143,22109,16962],{"class":1160},[1143,22111,1380],{"class":1164},[1143,22113,22114,22117,22119,22121],{"class":1145,"line":7879},[1143,22115,22116],{"class":1307},"            handler",[1143,22118,1243],{"class":1164},[1143,22120,13284],{"class":1307},[1143,22122,1409],{"class":1164},[1143,22124,22125],{"class":1145,"line":7885},[1143,22126,1270],{"class":1160},[1143,22128,22129,22131,22134,22136,22138,22140,22142,22144,22146],{"class":1145,"line":7898},[1143,22130,1276],{"class":1235},[1143,22132,22133],{"class":1341}," _handle_product_created",[1143,22135,1243],{"class":1164},[1143,22137,1286],{"class":1285},[1143,22139,1349],{"class":1164},[1143,22141,16390],{"class":1352},[1143,22143,1485],{"class":1164},[1143,22145,13186],{"class":1160},[1143,22147,1250],{"class":1164},[1143,22149,22150,22152,22155],{"class":1145,"line":7937},[1143,22151,1366],{"class":1256},[1143,22153,22154],{"class":1260},"Handle product created event",[1143,22156,1264],{"class":1256},[1143,22158,22159,22162,22164,22166,22168,22170],{"class":1145,"line":7971},[1143,22160,22161],{"class":1160},"        ProductReadModel",[1143,22163,1165],{"class":1164},[1143,22165,2140],{"class":1300},[1143,22167,1165],{"class":1164},[1143,22169,6658],{"class":1307},[1143,22171,2224],{"class":1164},[1143,22173,22174,22176,22178,22180,22182,22184],{"class":1145,"line":7979},[1143,22175,13193],{"class":1499},[1143,22177,1389],{"class":1164},[1143,22179,13284],{"class":1307},[1143,22181,1165],{"class":1164},[1143,22183,16316],{"class":1300},[1143,22185,5748],{"class":1164},[1143,22187,22188,22190,22192,22194,22196,22198],{"class":1145,"line":7984},[1143,22189,2230],{"class":1499},[1143,22191,1389],{"class":1164},[1143,22193,13284],{"class":1307},[1143,22195,1165],{"class":1164},[1143,22197,2095],{"class":1300},[1143,22199,5748],{"class":1164},[1143,22201,22202,22204,22206,22208,22210,22212],{"class":1145,"line":7990},[1143,22203,2251],{"class":1499},[1143,22205,1389],{"class":1164},[1143,22207,13284],{"class":1307},[1143,22209,1165],{"class":1164},[1143,22211,2262],{"class":1300},[1143,22213,5748],{"class":1164},[1143,22215,22216,22218,22220,22222,22224,22226],{"class":1145,"line":8003},[1143,22217,2272],{"class":1499},[1143,22219,1389],{"class":1164},[1143,22221,13284],{"class":1307},[1143,22223,1165],{"class":1164},[1143,22225,2283],{"class":1300},[1143,22227,5748],{"class":1164},[1143,22229,22230,22232,22234,22236,22238,22240],{"class":1145,"line":8042},[1143,22231,13122],{"class":1499},[1143,22233,1389],{"class":1164},[1143,22235,13284],{"class":1307},[1143,22237,1165],{"class":1164},[1143,22239,2161],{"class":1300},[1143,22241,5748],{"class":1164},[1143,22243,22244,22246,22248,22250],{"class":1145,"line":8047},[1143,22245,15686],{"class":1499},[1143,22247,1389],{"class":1164},[1143,22249,3088],{"class":2500},[1143,22251,5748],{"class":1164},[1143,22253,22254,22256,22258,22260,22262],{"class":1145,"line":8060},[1143,22255,13252],{"class":1499},[1143,22257,1389],{"class":1164},[1143,22259,13284],{"class":1307},[1143,22261,1165],{"class":1164},[1143,22263,16485],{"class":1300},[1143,22265,22266],{"class":1145,"line":8067},[1143,22267,2304],{"class":1164},[1143,22269,22270],{"class":1145,"line":8072},[1143,22271,1270],{"class":1160},[1143,22273,22274,22276,22279,22281,22283,22285,22287,22289,22291],{"class":1145,"line":8085},[1143,22275,1276],{"class":1235},[1143,22277,22278],{"class":1341}," _handle_price_changed",[1143,22280,1243],{"class":1164},[1143,22282,1286],{"class":1285},[1143,22284,1349],{"class":1164},[1143,22286,16390],{"class":1352},[1143,22288,1485],{"class":1164},[1143,22290,18793],{"class":1160},[1143,22292,1250],{"class":1164},[1143,22294,22295,22297,22300],{"class":1145,"line":8111},[1143,22296,1366],{"class":1256},[1143,22298,22299],{"class":1260},"Handle price changed event",[1143,22301,1264],{"class":1256},[1143,22303,22304,22306,22308,22310,22312,22314],{"class":1145,"line":8118},[1143,22305,22161],{"class":1160},[1143,22307,1165],{"class":1164},[1143,22309,2140],{"class":1300},[1143,22311,1165],{"class":1164},[1143,22313,2982],{"class":1307},[1143,22315,2224],{"class":1164},[1143,22317,22318,22320,22322,22324,22326],{"class":1145,"line":8123},[1143,22319,13193],{"class":1499},[1143,22321,1389],{"class":1164},[1143,22323,13284],{"class":1307},[1143,22325,1165],{"class":1164},[1143,22327,16563],{"class":1300},[1143,22329,22330,22332,22335,22337,22339,22341,22343,22345,22347],{"class":1145,"line":8154},[1143,22331,7082],{"class":1164},[1143,22333,22334],{"class":1307},"update",[1143,22336,1243],{"class":1164},[1143,22338,2283],{"class":1499},[1143,22340,1389],{"class":1164},[1143,22342,13284],{"class":1307},[1143,22344,1165],{"class":1164},[1143,22346,13512],{"class":1300},[1143,22348,1409],{"class":1164},[1143,22350,22351],{"class":1145,"line":8164},[1143,22352,1270],{"class":1160},[1143,22354,22355,22357,22360,22362,22364,22366,22368,22370,22372],{"class":1145,"line":8183},[1143,22356,1276],{"class":1235},[1143,22358,22359],{"class":1341}," _handle_product_deactivated",[1143,22361,1243],{"class":1164},[1143,22363,1286],{"class":1285},[1143,22365,1349],{"class":1164},[1143,22367,16390],{"class":1352},[1143,22369,1485],{"class":1164},[1143,22371,18851],{"class":1160},[1143,22373,1250],{"class":1164},[1143,22375,22376,22378,22381],{"class":1145,"line":8188},[1143,22377,1366],{"class":1256},[1143,22379,22380],{"class":1260},"Handle product deactivated event",[1143,22382,1264],{"class":1256},[1143,22384,22385,22387,22389,22391,22393,22395],{"class":1145,"line":8195},[1143,22386,22161],{"class":1160},[1143,22388,1165],{"class":1164},[1143,22390,2140],{"class":1300},[1143,22392,1165],{"class":1164},[1143,22394,2982],{"class":1307},[1143,22396,2224],{"class":1164},[1143,22398,22399,22401,22403,22405,22407],{"class":1145,"line":8208},[1143,22400,13193],{"class":1499},[1143,22402,1389],{"class":1164},[1143,22404,13284],{"class":1307},[1143,22406,1165],{"class":1164},[1143,22408,16563],{"class":1300},[1143,22410,22411,22413,22415,22417,22419,22421,22423],{"class":1145,"line":8246},[1143,22412,7082],{"class":1164},[1143,22414,22334],{"class":1307},[1143,22416,1243],{"class":1164},[1143,22418,1966],{"class":1499},[1143,22420,1389],{"class":1164},[1143,22422,3650],{"class":2500},[1143,22424,1409],{"class":1164},[1143,22426,22427],{"class":1145,"line":8251},[1143,22428,1229],{"emptyLinePlaceholder":1228},[1143,22430,22431],{"class":1145,"line":8262},[1143,22432,22433],{"class":1149},"# Event Processing\n",[1143,22435,22436,22438,22441],{"class":1145,"line":8269},[1143,22437,1236],{"class":1235},[1143,22439,22440],{"class":1239}," EventProcessor",[1143,22442,1380],{"class":1164},[1143,22444,22445,22447,22450],{"class":1145,"line":8274},[1143,22446,1257],{"class":1256},[1143,22448,22449],{"class":1260},"Process events for projections and side effects",[1143,22451,1264],{"class":1256},[1143,22453,22454],{"class":1145,"line":8287},[1143,22455,1270],{"class":1160},[1143,22457,22458,22460,22462,22464,22466,22468,22470,22472,22474],{"class":1145,"line":8313},[1143,22459,1276],{"class":1235},[1143,22461,1280],{"class":1279},[1143,22463,1243],{"class":1164},[1143,22465,1286],{"class":1285},[1143,22467,1349],{"class":1164},[1143,22469,17482],{"class":1352},[1143,22471,1485],{"class":1164},[1143,22473,12944],{"class":1160},[1143,22475,1250],{"class":1164},[1143,22477,22478,22480,22482,22484,22486],{"class":1145,"line":8320},[1143,22479,1295],{"class":1294},[1143,22481,1165],{"class":1164},[1143,22483,12968],{"class":1300},[1143,22485,1304],{"class":1164},[1143,22487,12973],{"class":1160},[1143,22489,22490,22492,22494,22497,22499],{"class":1145,"line":8325},[1143,22491,1295],{"class":1294},[1143,22493,1165],{"class":1164},[1143,22495,22496],{"class":1300},"projections",[1143,22498,1304],{"class":1164},[1143,22500,4508],{"class":1164},[1143,22502,22503,22505,22507,22510,22512],{"class":1145,"line":8331},[1143,22504,1295],{"class":1294},[1143,22506,1165],{"class":1164},[1143,22508,22509],{"class":1300},"event_handlers",[1143,22511,1304],{"class":1164},[1143,22513,4508],{"class":1164},[1143,22515,22516],{"class":1145,"line":8348},[1143,22517,1270],{"class":1160},[1143,22519,22520,22522,22525,22527,22529,22531,22534],{"class":1145,"line":8358},[1143,22521,1276],{"class":1235},[1143,22523,22524],{"class":1341}," add_projection",[1143,22526,1243],{"class":1164},[1143,22528,1286],{"class":1285},[1143,22530,1349],{"class":1164},[1143,22532,22533],{"class":1352}," projection",[1143,22535,1250],{"class":1164},[1143,22537,22538,22540,22543],{"class":1145,"line":8363},[1143,22539,1366],{"class":1256},[1143,22541,22542],{"class":1260},"Add projection to process events",[1143,22544,1264],{"class":1256},[1143,22546,22547,22549,22551,22553,22555,22557,22559,22562],{"class":1145,"line":8380},[1143,22548,1295],{"class":1294},[1143,22550,1165],{"class":1164},[1143,22552,22496],{"class":1300},[1143,22554,1165],{"class":1164},[1143,22556,4766],{"class":1307},[1143,22558,1243],{"class":1164},[1143,22560,22561],{"class":1307},"projection",[1143,22563,1409],{"class":1164},[1143,22565,22566],{"class":1145,"line":8418},[1143,22567,1270],{"class":1160},[1143,22569,22570,22572,22575,22577,22579,22581,22583],{"class":1145,"line":8459},[1143,22571,1276],{"class":1235},[1143,22573,22574],{"class":1341}," add_event_handler",[1143,22576,1243],{"class":1164},[1143,22578,1286],{"class":1285},[1143,22580,1349],{"class":1164},[1143,22582,16962],{"class":1352},[1143,22584,1250],{"class":1164},[1143,22586,22587,22589,22592],{"class":1145,"line":8482},[1143,22588,1366],{"class":1256},[1143,22590,22591],{"class":1260},"Add event handler for side effects",[1143,22593,1264],{"class":1256},[1143,22595,22596,22598,22600,22602,22604,22606,22608,22611],{"class":1145,"line":8506},[1143,22597,1295],{"class":1294},[1143,22599,1165],{"class":1164},[1143,22601,22509],{"class":1300},[1143,22603,1165],{"class":1164},[1143,22605,4766],{"class":1307},[1143,22607,1243],{"class":1164},[1143,22609,22610],{"class":1307},"handler",[1143,22612,1409],{"class":1164},[1143,22614,22615],{"class":1145,"line":8511},[1143,22616,1270],{"class":1160},[1143,22618,22619,22621,22624,22626,22628,22630,22632,22634,22636,22638,22640,22642,22644,22646],{"class":1145,"line":8529},[1143,22620,1276],{"class":1235},[1143,22622,22623],{"class":1341}," process_new_events",[1143,22625,1243],{"class":1164},[1143,22627,1286],{"class":1285},[1143,22629,1349],{"class":1164},[1143,22631,20627],{"class":1352},[1143,22633,1485],{"class":1164},[1143,22635,2653],{"class":1160},[1143,22637,2090],{"class":1164},[1143,22639,20636],{"class":1160},[1143,22641,4503],{"class":1164},[1143,22643,1304],{"class":1164},[1143,22645,3366],{"class":2500},[1143,22647,1250],{"class":1164},[1143,22649,22650,22652,22655],{"class":1145,"line":8539},[1143,22651,1366],{"class":1256},[1143,22653,22654],{"class":1260},"Process new events",[1143,22656,1264],{"class":1256},[1143,22658,22659,22661,22663,22665,22667,22669,22671,22674,22676,22678],{"class":1145,"line":8544},[1143,22660,16539],{"class":1160},[1143,22662,1389],{"class":1164},[1143,22664,1392],{"class":1294},[1143,22666,1165],{"class":1164},[1143,22668,12968],{"class":1300},[1143,22670,1165],{"class":1164},[1143,22672,22673],{"class":1307},"get_all_events",[1143,22675,1243],{"class":1164},[1143,22677,20715],{"class":1307},[1143,22679,1409],{"class":1164},[1143,22681,22682],{"class":1145,"line":8590},[1143,22683,1946],{"class":1160},[1143,22685,22686,22688,22690,22692,22694],{"class":1145,"line":8606},[1143,22687,5919],{"class":1156},[1143,22689,19846],{"class":1160},[1143,22691,4859],{"class":1156},[1143,22693,19820],{"class":1160},[1143,22695,1380],{"class":1164},[1143,22697,22698],{"class":1145,"line":8622},[1143,22699,22700],{"class":1149},"            # Update projections\n",[1143,22702,22703,22705,22708,22710,22712,22714,22716],{"class":1145,"line":8653},[1143,22704,6762],{"class":1156},[1143,22706,22707],{"class":1160}," projection ",[1143,22709,4859],{"class":1156},[1143,22711,1392],{"class":1294},[1143,22713,1165],{"class":1164},[1143,22715,22496],{"class":1300},[1143,22717,1380],{"class":1164},[1143,22719,22720,22723,22725,22728,22730,22732],{"class":1145,"line":8658},[1143,22721,22722],{"class":1160},"                projection",[1143,22724,1165],{"class":1164},[1143,22726,22727],{"class":1307},"project_event",[1143,22729,1243],{"class":1164},[1143,22731,13284],{"class":1307},[1143,22733,1409],{"class":1164},[1143,22735,22736],{"class":1145,"line":8664},[1143,22737,6279],{"class":1160},[1143,22739,22740],{"class":1145,"line":8674},[1143,22741,22742],{"class":1149},"            # Handle side effects\n",[1143,22744,22745,22747,22750,22752,22754,22756,22758],{"class":1145,"line":8684},[1143,22746,6762],{"class":1156},[1143,22748,22749],{"class":1160}," handler ",[1143,22751,4859],{"class":1156},[1143,22753,1392],{"class":1294},[1143,22755,1165],{"class":1164},[1143,22757,22509],{"class":1300},[1143,22759,1380],{"class":1164},[1143,22761,22762,22765,22767,22769,22771,22773],{"class":1145,"line":8689},[1143,22763,22764],{"class":1160},"                handler",[1143,22766,1165],{"class":1164},[1143,22768,17123],{"class":1307},[1143,22770,1243],{"class":1164},[1143,22772,13284],{"class":1307},[1143,22774,1409],{"class":1164},[1143,22776,22777],{"class":1145,"line":8702},[1143,22778,1229],{"emptyLinePlaceholder":1228},[1143,22780,22781],{"class":1145,"line":8717},[1143,22782,22783],{"class":1149},"# Usage Example\n",[1143,22785,22786,22788,22791,22793,22795],{"class":1145,"line":8722},[1143,22787,8844],{"class":1235},[1143,22789,22790],{"class":1341}," create_product_with_event_sourcing",[1143,22792,1243],{"class":1164},[1143,22794,1571],{"class":1352},[1143,22796,1250],{"class":1164},[1143,22798,22799,22801,22804],{"class":1145,"line":8746},[1143,22800,1257],{"class":1256},[1143,22802,22803],{"class":1260},"Create product using event sourcing",[1143,22805,1264],{"class":1256},[1143,22807,22808,22810,22812,22814],{"class":1145,"line":8756},[1143,22809,17435],{"class":1160},[1143,22811,1389],{"class":1164},[1143,22813,12944],{"class":1307},[1143,22815,1311],{"class":1164},[1143,22817,22818,22821,22823,22825,22827,22829],{"class":1145,"line":8777},[1143,22819,22820],{"class":1160},"    repo ",[1143,22822,1389],{"class":1164},[1143,22824,21603],{"class":1307},[1143,22826,1243],{"class":1164},[1143,22828,12968],{"class":1307},[1143,22830,1409],{"class":1164},[1143,22832,22833],{"class":1145,"line":8782},[1143,22834,1270],{"class":1160},[1143,22836,22837],{"class":1145,"line":8799},[1143,22838,22839],{"class":1149},"    # Create aggregate\n",[1143,22841,22842,22844,22846,22849],{"class":1145,"line":8809},[1143,22843,8593],{"class":1160},[1143,22845,1389],{"class":1164},[1143,22847,22848],{"class":1307}," generate_product_id",[1143,22850,1311],{"class":1164},[1143,22852,22853,22856,22858,22860,22862,22864],{"class":1145,"line":8830},[1143,22854,22855],{"class":1160},"    aggregate ",[1143,22857,1389],{"class":1164},[1143,22859,18899],{"class":1160},[1143,22861,1165],{"class":1164},[1143,22863,6658],{"class":1307},[1143,22865,2224],{"class":1164},[1143,22867,22868,22871,22873,22875],{"class":1145,"line":8835},[1143,22869,22870],{"class":1499},"        product_id",[1143,22872,1389],{"class":1164},[1143,22874,1406],{"class":1307},[1143,22876,5748],{"class":1164},[1143,22878,22879,22881,22883,22885,22887,22889,22891,22893,22895,22897],{"class":1145,"line":8841},[1143,22880,17738],{"class":1499},[1143,22882,1389],{"class":1164},[1143,22884,1571],{"class":1307},[1143,22886,1165],{"class":1164},[1143,22888,1449],{"class":1300},[1143,22890,2090],{"class":1164},[1143,22892,1476],{"class":1475},[1143,22894,2095],{"class":1479},[1143,22896,1476],{"class":1475},[1143,22898,2245],{"class":1164},[1143,22900,22901,22903,22905,22907,22909,22911,22913,22915,22917,22919],{"class":1145,"line":8852},[1143,22902,17762],{"class":1499},[1143,22904,1389],{"class":1164},[1143,22906,1571],{"class":1307},[1143,22908,1165],{"class":1164},[1143,22910,1449],{"class":1300},[1143,22912,2090],{"class":1164},[1143,22914,1476],{"class":1475},[1143,22916,2262],{"class":1479},[1143,22918,1476],{"class":1475},[1143,22920,2245],{"class":1164},[1143,22922,22923,22925,22927,22929,22931,22933,22935,22937,22939,22941,22943,22945],{"class":1145,"line":8862},[1143,22924,17786],{"class":1499},[1143,22926,1389],{"class":1164},[1143,22928,3841],{"class":1307},[1143,22930,1243],{"class":1164},[1143,22932,1571],{"class":1307},[1143,22934,1165],{"class":1164},[1143,22936,1449],{"class":1300},[1143,22938,2090],{"class":1164},[1143,22940,1476],{"class":1475},[1143,22942,2283],{"class":1479},[1143,22944,1476],{"class":1475},[1143,22946,4216],{"class":1164},[1143,22948,22949,22951,22953,22955,22957,22959,22961,22963,22965,22967],{"class":1145,"line":8874},[1143,22950,17814],{"class":1499},[1143,22952,1389],{"class":1164},[1143,22954,1571],{"class":1307},[1143,22956,1165],{"class":1164},[1143,22958,1449],{"class":1300},[1143,22960,2090],{"class":1164},[1143,22962,1476],{"class":1475},[1143,22964,2161],{"class":1479},[1143,22966,1476],{"class":1475},[1143,22968,2245],{"class":1164},[1143,22970,22971,22974,22976,22978,22980,22982,22984],{"class":1145,"line":8879},[1143,22972,22973],{"class":1499},"        created_by",[1143,22975,1389],{"class":1164},[1143,22977,1571],{"class":1307},[1143,22979,1165],{"class":1164},[1143,22981,9167],{"class":1300},[1143,22983,1165],{"class":1164},[1143,22985,6727],{"class":1300},[1143,22987,22988],{"class":1145,"line":8885},[1143,22989,9142],{"class":1164},[1143,22991,22992],{"class":1145,"line":8907},[1143,22993,1270],{"class":1160},[1143,22995,22996],{"class":1145,"line":8936},[1143,22997,22998],{"class":1149},"    # Save aggregate (stores events)\n",[1143,23000,23001,23004,23006,23008,23010,23012],{"class":1145,"line":8960},[1143,23002,23003],{"class":1160},"    repo",[1143,23005,1165],{"class":1164},[1143,23007,2361],{"class":1307},[1143,23009,1243],{"class":1164},[1143,23011,21865],{"class":1307},[1143,23013,1409],{"class":1164},[1143,23015,23016],{"class":1145,"line":8981},[1143,23017,1270],{"class":1160},[1143,23019,23020],{"class":1145,"line":8986},[1143,23021,23022],{"class":1149},"    # Process events for projections\n",[1143,23024,23025,23028,23030,23032,23034,23036],{"class":1145,"line":8995},[1143,23026,23027],{"class":1160},"    processor ",[1143,23029,1389],{"class":1164},[1143,23031,22440],{"class":1307},[1143,23033,1243],{"class":1164},[1143,23035,12968],{"class":1307},[1143,23037,1409],{"class":1164},[1143,23039,23040,23043,23045,23048,23050,23053],{"class":1145,"line":9000},[1143,23041,23042],{"class":1160},"    processor",[1143,23044,1165],{"class":1164},[1143,23046,23047],{"class":1307},"add_projection",[1143,23049,1243],{"class":1164},[1143,23051,23052],{"class":1307},"ProductProjection",[1143,23054,8904],{"class":1164},[1143,23056,23057,23059,23061,23064],{"class":1145,"line":9006},[1143,23058,23042],{"class":1160},[1143,23060,1165],{"class":1164},[1143,23062,23063],{"class":1307},"process_new_events",[1143,23065,1311],{"class":1164},[1143,23067,23068],{"class":1145,"line":9020},[1143,23069,1270],{"class":1160},[1143,23071,23072,23074,23076,23078,23080,23082,23084,23086,23088,23090,23092,23094,23096],{"class":1145,"line":9030},[1143,23073,8989],{"class":1156},[1143,23075,1444],{"class":1307},[1143,23077,1472],{"class":1164},[1143,23079,1476],{"class":1475},[1143,23081,1406],{"class":1479},[1143,23083,1476],{"class":1475},[1143,23085,1485],{"class":1164},[1143,23087,1358],{"class":1307},[1143,23089,1496],{"class":1164},[1143,23091,1500],{"class":1499},[1143,23093,1389],{"class":1164},[1143,23095,1647],{"class":1505},[1143,23097,1409],{"class":1164},[1030,23099,23101],{"id":23100},"architecture-pattern-selection-guide","Architecture Pattern Selection Guide",[1038,23103,23105],{"id":23104},"when-to-use-each-pattern","When to Use Each Pattern",[1026,23107,23108],{},[1045,23109,23110],{},"Layered Architecture",[1049,23112,23113,23116,23119,23122],{},[1052,23114,23115],{},"Traditional web applications",[1052,23117,23118],{},"Clear separation of concerns needed",[1052,23120,23121],{},"Team familiar with MVC patterns",[1052,23123,23124],{},"Moderate complexity applications",[1026,23126,23127],{},[1045,23128,23129],{},"Hexagonal Architecture",[1049,23131,23132,23135,23138,23141],{},[1052,23133,23134],{},"Multiple external integrations",[1052,23136,23137],{},"Need for high testability",[1052,23139,23140],{},"Complex business logic",[1052,23142,23143],{},"Long-term maintainability critical",[1026,23145,23146],{},[1045,23147,9323],{},[1049,23149,23150,23153,23156,23159],{},[1052,23151,23152],{},"Enterprise applications",[1052,23154,23155],{},"Complex business rules",[1052,23157,23158],{},"Multiple delivery mechanisms",[1052,23160,23161],{},"Framework independence required",[1026,23163,23164],{},[1045,23165,23166],{},"CQRS",[1049,23168,23169,23172,23175,23178],{},[1052,23170,23171],{},"Different read/write performance requirements",[1052,23173,23174],{},"Complex reporting needs",[1052,23176,23177],{},"High-scale applications",[1052,23179,23180],{},"Event-driven architectures",[1026,23182,23183],{},[1045,23184,18577],{},[1049,23186,23187,23190,23193,23196],{},[1052,23188,23189],{},"Complete audit trail required",[1052,23191,23192],{},"Time-travel functionality needed",[1052,23194,23195],{},"Complex business processes",[1052,23197,23198],{},"High-reliability systems",[1038,23200,23202],{"id":23201},"combining-patterns","Combining Patterns",[1133,23204,23206],{"className":1135,"code":23205,"language":1137,"meta":1138,"style":1138},"# Example: CQRS + Event Sourcing + Clean Architecture\nclass OrderApplicationService:\n    \"\"\"Application service combining multiple patterns\"\"\"\n    \n    def __init__(self, \n                 command_bus: CommandBus,\n                 query_bus: QueryBus,\n                 event_store: EventStore):\n        self.command_bus = command_bus\n        self.query_bus = query_bus\n        self.event_store = event_store\n    \n    def place_order(self, command: PlaceOrderCommand) -> OrderId:\n        \"\"\"Place order using CQRS and event sourcing\"\"\"\n        # Use command bus for write operations\n        order_id = self.command_bus.dispatch(command)\n        \n        # Events are automatically stored in event store\n        # Projections are updated asynchronously\n        \n        return order_id\n    \n    def get_order_details(self, order_id: int) -> OrderDetails:\n        \"\"\"Get order details using CQRS query side\"\"\"\n        query = GetOrderDetailsQuery(order_id=order_id)\n        return self.query_bus.dispatch(query)\n    \n    def get_order_history(self, order_id: int) -> List[OrderEvent]:\n        \"\"\"Get complete order history from event store\"\"\"\n        return self.event_store.get_events(order_id)\n",[1140,23207,23208,23213,23222,23231,23235,23249,23260,23271,23281,23295,23308,23320,23324,23352,23361,23366,23389,23393,23398,23403,23407,23414,23418,23446,23455,23475,23495,23499,23531,23540],{"__ignoreMap":1138},[1143,23209,23210],{"class":1145,"line":1146},[1143,23211,23212],{"class":1149},"# Example: CQRS + Event Sourcing + Clean Architecture\n",[1143,23214,23215,23217,23220],{"class":1145,"line":1153},[1143,23216,1236],{"class":1235},[1143,23218,23219],{"class":1239}," OrderApplicationService",[1143,23221,1380],{"class":1164},[1143,23223,23224,23226,23229],{"class":1145,"line":1177},[1143,23225,1257],{"class":1256},[1143,23227,23228],{"class":1260},"Application service combining multiple patterns",[1143,23230,1264],{"class":1256},[1143,23232,23233],{"class":1145,"line":1194},[1143,23234,1270],{"class":1160},[1143,23236,23237,23239,23241,23243,23245,23247],{"class":1145,"line":1210},[1143,23238,1276],{"class":1235},[1143,23240,1280],{"class":1279},[1143,23242,1243],{"class":1164},[1143,23244,1286],{"class":1285},[1143,23246,1349],{"class":1164},[1143,23248,5736],{"class":1160},[1143,23250,23251,23254,23256,23258],{"class":1145,"line":1225},[1143,23252,23253],{"class":1352},"                 command_bus",[1143,23255,1485],{"class":1164},[1143,23257,16892],{"class":1160},[1143,23259,5748],{"class":1164},[1143,23261,23262,23265,23267,23269],{"class":1145,"line":1232},[1143,23263,23264],{"class":1352},"                 query_bus",[1143,23266,1485],{"class":1164},[1143,23268,17140],{"class":1160},[1143,23270,5748],{"class":1164},[1143,23272,23273,23275,23277,23279],{"class":1145,"line":1253},[1143,23274,12939],{"class":1352},[1143,23276,1485],{"class":1164},[1143,23278,12944],{"class":1160},[1143,23280,1250],{"class":1164},[1143,23282,23283,23285,23287,23290,23292],{"class":1145,"line":1267},[1143,23284,1295],{"class":1294},[1143,23286,1165],{"class":1164},[1143,23288,23289],{"class":1300},"command_bus",[1143,23291,1304],{"class":1164},[1143,23293,23294],{"class":1160}," command_bus\n",[1143,23296,23297,23299,23301,23304,23306],{"class":1145,"line":1273},[1143,23298,1295],{"class":1294},[1143,23300,1165],{"class":1164},[1143,23302,23303],{"class":1300},"query_bus",[1143,23305,1304],{"class":1164},[1143,23307,17665],{"class":1160},[1143,23309,23310,23312,23314,23316,23318],{"class":1145,"line":1291},[1143,23311,1295],{"class":1294},[1143,23313,1165],{"class":1164},[1143,23315,12968],{"class":1300},[1143,23317,1304],{"class":1164},[1143,23319,12973],{"class":1160},[1143,23321,23322],{"class":1145,"line":1314},[1143,23323,1270],{"class":1160},[1143,23325,23326,23328,23330,23332,23334,23336,23338,23340,23343,23345,23347,23350],{"class":1145,"line":1331},[1143,23327,1276],{"class":1235},[1143,23329,6044],{"class":1341},[1143,23331,1243],{"class":1164},[1143,23333,1286],{"class":1285},[1143,23335,1349],{"class":1164},[1143,23337,12867],{"class":1352},[1143,23339,1485],{"class":1164},[1143,23341,23342],{"class":1160}," PlaceOrderCommand",[1143,23344,1853],{"class":1164},[1143,23346,1856],{"class":1164},[1143,23348,23349],{"class":1160}," OrderId",[1143,23351,1380],{"class":1164},[1143,23353,23354,23356,23359],{"class":1145,"line":1336},[1143,23355,1366],{"class":1256},[1143,23357,23358],{"class":1260},"Place order using CQRS and event sourcing",[1143,23360,1264],{"class":1256},[1143,23362,23363],{"class":1145,"line":1363},[1143,23364,23365],{"class":1149},"        # Use command bus for write operations\n",[1143,23367,23368,23371,23373,23375,23377,23379,23381,23383,23385,23387],{"class":1145,"line":1374},[1143,23369,23370],{"class":1160},"        order_id ",[1143,23372,1389],{"class":1164},[1143,23374,1392],{"class":1294},[1143,23376,1165],{"class":1164},[1143,23378,23289],{"class":1300},[1143,23380,1165],{"class":1164},[1143,23382,17883],{"class":1307},[1143,23384,1243],{"class":1164},[1143,23386,13035],{"class":1307},[1143,23388,1409],{"class":1164},[1143,23390,23391],{"class":1145,"line":1383},[1143,23392,1946],{"class":1160},[1143,23394,23395],{"class":1145,"line":1412},[1143,23396,23397],{"class":1149},"        # Events are automatically stored in event store\n",[1143,23399,23400],{"class":1145,"line":1438},[1143,23401,23402],{"class":1149},"        # Projections are updated asynchronously\n",[1143,23404,23405],{"class":1145,"line":1454},[1143,23406,1946],{"class":1160},[1143,23408,23409,23411],{"class":1145,"line":1465},[1143,23410,1999],{"class":1156},[1143,23412,23413],{"class":1160}," order_id\n",[1143,23415,23416],{"class":1145,"line":1511},[1143,23417,1270],{"class":1160},[1143,23419,23420,23422,23425,23427,23429,23431,23433,23435,23437,23439,23441,23444],{"class":1145,"line":1516},[1143,23421,1276],{"class":1235},[1143,23423,23424],{"class":1341}," get_order_details",[1143,23426,1243],{"class":1164},[1143,23428,1286],{"class":1285},[1143,23430,1349],{"class":1164},[1143,23432,5363],{"class":1352},[1143,23434,1485],{"class":1164},[1143,23436,1850],{"class":1849},[1143,23438,1853],{"class":1164},[1143,23440,1856],{"class":1164},[1143,23442,23443],{"class":1160}," OrderDetails",[1143,23445,1380],{"class":1164},[1143,23447,23448,23450,23453],{"class":1145,"line":1534},[1143,23449,1366],{"class":1256},[1143,23451,23452],{"class":1260},"Get order details using CQRS query side",[1143,23454,1264],{"class":1256},[1143,23456,23457,23460,23462,23465,23467,23469,23471,23473],{"class":1145,"line":1544},[1143,23458,23459],{"class":1160},"        query ",[1143,23461,1389],{"class":1164},[1143,23463,23464],{"class":1307}," GetOrderDetailsQuery",[1143,23466,1243],{"class":1164},[1143,23468,6102],{"class":1499},[1143,23470,1389],{"class":1164},[1143,23472,6102],{"class":1307},[1143,23474,1409],{"class":1164},[1143,23476,23477,23479,23481,23483,23485,23487,23489,23491,23493],{"class":1145,"line":1551},[1143,23478,1999],{"class":1156},[1143,23480,1392],{"class":1294},[1143,23482,1165],{"class":1164},[1143,23484,23303],{"class":1300},[1143,23486,1165],{"class":1164},[1143,23488,17883],{"class":1307},[1143,23490,1243],{"class":1164},[1143,23492,3219],{"class":1307},[1143,23494,1409],{"class":1164},[1143,23496,23497],{"class":1145,"line":1581},[1143,23498,1270],{"class":1160},[1143,23500,23501,23503,23506,23508,23510,23512,23514,23516,23518,23520,23522,23524,23526,23529],{"class":1145,"line":1605},[1143,23502,1276],{"class":1235},[1143,23504,23505],{"class":1341}," get_order_history",[1143,23507,1243],{"class":1164},[1143,23509,1286],{"class":1285},[1143,23511,1349],{"class":1164},[1143,23513,5363],{"class":1352},[1143,23515,1485],{"class":1164},[1143,23517,1850],{"class":1849},[1143,23519,1853],{"class":1164},[1143,23521,1856],{"class":1164},[1143,23523,3030],{"class":1160},[1143,23525,2090],{"class":1164},[1143,23527,23528],{"class":1160},"OrderEvent",[1143,23530,2742],{"class":1164},[1143,23532,23533,23535,23538],{"class":1145,"line":1629},[1143,23534,1366],{"class":1256},[1143,23536,23537],{"class":1260},"Get complete order history from event store",[1143,23539,1264],{"class":1256},[1143,23541,23542,23544,23546,23548,23550,23552,23554,23556,23558],{"class":1145,"line":1652},[1143,23543,1999],{"class":1156},[1143,23545,1392],{"class":1294},[1143,23547,1165],{"class":1164},[1143,23549,12968],{"class":1300},[1143,23551,1165],{"class":1164},[1143,23553,21710],{"class":1307},[1143,23555,1243],{"class":1164},[1143,23557,6102],{"class":1307},[1143,23559,1409],{"class":1164},[1026,23561,23562],{},"System architecture patterns provide the foundation for building maintainable, scalable Django applications. Choose patterns based on your specific requirements, team expertise, and long-term goals. Start with simpler patterns like layered architecture and evolve to more sophisticated patterns as your application grows in complexity.",[1026,23564,23565],{},"The key is understanding that these patterns are tools to solve specific problems. Use them judiciously, and don't over-engineer solutions for simple problems. The best architecture is the one that solves your current problems while providing a clear path for future evolution.",[23567,23568,23569],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1138,"searchDepth":1146,"depth":1153,"links":23571},[23572,23575,23578,23581,23584,23587,23590],{"id":1032,"depth":1153,"text":1033,"children":23573},[23574],{"id":1040,"depth":1177,"text":1041},{"id":1123,"depth":1153,"text":1124,"children":23576},[23577],{"id":1130,"depth":1177,"text":1131},{"id":4248,"depth":1153,"text":4249,"children":23579},[23580],{"id":4255,"depth":1177,"text":4256},{"id":9322,"depth":1153,"text":9323,"children":23582},[23583],{"id":9329,"depth":1177,"text":9330},{"id":12579,"depth":1153,"text":12580,"children":23585},[23586],{"id":12586,"depth":1177,"text":12587},{"id":18576,"depth":1153,"text":18577,"children":23588},[23589],{"id":18583,"depth":1177,"text":18584},{"id":23100,"depth":1153,"text":23101,"children":23591},[23592,23593],{"id":23104,"depth":1177,"text":23105},{"id":23201,"depth":1177,"text":23202},"md",null,{},{"title":807,"description":1028},"RV_GkR6zEcgLFsOyhjwU6sFYtH6ojtdcizMAuXyDG0M",[23600,23602],{"title":801,"path":802,"stem":803,"description":23601,"children":-1},"This comprehensive guide explores advanced Django concepts and expert-level techniques for building enterprise-scale applications. These topics represent the pinnacle of Django development, covering system architecture patterns, domain-driven design, large-scale project organization, and advanced customization techniques that separate expert developers from intermediate practitioners.",{"title":811,"path":812,"stem":813,"description":23603,"children":-1},"Domain Driven Design (DDD) is a software development approach that focuses on creating a rich model of the business domain. When applied to Django applications, DDD helps create maintainable, expressive code that closely reflects business requirements and enables effective communication between developers and domain experts.",1772474957450]