diff --git a/.claude/settings.json b/.claude/settings.json index 7a855d5c..a567af96 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -9,6 +9,16 @@ "command": "filepath=\"$TOOL_INPUT_FILE_PATH\"; if echo \"$filepath\" | grep -qE '(\\.env|\\.github/workflows/|settings\\.local\\.json)$'; then echo 'BLOCK: Protected file - confirm with user first' >&2; exit 2; fi" } ] + }, + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "bash \"$CLAUDE_PROJECT_DIR/scripts/check-changelog-before-pr.sh\"", + "if": "Bash(gh pr create:*)" + } + ] } ], "PostToolUse": [ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1fd89186..ec39b2ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,7 +70,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v7 with: fetch-depth: 0 @@ -86,7 +86,7 @@ jobs: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Cache SonarQube Cloud packages - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar @@ -237,7 +237,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v7 with: fetch-depth: 0 @@ -247,7 +247,7 @@ jobs: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Cache NuGet packages - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props') }} @@ -276,7 +276,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v7 with: fetch-depth: 0 diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 38aa739d..d4e6ed04 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Setup .NET 10 uses: actions/setup-dotnet@v5 @@ -34,7 +34,7 @@ jobs: bun-version: latest - name: Cache NuGet packages - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props') }} diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 5e3670b2..189276dd 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -49,7 +49,7 @@ jobs: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v7 with: fetch-depth: 0 diff --git a/.github/workflows/publish-libs.yml b/.github/workflows/publish-libs.yml index de588e18..f9358993 100644 --- a/.github/workflows/publish-libs.yml +++ b/.github/workflows/publish-libs.yml @@ -59,7 +59,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v7 with: fetch-depth: 0 # Fetching all history for version calculation and release notes (prev vs now) diff --git a/.github/workflows/publish-template.yml b/.github/workflows/publish-template.yml index cb2dd866..80df9946 100644 --- a/.github/workflows/publish-template.yml +++ b/.github/workflows/publish-template.yml @@ -50,7 +50,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v7 with: fetch-depth: 0 diff --git a/.github/workflows/validate-scripts.yml b/.github/workflows/validate-scripts.yml index 3c520429..09d5efba 100644 --- a/.github/workflows/validate-scripts.yml +++ b/.github/workflows/validate-scripts.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Install PowerShell Script Analyzer shell: pwsh diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..c8815f9a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog + +All notable changes to this project are documented in this file, grouped by date. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). + +## [2026-07-15] + +### Added + +- **EventMarkdownGenerator**: `Topic` and `FullyQualifiedTopicName` are now exposed separately on `EventMetadata` + and `EventViewModel`. `Topic` is the plain topic / event hub name; `FullyQualifiedTopicName` is the composed + `{env}.{domain}.{visibility}.{topic}.{version}` convention string. +- **EventMarkdownGenerator**: `--partition-key-attribute` option to discover partition keys by attribute name + (or name prefix), mirroring `--event-attribute`. Partition key discovery and its `Order` are now resolved + generically via reflection instead of a hardcoded `PartitionKeyAttribute` type. +- **EventMarkdownGenerator**: event attributes may expose an optional `EventName` property to override the + documented event name (falls back to the CLR type name when absent). + +### Changed + +- **EventMarkdownGenerator**: `EventMetadata.TopicName` / `EventViewModel.TopicName` replaced by + `FullyQualifiedTopicName`. The default `event.liquid` template now renders both `Topic` and + `Fully Qualified Topic`. +- **EventMarkdownGenerator**: multi-line XML doc property descriptions are flattened to a single line + (whitespace collapsed) so they no longer break the generated markdown payload table. + +### Fixed + +- **EventMarkdownGenerator**: property descriptions whose XML doc summary wrapped onto multiple lines + previously spilled out of their table cell as an orphaned line. diff --git a/CLAUDE.md b/CLAUDE.md index 74e6b995..8ec9d56c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,10 +7,22 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co **Momentum .NET** is a comprehensive template system that generates production-ready microservices solutions using .NET 10. The repository contains both the template engine (`mmt`) and supporting library ecosystem. **Key Components**: + - **Template System** (`dotnet new mmt`): Generates complete microservices solutions - **Momentum Libraries**: Reusable .NET libraries for service defaults, extensions, and patterns - **Sample Application** (AppDomain): Complete microservices example demonstrating patterns +## Changelog & Pull Requests + +**Every PR must update `CHANGELOG.md` before it is created.** Add a `## [YYYY-MM-DD]` section (today's +date; reuse it if a section for today already exists) using the [Keep a Changelog](https://keepachangelog.com/) +categories (`Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security`). Do this as the last step +before opening the PR. + +A `PreToolUse` hook (`scripts/check-changelog-before-pr.sh`, wired in `.claude/settings.json`) blocks +`gh pr create` when `CHANGELOG.md` has not been touched on the current branch. If it blocks you, add a +changelog entry and retry. + ## Development Commands ### Template Development and Testing @@ -91,6 +103,7 @@ cd docs && bun install && bun run dev ``` **Aspire Database Setup**: + - PostgreSQL with persistent storage - Automatic Liquibase migrations on startup - PgAdmin for database management @@ -98,6 +111,7 @@ cd docs && bun install && bun run dev - Services wait for database and migrations before starting **Database Connection**: + - Services automatically get connection strings from Aspire - Health checks validate connectivity and schema integrity - LinqToDB configured with snake_case naming conventions @@ -139,6 +153,7 @@ dotnet test libs/Momentum/tests/Momentum.Extensions.SourceGenerators.Tests The template (`mmt`) generates microservices solutions with: **Generated Project Structure**: + ``` YourService/ ├── src/ @@ -157,6 +172,7 @@ YourService/ ``` **Template Configuration**: + - Components: `--api`, `--backoffice`, `--orleans`, `--aspire`, `--docs`, `--bff` - Infrastructure: `--db-config [default|none|npgsql|liquibase]`, `--kafka` - Customization: `--org "Company"`, `--port 8100`, `--no-sample` @@ -188,6 +204,7 @@ YourService/ ### Technology Stack Integration **Core Technologies**: + - **.NET 10** with **Aspire**: Orchestration and observability - **Wolverine**: CQRS message handling with PostgreSQL persistence - **Orleans**: Stateful actor processing (optional) @@ -196,6 +213,7 @@ YourService/ - **OpenTelemetry**: Distributed tracing and metrics **Port Allocation** (base port configurable, default 8100): + - Aspire Dashboard: 18110 (HTTPS), 18100 (HTTP) - API: 8111 (HTTPS), 8101 (HTTP), 8102 (gRPC) - BackOffice: 8113 (HTTPS), 8103 (HTTP) @@ -219,19 +237,22 @@ YourService/ The `--local` flag enables template testing with locally built Momentum libraries: **What it does**: + - Copies `local-mmt-version.txt` and `local-feed-path.txt` to the generated project - The post-setup tool reads these files and: - - Hardcodes the local version into `Directory.Packages.props` (`MomentumVersion`) - - Creates a `nuget.config` with the local NuGet feed source - - Cleans up the text files + - Hardcodes the local version into `Directory.Packages.props` (`MomentumVersion`) + - Creates a `nuget.config` with the local NuGet feed source + - Cleans up the text files - Automatically used by `Run-TemplateTests.ps1` for template testing **How the lib build generates local packages**: + - `libs/Momentum/Directory.Build.targets` generates version `1000.0.0-pre.{timestamp}` - Packs all libraries to `libs/Momentum/.local/nuget/` - Writes `local-mmt-version.txt` and `local-feed-path.txt` to the repo root **Usage**: + ```bash # Build and pack libraries first dotnet build libs/Momentum/Momentum.slnx @@ -330,6 +351,7 @@ await messageBus.PublishAsync(new CustomerCreated(customer.Id, customer.Name)); ### MSBuild Properties Global configuration in `Directory.Build.props`: + - **Target Framework**: .NET 10.0 - **Nullable Reference Types**: Enabled - **Analyzers**: .NET analyzers + SonarAnalyzer enabled @@ -351,23 +373,27 @@ Template uses sophisticated conditional compilation: ### Template vs Library Development The repository serves dual purposes: + - **Template development**: Testing and building the `mmt` template - **Library development**: Standalone Momentum libraries in `libs/Momentum/` ### Database Migrations Uses Liquibase for version-controlled schema management: + - Setup scripts in `infra/YourService.Database/Liquibase/` - Automatic migration via Docker Compose - Separate service_bus and application schemas **IMPORTANT - Database Organization Rules**: + - **Table Definitions**: Each table should be in its own file under `tables/` directory - **Constraints & Indexes**: Should be defined WITHIN the same file as the table they apply to - **Avoid Separate Constraint Files**: Do NOT create separate `constraints_and_indexes.sql` files - **Logical Grouping**: Keep related constraints, indexes, triggers, and functions with their tables **Correct Structure**: + ``` infra/YourService.Database/Liquibase/main/ ├── main.sql # Schema creation @@ -384,6 +410,7 @@ infra/YourService.Database/Liquibase/main/ ``` **Example Table File Structure**: + ```sql -- Table creation CREATE TABLE main.invoices (...); @@ -410,59 +437,66 @@ CREATE TRIGGER tr_invoice_version BEFORE UPDATE ON main.invoices ...; **Common Problems and Solutions**: 1. **Health Checks Failing**: - ```bash - # Check if database is running - curl http://localhost:8101/status - # Check Aspire dashboard for service status - open https://localhost:18110 - ``` + ```bash + # Check if database is running + curl http://localhost:8101/status + + # Check Aspire dashboard for service status + open https://localhost:18110 + ``` 2. **Migration Issues**: - ```bash - # Check Liquibase logs in Aspire dashboard - # Verify changelog.xml includes all table files - # Ensure changesets have unique IDs - ``` + + ```bash + # Check Liquibase logs in Aspire dashboard + # Verify changelog.xml includes all table files + # Ensure changesets have unique IDs + ``` 3. **Missing Constraints/Indexes**: - ```sql - -- Verify constraints exist - SELECT constraint_name, constraint_type - FROM information_schema.table_constraints - WHERE table_schema = 'main'; - - -- Verify indexes exist - SELECT schemaname, tablename, indexname - FROM pg_indexes - WHERE schemaname = 'main'; - ``` + + ```sql + -- Verify constraints exist + SELECT constraint_name, constraint_type + FROM information_schema.table_constraints + WHERE table_schema = 'main'; + + -- Verify indexes exist + SELECT schemaname, tablename, indexname + FROM pg_indexes + WHERE schemaname = 'main'; + ``` 4. **Connection String Issues**: - - Aspire automatically configures connection strings - - Check appsettings.json for overrides - - Verify service references in AppHost Program.cs + - Aspire automatically configures connection strings + - Check appsettings.json for overrides + - Verify service references in AppHost Program.cs ### Observability Integration Complete observability stack configured by default: + - **Structured Logging**: Serilog with enrichment - **Metrics**: OpenTelemetry with custom meters - **Tracing**: Distributed tracing across services - **Health Checks**: Built-in health endpoints **Health Check Endpoints**: + - `/status` - Liveness probe (cached status, no auth) - `/health/internal` - Readiness probe (localhost only, detailed in dev) - `/health` - Public health check (requires auth, detailed) **Database Health Checks**: + - Connectivity validation - Schema verification (tables, constraints, indexes) - Basic data access testing - Constraint and foreign key validation **Aspire Configuration**: + - Database resources with health checks - Liquibase migration dependencies - Service orchestration with proper wait conditions @@ -471,6 +505,7 @@ Complete observability stack configured by default: ### Development vs Production Configuration Template generates environment-specific configurations: + - **Development**: Uses Aspire dashboard, verbose logging - **Production**: Optimized for container deployment - **Docker Compose**: Full-stack local development environment diff --git a/Directory.Packages.props b/Directory.Packages.props index 8e592f46..bb913544 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,11 +1,12 @@ true - 13.4.3 + true + 13.4.6 $(AspireVersion) - 10.0.9 + 10.0.10 - 10.1.0 + 10.2.1 1.16.0 1.15.1 @@ -42,18 +43,20 @@ - + - + + + @@ -82,6 +85,8 @@ + + @@ -95,20 +100,20 @@ - - + + - + - + - + @@ -116,9 +121,9 @@ - - - + + + diff --git a/docs/bun.lock b/docs/bun.lock index 1425f196..eac01c2b 100644 --- a/docs/bun.lock +++ b/docs/bun.lock @@ -10,8 +10,8 @@ "yaml": "^2.8.1", }, "devDependencies": { - "@mermaid-js/layout-elk": "^0.1.7", - "@types/node": "^25.2.3", + "@mermaid-js/layout-elk": "^0.2.1", + "@types/node": "^26.0.0", "markdown-it": "^14.1.0", "mermaid": "^11.10.1", "vitepress": "^1.6.4", @@ -137,7 +137,7 @@ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@mermaid-js/layout-elk": ["@mermaid-js/layout-elk@0.1.9", "", { "dependencies": { "d3": "^7.9.0", "elkjs": "^0.9.3" }, "peerDependencies": { "mermaid": "^11.0.2" } }, "sha512-HuvaqFZBr6yT9PpWYockvKAZPJVd89yn/UjOYPxhzbZxlybL2v+2BjVCg7MVH6vRs1irUohb/s42HEdec1CCZw=="], + "@mermaid-js/layout-elk": ["@mermaid-js/layout-elk@0.2.2", "", { "dependencies": { "d3": "^7.9.0", "elkjs": "^0.9.3" }, "peerDependencies": { "mermaid": "^11.0.2" } }, "sha512-vnH3gtqfhyBiRVKNpT8iDENTw18q/OF0GF/SfYfHN43KZpu+6eZDEOMHTfNYAkpmUWJNgtRQFIS6BTc7vH/DYQ=="], "@mermaid-js/parser": ["@mermaid-js/parser@0.6.3", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA=="], @@ -277,7 +277,7 @@ "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], - "@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="], + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], @@ -611,7 +611,7 @@ "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], - "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], diff --git a/docs/package.json b/docs/package.json index e5cc462e..0c54bc73 100644 --- a/docs/package.json +++ b/docs/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@mermaid-js/layout-elk": "^0.2.1", - "@types/node": "^25.2.3", + "@types/node": "^26.0.0", "markdown-it": "^14.1.0", "mermaid": "^11.10.1", "vitepress": "^1.6.4" diff --git a/libs/Momentum/Directory.Build.props b/libs/Momentum/Directory.Build.props index 56a7d736..79719736 100644 --- a/libs/Momentum/Directory.Build.props +++ b/libs/Momentum/Directory.Build.props @@ -7,7 +7,8 @@ true ../../Momentum.ruleset true - $(NoWarn);CS1591;LOGGEN036;LOGGEN031;S3267;NU1603 + + $(NoWarn);CS1591;LOGGEN036;LOGGEN031;S3267;NU1603;NU5104 1000.0.0 + + + diff --git a/src/AppDomain/AppDomain.csproj b/src/AppDomain/AppDomain.csproj index c374e5fe..14623f90 100644 --- a/src/AppDomain/AppDomain.csproj +++ b/src/AppDomain/AppDomain.csproj @@ -30,6 +30,9 @@ + + + diff --git a/tests/AppDomain.Tests.E2E/OpenApi/Generated/AppDomainApiClient.cs b/tests/AppDomain.Tests.E2E/OpenApi/Generated/AppDomainApiClient.cs index d2b79c4a..a16476d3 100644 --- a/tests/AppDomain.Tests.E2E/OpenApi/Generated/AppDomainApiClient.cs +++ b/tests/AppDomain.Tests.E2E/OpenApi/Generated/AppDomainApiClient.cs @@ -14,7 +14,7 @@ namespace AppDomain.Tests.E2E.OpenApi.Generated { /// AppDomain.Api | v1 - [System.CodeDom.Compiler.GeneratedCode("Refitter", "1.7.3.0")] + [System.CodeDom.Compiler.GeneratedCode("Refitter", "2.0.0.0")] public partial interface IAppDomainApiClient { /// Retrieves a specific cashier by their unique identifier @@ -294,7 +294,7 @@ public partial interface IAppDomainApiClient //---------------------- // -// Generated using the NSwag toolchain v14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) // //---------------------- @@ -320,7 +320,7 @@ namespace AppDomain.Tests.E2E.OpenApi.Generated - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class CancelInvoiceRequest { @@ -340,7 +340,7 @@ public IDictionary AdditionalProperties } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class Cashier { @@ -382,7 +382,7 @@ public IDictionary AdditionalProperties } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class CashierPayment { @@ -409,7 +409,7 @@ public IDictionary AdditionalProperties /// /// Request to create a new cashier. /// - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class CreateCashierRequest { @@ -441,7 +441,7 @@ public IDictionary AdditionalProperties /// /// Request to create a new invoice in the system. /// - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class CreateInvoiceRequest { @@ -489,7 +489,7 @@ public IDictionary AdditionalProperties } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class HttpValidationProblemDetails { @@ -523,7 +523,7 @@ public IDictionary AdditionalProperties } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class Invoice { @@ -587,7 +587,8 @@ public IDictionary AdditionalProperties } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] + [JsonConverter(typeof(JsonStringEnumConverter))] public enum InvoiceStatus { @@ -605,7 +606,7 @@ public enum InvoiceStatus /// /// Request to mark an invoice as paid with payment details. /// - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class MarkInvoiceAsPaidRequest { @@ -642,7 +643,7 @@ public IDictionary AdditionalProperties } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class ProblemDetails { @@ -673,7 +674,7 @@ public IDictionary AdditionalProperties } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class Result { @@ -720,7 +721,7 @@ public IDictionary AdditionalProperties /// /// Request to simulate a payment for testing purposes. /// - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class SimulatePaymentRequest { @@ -772,7 +773,7 @@ public IDictionary AdditionalProperties /// /// Request to update an existing cashier. /// - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))")] public partial class UpdateCashierRequest {