Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
febce6c
feat: update target framework on projects to dotnet 10
matthewtoghill Dec 1, 2025
1d0c713
feat: update release pipeline to use dotnet-version 10.x
matthewtoghill Dec 1, 2025
04f3827
chore: update readme
matthewtoghill Dec 1, 2025
fb3d167
fix: remove FromForm annotation on endpoint for IFormFile parameter
matthewtoghill Dec 1, 2025
3c06631
chore: update packages and resolve breaking changes
matthewtoghill Dec 1, 2025
ded88d2
feat: update use of nameof with support for unbound generic types
matthewtoghill Dec 1, 2025
10ad0c4
chore: formatting
matthewtoghill Dec 3, 2025
feb2b7f
Applying C# 14 new features to code, such as extension blocks and oth…
CesarD Dec 7, 2025
922ee59
Resolving merge conflicts.
CesarD Dec 7, 2025
2fa537a
Updated dependencies.
CesarD Dec 7, 2025
e3596dc
chore: move common MSBuild properties to Directory.Build.props file
matthewtoghill Dec 9, 2025
14a8fc7
chore: update packages
matthewtoghill Dec 9, 2025
1a00035
refactor: Migrate OpenAPI docs from Swagger to Scalar.AspNetCore
CesarD Dec 10, 2025
3d515d7
refactor: finished converting the last missing extension methods into…
CesarD Dec 11, 2025
226b0e6
chore: update packages
matthewtoghill Dec 15, 2025
67f4af3
chore: remove RequiresAuthentication from integration tests when the …
matthewtoghill Dec 15, 2025
ba2d991
feat: remove sln file
matthewtoghill Dec 15, 2025
dcc6cdb
chore: match condition to base class
matthewtoghill Dec 15, 2025
afa6598
Refactor entity ID generation to use app-side GUIDs
CesarD Dec 23, 2025
6b6c540
Refactor Mediator API for CancellationToken & CreatedResponse
CesarD Dec 28, 2025
fa691aa
Undo accidental cleanup.
CesarD Dec 28, 2025
72e4547
Refactor integration test infra: shared fixture & Respawn
CesarD Jan 20, 2026
badcdbb
Update NuGet package versions to latest releases
CesarD Jan 20, 2026
5a7d697
Formatting.
CesarD Jan 20, 2026
b6fb8d8
fix: revert change to product test
matthewtoghill Feb 1, 2026
27a68de
chore: update packages and comment formatting
matthewtoghill Feb 1, 2026
470b72f
fix: integration test issues
matthewtoghill Feb 1, 2026
f1b5237
chore: remove template config special custom operations for slnx file…
matthewtoghill Feb 1, 2026
52c486c
Refactor integration test infra: DI, containers, MassTransit
CesarD Mar 2, 2026
719238a
Resolved merge conflicts.
CesarD Mar 2, 2026
e94cbe2
Bump Monaco.Template version to 2.8.0
CesarD Mar 2, 2026
ce31426
Exclude .idea directory in template.json patterns
CesarD Mar 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Release to NuGet
on:
release:
types: [published]

jobs:
build:
runs-on: ubuntu-latest
Expand All @@ -14,7 +14,7 @@ jobs:
- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.x
dotnet-version: 10.x
- name: Install Mono
run: |
sudo apt-get update
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Each of the different solution templates also provide some basic business compon

### Supported .NET version:

9.0
10.0

### Installation

