Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
7f65189
add Contact entity (#2)
nwdorian Nov 14, 2025
602c6c1
add database (#4)
nwdorian Nov 15, 2025
fccaf2c
refactor email validation logic
nwdorian Nov 15, 2025
266fa2a
add Create Contact endpoint
nwdorian Nov 16, 2025
1492ab4
apply formatting
nwdorian Nov 16, 2025
0eb229a
remove referenced .Contracts project and SwaggerUI ApiExplorer method
nwdorian Nov 16, 2025
901563f
add Serilog logging
nwdorian Nov 16, 2025
06aa236
add global exception handler
nwdorian Nov 17, 2025
05d7da4
refactor: vertical slices (#7)
nwdorian Nov 22, 2025
d3e2129
feat: retrieve Contact by identifier (#8)
nwdorian Nov 22, 2025
dd2f4e6
feat: delete contact (#16)
nwdorian Nov 23, 2025
9b0b3b9
change target framework to .NET 10 and update nuget packages (#23)
nwdorian Nov 23, 2025
7586654
change rules to prefer explicit types in .editorconfig
nwdorian Nov 23, 2025
c5e346a
refactor from var to explicit types
nwdorian Nov 23, 2025
d4b1560
primary constructors (#24)
nwdorian Nov 23, 2025
079822c
command and query abstractions (#26)
nwdorian Nov 23, 2025
18a2698
use EF complex types (#27)
nwdorian Nov 24, 2025
c2e9c7d
update contact (#28)
nwdorian Nov 26, 2025
de81b3d
get paginated contacts (#31)
nwdorian Nov 29, 2025
1ec2d62
remove Value accessor from equality checks (#32)
nwdorian Nov 30, 2025
5f5a6a8
refactor error to lambda expression (#33)
nwdorian Nov 30, 2025
8048a29
test: add Domain unit tests (#37)
nwdorian Nov 30, 2025
4498ff2
refactor: rename UnitTests project to Domain.UnitTests (#40)
nwdorian Dec 2, 2025
ea13c86
feat: add GetContactsResponse contract (#43)
nwdorian Dec 6, 2025
6b3fa13
test: add integration tests (#44)
nwdorian Dec 7, 2025
481da8c
test: use TestData in unit tests (#45)
nwdorian Dec 8, 2025
931d74c
feat: add FirstPage constant to Page (#49)
nwdorian Dec 8, 2025
c019c8f
feat: add OpenApi metadata to GetContacts endpoint (#50)
nwdorian Dec 8, 2025
9dfdc55
test: add runsettings file (#51)
nwdorian Dec 8, 2025
440636e
test: move testing cases to test projects (#52)
nwdorian Dec 8, 2025
57ee51d
test: add architecture tests (#56)
nwdorian Dec 8, 2025
94eb2dc
test: rename test cases and UnitTests project (#57)
nwdorian Dec 9, 2025
ce9e91b
refactor: add "Handler" postfix to use cases (#58)
nwdorian Dec 9, 2025
1e974b3
refactor: change Fluent Validation validators access modifier to inte…
nwdorian Dec 9, 2025
6f56af6
build: add build verification GitHub Actions workflow (#60)
nwdorian Dec 9, 2025
ec9864d
build: add test verification GitHub Action workflow (#61)
nwdorian Dec 9, 2025
be51811
docs: add status badge to README (#63)
nwdorian Dec 9, 2025
a28e8a8
feat: data seeding from excel document (#64)
nwdorian Dec 11, 2025
19d8bd2
feat: pdf report generation (#66)
nwdorian Dec 12, 2025
4522642
build: update build and test workflows (#68)
nwdorian Dec 12, 2025
2a6bd86
refactor: database seeding (#71)
nwdorian Dec 12, 2025
bc9acd6
feat: console UI (#72)
nwdorian Dec 15, 2025
a68baab
refactor: move database check before excel parsing when seeding conta…
nwdorian Dec 15, 2025
0333a4c
build: enable repeatable package restores in workflows (#77)
nwdorian Dec 15, 2025
92c0ae6
docs: add README documentation (#82)
nwdorian Dec 17, 2025
38c53f6
fix: add condition for positive integer prompt validation (#83)
nwdorian Dec 17, 2025
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
34 changes: 22 additions & 12 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = false
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
csharp_style_prefer_primary_constructors = true:warning
###############################
# Naming Conventions #
###############################
Expand Down Expand Up @@ -85,9 +87,9 @@ dotnet_style_prefer_collection_expression = never

[*.cs]
# var preferences
csharp_style_var_for_built_in_types = true:silent
csharp_style_var_when_type_is_apparent = true:silent
csharp_style_var_elsewhere = true:silent
csharp_style_var_for_built_in_types = false:error
csharp_style_var_when_type_is_apparent = false:error
csharp_style_var_elsewhere = false:error
# Expression-bodied members
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_constructors = false:silent
Expand Down Expand Up @@ -145,25 +147,33 @@ csharp_preserve_single_line_blocks = true
# Custom rules

# Maximum line length
max_line_length = 120

# IDE0290 Use primary constructor
csharp_style_prefer_primary_constructors = false
max_line_length = 90

# CA1848: Use the LoggerMessage delegates
dotnet_diagnostic.CA1848.severity = none

# S1135: Track uses of "TODO" tags
dotnet_diagnostic.S1135.severity = none

[**/Result.cs]
dotnet_diagnostic.CA1000.severity = none
# S2326: Unused type parameters should be removed
dotnet_diagnostic.S2326.severity = none

# CA1716 Identifiers should not match keywords
[**/Error.cs]
dotnet_diagnostic.CA1716.severity = none

# EF CORE MIGRATIONS
# CA1707: Identifiers should not contain underscores
dotnet_diagnostic.CA1707.severity = none

# CA1051: Do not declare visible instance fields
dotnet_diagnostic.CA1051.severity = none

# CA1711: Identifiers should not have incorrect suffix
dotnet_diagnostic.CA1711.severity = none

[**/Result.cs]
# CA1000: Do not declare static members on generic types
dotnet_diagnostic.CA1000.severity = none

[**/Migrations/*.cs]
# IDE0161 Use file-scoped namespace (EF Core migrations are auto-generated with block-scoped namespace)
dotnet_diagnostic.IDE0161.severity = none
dotnet_diagnostic.IDE0161.severity = none
31 changes: 31 additions & 0 deletions .github/workflows/build-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: build

on:
pull_request:
branches:
- main
- develop
workflow_dispatch:

env:
DOTNET_VERSION: "10.0.x" # The .NET SDK version to use

jobs:
build:
name: build
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v5
- name: Setup .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
cache: true
cache-dependency-path: "**/packages.lock.json"

- name: Install dependencies
run: dotnet restore --locked-mode

- name: Build
run: dotnet build --configuration Release --no-restore
34 changes: 34 additions & 0 deletions .github/workflows/test-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: tests

on:
pull_request:
branches:
- main
- develop
workflow_dispatch:

env:
DOTNET_VERSION: "10.0.x" # The .NET SDK version to use

jobs:
build-and-test:
name: build-and-test
runs-on: windows-latest

steps:
- uses: actions/checkout@v5
- name: Setup .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
cache: true
cache-dependency-path: "**/packages.lock.json"

- name: Install dependencies
run: dotnet restore --locked-mode

- name: Build
run: dotnet build --configuration Release --no-restore

- name: Test
run: dotnet test --configuration Release --no-restore --no-build --verbosity normal
19 changes: 19 additions & 0 deletions .runsettings
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<DataCollectionRunSettings>
<DataCollectors>
<DataCollector friendlyName="Code Coverage">
<Configuration>
<CodeCoverage>
<Sources>
<Exclude>
<Source>.*/Migrations/.*\.cs$</Source>
<Source>.*/OpenApiXmlCommentSupport\.generated\.cs$</Source>
</Exclude>
</Sources>
</CodeCoverage>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"dotnet.unitTests.runSettingsPath": ".runsettings"
}
18 changes: 0 additions & 18 deletions Directory.Build.Props

This file was deleted.

18 changes: 18 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<AnalysisLevel>latest-Recommended</AnalysisLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>
<ItemGroup Condition="'$(MSBuildProjectExtension)' != '.dcproj'">
<PackageReference Include="SonarAnalyzer.CSharp">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
36 changes: 30 additions & 6 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,35 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageVersion Include="SonarAnalyzer.CSharp" Version="10.15.0.120848" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageVersion Include="xunit" Version="2.9.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="Asp.Versioning.Http" Version="8.1.0" />
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
<PackageVersion Include="Bogus" Version="35.6.5" />
<PackageVersion Include="ClosedXML" Version="0.105.0" />
<PackageVersion Include="FluentValidation" Version="12.1.0" />
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.1.1" />
<PackageVersion Include="Handlebars.Net" Version="2.1.6" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="10.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.1" />
<PackageVersion Include="NetArchTest.Rules" Version="1.3.2" />
<PackageVersion Include="PuppeteerSharp" Version="20.2.5" />
<PackageVersion Include="Refit.HttpClientFactory" Version="9.0.2" />
<PackageVersion Include="Scrutor" Version="7.0.0" />
<PackageVersion Include="Serilog" Version="4.3.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.1-dev-02315" />
<PackageVersion Include="SonarAnalyzer.CSharp" Version="10.16.1.129956" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="Spectre.Console" Version="0.54.1-alpha.0.10" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
</ItemGroup>
</Project>
Loading