Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Default owners for all files
* @eventhub/maintainers
12 changes: 12 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
version: 2
updates:
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
13 changes: 13 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Summary
- [ ] Describe the change in 1-2 bullet points
- [ ] Mention any related issues or links

## Testing
- [ ] Added or updated tests
- [ ] `dotnet test` (with coverage)
- [ ] Other: ______

## Additional checks
- [ ] Documentation updated (if needed)
- [ ] Breaking changes noted and communicated
- [ ] Security/privacy impact considered
10 changes: 8 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,14 @@ jobs:
- name: Restore dependencies
run: dotnet restore

- name: Check code format
run: dotnet format --verify-no-changes

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

- name: Skip tests (for now)
run: echo "No test project yet — skipping tests"
- name: Run tests with coverage
run: dotnet test --configuration Release --no-build --collect "XPlat Code Coverage"

- name: Scan for vulnerable packages
run: dotnet list package --vulnerable
166 changes: 91 additions & 75 deletions EventHub.sln
Original file line number Diff line number Diff line change
@@ -1,87 +1,103 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.Domain", "src\EventHub.Domain\EventHub.Domain.csproj", "{1CDAA880-1542-4644-9DF3-78BCADCE543E}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{848702C5-0F6F-443E-9835-9B6AF62862CC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.Application", "src\EventHub.Application\EventHub.Application.csproj", "{8D99A724-5894-4C57-A4A8-A59460512D15}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.Domain", "src\\EventHub.Domain\\EventHub.Domain.csproj", "{1CDAA880-1542-4644-9DF3-78BCADCE543E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.Infrastructure", "src\EventHub.Infrastructure\EventHub.Infrastructure.csproj", "{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.Application", "src\\EventHub.Application\\EventHub.Application.csproj", "{8D99A724-5894-4C57-A4A8-A59460512D15}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.API", "src\EventHub.API\EventHub.API.csproj", "{B514BAC6-A727-4A6F-AB52-D89F40FCB561}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.Infrastructure", "src\\EventHub.Infrastructure\\EventHub.Infrastructure.csproj", "{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.API", "src\\EventHub.API\\EventHub.API.csproj", "{B514BAC6-A727-4A6F-AB52-D89F40FCB561}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventHub.Domain.Tests", "tests\\EventHub.Domain.Tests\\EventHub.Domain.Tests.csproj", "{482DFB1D-EC75-44AA-953A-3557DA2B91F0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x64.ActiveCfg = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x64.Build.0 = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x86.ActiveCfg = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x86.Build.0 = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|Any CPU.Build.0 = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x64.ActiveCfg = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x64.Build.0 = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x86.ActiveCfg = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x86.Build.0 = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x64.ActiveCfg = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x64.Build.0 = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x86.ActiveCfg = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x86.Build.0 = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|Any CPU.Build.0 = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x64.ActiveCfg = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x64.Build.0 = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x86.ActiveCfg = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x86.Build.0 = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x64.ActiveCfg = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x64.Build.0 = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x86.ActiveCfg = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x86.Build.0 = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|Any CPU.Build.0 = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x64.ActiveCfg = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x64.Build.0 = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x86.ActiveCfg = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x86.Build.0 = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x64.ActiveCfg = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x64.Build.0 = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x86.ActiveCfg = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x86.Build.0 = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|Any CPU.Build.0 = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x64.ActiveCfg = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x64.Build.0 = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x86.ActiveCfg = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{1CDAA880-1542-4644-9DF3-78BCADCE543E} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{8D99A724-5894-4C57-A4A8-A59460512D15} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{B514BAC6-A727-4A6F-AB52-D89F40FCB561} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D8BB9D14-EA84-4F5B-A466-7721011ED58D}
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x64.ActiveCfg = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x64.Build.0 = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x86.ActiveCfg = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Debug|x86.Build.0 = Debug|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|Any CPU.Build.0 = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x64.ActiveCfg = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x64.Build.0 = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x86.ActiveCfg = Release|Any CPU
{1CDAA880-1542-4644-9DF3-78BCADCE543E}.Release|x86.Build.0 = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x64.ActiveCfg = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x64.Build.0 = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x86.ActiveCfg = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Debug|x86.Build.0 = Debug|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|Any CPU.Build.0 = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x64.ActiveCfg = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x64.Build.0 = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x86.ActiveCfg = Release|Any CPU
{8D99A724-5894-4C57-A4A8-A59460512D15}.Release|x86.Build.0 = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x64.ActiveCfg = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x64.Build.0 = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x86.ActiveCfg = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Debug|x86.Build.0 = Debug|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|Any CPU.Build.0 = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x64.ActiveCfg = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x64.Build.0 = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x86.ActiveCfg = Release|Any CPU
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9}.Release|x86.Build.0 = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x64.ActiveCfg = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x64.Build.0 = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x86.ActiveCfg = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Debug|x86.Build.0 = Debug|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|Any CPU.Build.0 = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x64.ActiveCfg = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x64.Build.0 = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x86.ActiveCfg = Release|Any CPU
{B514BAC6-A727-4A6F-AB52-D89F40FCB561}.Release|x86.Build.0 = Release|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Debug|x64.ActiveCfg = Debug|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Debug|x64.Build.0 = Debug|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Debug|x86.ActiveCfg = Debug|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Debug|x86.Build.0 = Debug|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Release|Any CPU.Build.0 = Release|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Release|x64.ActiveCfg = Release|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Release|x64.Build.0 = Release|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Release|x86.ActiveCfg = Release|Any CPU
{482DFB1D-EC75-44AA-953A-3557DA2B91F0}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{1CDAA880-1542-4644-9DF3-78BCADCE543E} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{8D99A724-5894-4C57-A4A8-A59460512D15} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{B97C9E27-790A-489E-B0EA-9F8B4700ECF9} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{B514BAC6-A727-4A6F-AB52-D89F40FCB561} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{482DFB1D-EC75-44AA-953A-3557DA2B91F0} = {848702C5-0F6F-443E-9835-9B6AF62862CC}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D8BB9D14-EA84-4F5B-A466-7721011ED58D}
EndGlobalSection
EndGlobal
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,29 @@
# EventHub
A clean-architecture, cloud-ready event scheduling and registration API built with .NET 8, Postgres, Docker, and full CI/CD pipelines.

## Local setup
Ensure your environment matches CI so pull requests succeed:

1. Install the .NET 8 SDK (the repo pins 8.0.100 via `global.json`).
2. Restore packages:
```bash
dotnet restore
```
3. Verify formatting (CI runs this step):
```bash
dotnet format --verify-no-changes
```
4. Build in Release mode:
```bash
dotnet build --configuration Release --no-restore
```
5. Run tests with coverage (mirrors CI):
```bash
dotnet test --configuration Release --no-build --collect "XPlat Code Coverage"
```
6. Check vulnerable dependencies:
```bash
dotnet list package --vulnerable
```

Running the above commands locally before opening a PR will align with the CI workflow and reduce failures.
6 changes: 6 additions & 0 deletions global.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"sdk": {
"version": "8.0.100",
"rollForward": "latestFeature"
}
}
2 changes: 1 addition & 1 deletion src/EventHub.API/EventHub.API.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.11" />
</ItemGroup>

<ItemGroup>
Expand Down
27 changes: 9 additions & 18 deletions src/EventHub.Application/DTOs/EventDto.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventHub.Application.DTOs;

namespace EventHub.Application.DTOs
public class EventDto
{

public class EventDto
{
public Guid Id { get; set; }
public string Title { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public DateTime StartTimeUtc { get; set; }
public DateTime EndTimeUtc { get; set; }
public string Location { get; set; } = string.Empty;
public DateTime CreatedAtUtc { get; set; }
}

public Guid Id { get; set; }
public string Title { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public DateTime StartTimeUtc { get; set; }
public DateTime EndTimeUtc { get; set; }
public string Location { get; set; } = string.Empty;
public DateTime CreatedAtUtc { get; set; }
}
6 changes: 4 additions & 2 deletions src/EventHub.Domain/Exceptions/InvalidEmailException.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
namespace EventHub.Domain.Exceptions;

public class InvalidEmailException :DomainException
public class InvalidEmailException : DomainException
{
public InvalidEmailException(string message) : base(message) { }
public InvalidEmailException(string message) : base(message)
{
}
}
6 changes: 3 additions & 3 deletions src/EventHub.Domain/ValueObjects/Email.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
using EventHub.Domain.Exceptions;
using System.Text.RegularExpressions;
using EventHub.Domain.ValueObjects;
using EventHub.Domain.Exceptions;

namespace EventHub.Domain.ValueObjects;

public record Email
{
public string Value { get; }
private static readonly Regex EmailRegex = new(@"^[^@\s]+@[^@\s]+\.[^@\s]+$", RegexOptions.Compiled);

public Email(string value)
{
if (string.IsNullOrWhiteSpace(value) || !EmailRegex.IsMatch(value))
throw new InvalidEmailException("Invalid email format.");
Value = value;
}

public override string ToString() => Value;
}
8 changes: 4 additions & 4 deletions src/EventHub.Infrastructure/EventHub.Infrastructure.csproj
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.11" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.11" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.11">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
</ItemGroup>

<ItemGroup>
Expand Down
5 changes: 2 additions & 3 deletions src/EventHub.Infrastructure/Repositories/RepositoryBase.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using EventHub.Application.Interfaces;
using EventHub.Application.Interfaces;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace EventHub.Infrastructure.Repositories;

Expand All @@ -24,7 +23,7 @@ public async Task<IEnumerable<T>> GetAllAsync() =>
public async Task AddAsync(T entity)
{
await _set.AddAsync(entity);
await _context.SaveChangesAsync();
await _context.SaveChangesAsync();
}

public async Task RemoveAsync(T entity)
Expand Down
Loading
Loading