Expand Down
34 changes: 2 additions & 32 deletions src/Content/Backend/Solution/.template.config/template.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,41 +14,10 @@
"type": "project"
},
"primaryOutputs": [
{
"path": "Monaco.Template.Backend.sln"
},
{
"path": "Monaco.Template.Backend.slnx"
}
],
"SpecialCustomOperations": {
"**.slnx": {
"operations": [
{
"type": "conditional",
"configuration": {
"actionableIf": [ "<!--#if" ],
"actionableElse": [ "#else", "<!--#else" ],
"actionableElseif": [ "#elseif", "<!--#elseif", "#elif", "<!--#elif" ],
"endif": [ "#endif", "<!--#endif" ],
"trim" : "true",
"wholeLine": "true",
"evaluator": "C++"
}
},
{
"type": "balancednesting",
"configuration": {
"startToken": "<!--",
"realEndToken": "-->",
"pseudoEndToken": "-- >",
"id": "fixPseudoNestedComments",
"resetFlag": "_TestResetFlag_"
}
}
]
}
},
"symbols": {
"apiGateway": {
"type": "parameter",
Expand Down Expand Up @@ -203,7 +172,8 @@
"**/.vs/**/*",
"**/logs/**",
"**/TestResults/**",
"**/[Pp]ublish/**/*"
"**/[Pp]ublish/**/*",
"**/.idea/**/*"
],
"modifiers": [
{
Expand Down
9 changes: 9 additions & 0 deletions src/Content/Backend/Solution/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project>

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

</Project>
85 changes: 43 additions & 42 deletions src/Content/Backend/Solution/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,77 +3,78 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.1" />
<PackageVersion Include="AspNetCore.HealthChecks.Uris" Version="9.0.0" />
<PackageVersion Include="DelegateDecompiler.EntityFrameworkCore5" Version="0.34.2" />
<PackageVersion Include="FluentValidation" Version="12.0.0" />
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
<PackageVersion Include="DelegateDecompiler.EntityFrameworkCore5" Version="0.35.3" />
<PackageVersion Include="FluentValidation" Version="12.1.1" />
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.1.1" />
<PackageVersion Include="Flurl.Http" Version="4.0.2" />
<PackageVersion Include="LinqKit.Microsoft.EntityFrameworkCore" Version="9.0.8" />
<PackageVersion Include="LinqKit.Microsoft.EntityFrameworkCore" Version="10.0.10" />
<PackageVersion Include="MediatR" Version="12.5.0" />
<PackageVersion Include="MediatR.Contracts" Version="2.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.8" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.8" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.8" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.8" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.8" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.8" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.8" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="9.0.8" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.8" />
<PackageVersion Include="Polly.Core" Version="8.6.3" />
<PackageVersion Include="Polly.Extensions" Version="8.6.3" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Proxies" Version="10.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.2" />
<PackageVersion Include="Polly.Core" Version="8.6.5" />
<PackageVersion Include="Polly.Extensions" Version="8.6.5" />
<PackageVersion Include="Respawn" Version="7.0.0" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.12.27" />
<PackageVersion Include="Serilog" Version="4.3.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageVersion Include="Serilog.Sinks.ApplicationInsights" Version="4.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="10.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.0" />
<PackageVersion Include="Serilog.Sinks.ApplicationInsights" Version="5.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="9.0.4" />
<PackageVersion Include="Throw" Version="1.4.0" />
<!--#if (apiGateway)-->
<PackageVersion Include="Yarp.ReverseProxy" Version="2.3.0" />
<!--#endif-->
<!--#if (auth)-->
<PackageVersion Include="Keycloak.Net.Core" Version="1.0.34" />
<PackageVersion Include="Testcontainers.Keycloak" Version="4.6.0" />
<PackageVersion Include="Keycloak.Net.Core" Version="1.0.38" />
<PackageVersion Include="Testcontainers.Keycloak" Version="4.10.0" />
<!--#endif-->
<!--#if (filesSupport)-->
<PackageVersion Include="AsyncEnumerator" Version="4.0.2" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.25.0" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.27.0" />
<PackageVersion Include="ExifLibNet" Version="2.1.4" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.8" />
<PackageVersion Include="SkiaSharp" Version="3.119.0" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="3.119.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.2" />
<PackageVersion Include="SkiaSharp" Version="3.119.1" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="3.119.1" />
<!--#if (tests)-->
<PackageVersion Include="Testcontainers.Azurite" Version="4.6.0" />
<PackageVersion Include="Testcontainers.Azurite" Version="4.10.0" />
<!--#endif-->
<!--#endif-->
<!--#if (massTransitIntegration)-->
<PackageVersion Include="MassTransit" Version="8.5.2" />
<PackageVersion Include="MassTransit.Azure.ServiceBus.Core" Version="8.5.2" />
<PackageVersion Include="MassTransit.EntityFrameworkCore" Version="8.5.2" />
<PackageVersion Include="MassTransit.RabbitMQ" Version="8.5.2" />
<PackageVersion Include="MassTransit" Version="8.5.7" />
<PackageVersion Include="MassTransit.Azure.ServiceBus.Core" Version="8.5.7" />
<PackageVersion Include="MassTransit.EntityFrameworkCore" Version="8.5.7" />
<PackageVersion Include="MassTransit.RabbitMQ" Version="8.5.7" />
<!--#if (tests)-->
<PackageVersion Include="Testcontainers.RabbitMq" Version="4.6.0" />
<PackageVersion Include="Testcontainers.RabbitMq" Version="4.10.0" />
<!--#endif-->
<!--#endif-->
<!--#if (tests)-->
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" />
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="AwesomeAssertions" Version="9.1.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="MockQueryable.Moq" Version="7.0.4-beta" />
<PackageVersion Include="AwesomeAssertions" Version="9.3.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="MockQueryable.Moq" Version="10.0.2" />
<PackageVersion Include="Moq" Version="4.20.72" />
<PackageVersion Include="Testcontainers" Version="4.6.0" />
<PackageVersion Include="Testcontainers.MsSql" Version="4.6.0" />
<PackageVersion Include="TngTech.ArchUnitNET.xUnit" Version="0.12.1" />
<PackageVersion Include="Testcontainers" Version="4.10.0" />
<PackageVersion Include="Testcontainers.MsSql" Version="4.10.0" />
<PackageVersion Include="TngTech.ArchUnitNET.xUnit" Version="0.13.2" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.4" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
<!--#endif-->
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,27 @@ namespace Monaco.Template.Backend.Api.DTOs.Extensions;

internal static class CompanyExtensions
{
public static CreateCompany.Command MapCreateCommand(this CompanyCreateEditDto value) =>
new(value.Name!,
value.Email!,
value.WebSiteUrl!,
value.Street,
value.City,
value.County,
value.PostCode,
value.CountryId);
extension(CompanyCreateEditDto value)
{
public CreateCompany.Command MapCreateCommand() =>
new(value.Name!,
value.Email!,
value.WebSiteUrl!,
value.Street,
value.City,
value.County,
value.PostCode,
value.CountryId);

public static EditCompany.Command MapEditCommand(this CompanyCreateEditDto value, Guid id) =>
new(id,
value.Name!,
value.Email!,
value.WebSiteUrl!,
value.Street,
value.City,
value.County,
value.PostCode,
value.CountryId);
public EditCompany.Command MapEditCommand(Guid id) =>
new(id,
value.Name!,
value.Email!,
value.WebSiteUrl!,
value.Street,
value.City,
value.County,
value.PostCode,
value.CountryId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,23 @@ namespace Monaco.Template.Backend.Api.DTOs.Extensions;

internal static class ProductExtensions
{
public static CreateProduct.Command Map(this ProductCreateEditDto value) =>
new(value.Title,
value.Description,
value.Price,
value.CompanyId,
value.Pictures,
value.DefaultPictureId);
extension(ProductCreateEditDto value)
{
public CreateProduct.Command Map() =>
new(value.Title,
value.Description,
value.Price,
value.CompanyId,
value.Pictures,
value.DefaultPictureId);

public static EditProduct.Command Map(this ProductCreateEditDto value, Guid id) =>
new(id,
value.Title,
value.Description,
value.Price,
value.CompanyId,
value.Pictures,
value.DefaultPictureId);
public EditProduct.Command Map(Guid id) =>
new(id,
value.Title,
value.Description,
value.Price,
value.CompanyId,
value.Pictures,
value.DefaultPictureId);
}
}
Loading