mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-10-15 01:54:43 +00:00
Compare commits
5 Commits
f85ff79a2c
...
180ed41e68
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
180ed41e68 | ||
|
|
ce2c90070e | ||
|
|
de63e9f216 | ||
|
|
7187631ebc | ||
|
|
5fa78fbdf6 |
@@ -89,10 +89,8 @@ flowchart TB
|
|||||||
subgraph INFRA["Infrastructure Layer"]
|
subgraph INFRA["Infrastructure Layer"]
|
||||||
direction LR
|
direction LR
|
||||||
I1["Database.Connection"]
|
I1["Database.Connection"]
|
||||||
I2["Infrastructure.Jwt"]
|
|
||||||
I3["Infrastructure.PasswordHashing"]
|
I3["Infrastructure.PasswordHashing"]
|
||||||
I4["Infrastructure.Email /<br/>Email.Templates"]
|
I4["Email.Templates"]
|
||||||
I5["Infrastructure.FileUpload"]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
DB[("Database (SQL Server)")]
|
DB[("Database (SQL Server)")]
|
||||||
@@ -133,7 +131,6 @@ own
|
|||||||
|
|
||||||
- Every `Features.*` project (for controller/MediatR discovery)
|
- Every `Features.*` project (for controller/MediatR discovery)
|
||||||
- `Shared.Contracts`, `Shared.Application`
|
- `Shared.Contracts`, `Shared.Application`
|
||||||
- `Infrastructure.Jwt` (for the auth middleware)
|
|
||||||
|
|
||||||
**Rules**:
|
**Rules**:
|
||||||
|
|
||||||
@@ -167,10 +164,8 @@ brewery photo upload command) rather than bound to an HTTP route directly.
|
|||||||
|
|
||||||
- `Domain.Entities`, `Domain.Exceptions`
|
- `Domain.Entities`, `Domain.Exceptions`
|
||||||
- `Database.Connection` (generic ADO.NET connection/command plumbing) plus
|
- `Database.Connection` (generic ADO.NET connection/command plumbing) plus
|
||||||
whichever infrastructure project the slice needs (`Infrastructure.Jwt`/
|
whichever infrastructure project the slice needs (`Infrastructure.PasswordHashing`
|
||||||
`Infrastructure.PasswordHashing` for Users, `Infrastructure.Email`/
|
for Users, `Infrastructure.Email.Templates` for Emails)
|
||||||
`Infrastructure.Email.Templates` for Emails, `Infrastructure.FileUpload` for
|
|
||||||
PhotoUpload)
|
|
||||||
- `Shared.Contracts`, `Shared.Application`
|
- `Shared.Contracts`, `Shared.Application`
|
||||||
- No other `Features.*` project, with two exceptions: `Features.Users`
|
- No other `Features.*` project, with two exceptions: `Features.Users`
|
||||||
references `Features.PhotoUpload` directly for avatar uploads, and
|
references `Features.PhotoUpload` directly for avatar uploads, and
|
||||||
@@ -210,11 +205,8 @@ whichever slices need them
|
|||||||
| Project | Description |
|
| Project | Description |
|
||||||
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `Database.Connection` | Generic ADO.NET connection/command plumbing (`DefaultSqlConnectionFactory`, the abstract `DapperRepository` base class), not domain-specific; each slice's own `Repository/` folder builds on this. |
|
| `Database.Connection` | Generic ADO.NET connection/command plumbing (`DefaultSqlConnectionFactory`, the abstract `DapperRepository` base class), not domain-specific; each slice's own `Repository/` folder builds on this. |
|
||||||
| `Infrastructure.Jwt` | JWT token generation and validation. |
|
|
||||||
| `Infrastructure.PasswordHashing` | Argon2id password hashing. |
|
| `Infrastructure.PasswordHashing` | Argon2id password hashing. |
|
||||||
| `Infrastructure.Email` | Email sending capabilities (SMTP/MailKit). |
|
|
||||||
| `Infrastructure.Email.Templates` | Email template rendering (Razor components). |
|
| `Infrastructure.Email.Templates` | Email template rendering (Razor components). |
|
||||||
| `Infrastructure.FileUpload` | `IFileStorageProvider` abstraction over S3-compatible object storage, implemented by `S3FileStorageProvider` (targets the SeaweedFS container in dev; any S3-compatible endpoint in other environments) using the AWS SDK's `AmazonS3Client` with `ForcePathStyle = true`. |
|
|
||||||
|
|
||||||
**Dependencies**:
|
**Dependencies**:
|
||||||
|
|
||||||
|
|||||||
@@ -97,9 +97,9 @@ see the notes for what else each of those foundation projects pulls in.
|
|||||||
|
|
||||||
- **Omitted from the diagram**:
|
- **Omitted from the diagram**:
|
||||||
- `Domain.Exceptions` (referenced by nearly every project directly, including
|
- `Domain.Exceptions` (referenced by nearly every project directly, including
|
||||||
all of `Shared.Contracts`, `Infrastructure.Jwt`, and each feature slice)
|
all of `Shared.Contracts` and each feature slice)
|
||||||
- `Infrastructure.Configuration` (the shared options-binding project
|
- `Infrastructure.Configuration` (the shared options-binding project
|
||||||
referenced by `Database.Connection`, `Infrastructure.Email`,
|
referenced by `Database.Connection`, `Features.PhotoUpload`,
|
||||||
`Infrastructure.FileUpload`, and `Features.Emails` directly)
|
and `Features.Emails` directly)
|
||||||
- both are plumbing-level dependencies of nearly everything above, and drawing
|
- both are plumbing-level dependencies of nearly everything above, and drawing
|
||||||
them would just add a second copy of the same fan-in
|
them would just add a second copy of the same fan-in
|
||||||
|
|||||||
@@ -23,10 +23,7 @@ end
|
|||||||
|
|
||||||
subgraph INFRA["Slice-specific Infrastructure"]
|
subgraph INFRA["Slice-specific Infrastructure"]
|
||||||
direction LR
|
direction LR
|
||||||
JWT["Infrastructure.Jwt"]
|
|
||||||
PwdHash["Infrastructure.PasswordHashing"]
|
PwdHash["Infrastructure.PasswordHashing"]
|
||||||
FileUpload["Infrastructure.FileUpload"]
|
|
||||||
Email["Infrastructure.Email"]
|
|
||||||
EmailTemplates["Infrastructure.Email.Templates"]
|
EmailTemplates["Infrastructure.Email.Templates"]
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -35,7 +32,7 @@ EmailsSlice == project ref, handles UserRegisteredNotification & ConfirmationEma
|
|||||||
BrewerySlice --> FOUNDATION
|
BrewerySlice --> FOUNDATION
|
||||||
LocationsSlice --> FOUNDATION
|
LocationsSlice --> FOUNDATION
|
||||||
BeersSlice --> FOUNDATION
|
BeersSlice --> FOUNDATION
|
||||||
PhotoSlice --> FOUNDATION & FileUpload
|
PhotoSlice --> FOUNDATION
|
||||||
UsersSlice --> FOUNDATION & JWT & PwdHash
|
UsersSlice --> FOUNDATION & PwdHash
|
||||||
EmailsSlice --> Email & EmailTemplates
|
EmailsSlice --> EmailTemplates
|
||||||
DBConn -- Dapper SQL, no ORM --> Tables[("SQL Server<br>Tables")]
|
DBConn -- Dapper SQL, no ORM --> Tables[("SQL Server<br>Tables")]
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ file (`development` in dev, `production` in prod).
|
|||||||
|
|
||||||
### SMTP configuration (backend)
|
### SMTP configuration (backend)
|
||||||
|
|
||||||
Read by `Infrastructure.Email/SmtpEmailProvider.cs` for sending confirmation and
|
Read by `Features.Emails/Services/SmtpEmailProvider.cs` for sending confirmation and
|
||||||
account emails.
|
account emails.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -246,7 +246,7 @@ SMTP_FROM_EMAIL=noreply@thebiergarten.app # Required, no default
|
|||||||
SMTP_FROM_NAME=The Biergarten App # Optional, defaults to "The Biergarten"
|
SMTP_FROM_NAME=The Biergarten App # Optional, defaults to "The Biergarten"
|
||||||
```
|
```
|
||||||
|
|
||||||
- **Implementation**: `Infrastructure.Email/SmtpEmailProvider.cs` throws on
|
- **Implementation**: `Features.Emails/Services/SmtpEmailProvider.cs` throws on
|
||||||
startup if `SMTP_HOST` or `SMTP_FROM_EMAIL` is missing
|
startup if `SMTP_HOST` or `SMTP_FROM_EMAIL` is missing
|
||||||
- **Local dev**: point at the `mailpit` Docker service (SMTP on port 1025, web
|
- **Local dev**: point at the `mailpit` Docker service (SMTP on port 1025, web
|
||||||
UI on http://localhost:8025)
|
UI on http://localhost:8025)
|
||||||
@@ -255,8 +255,8 @@ SMTP_FROM_NAME=The Biergarten App # Optional, defaults to "The Biergarten
|
|||||||
|
|
||||||
### File storage configuration (backend)
|
### File storage configuration (backend)
|
||||||
|
|
||||||
Read by `Infrastructure.FileUpload/S3FileStorageProvider.cs` for uploading and
|
Read by `Features.PhotoUpload/Services/S3FileStorageProvider.cs` for uploading
|
||||||
retrieving photos via an S3-compatible object store.
|
and retrieving photos via an S3-compatible object store.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
SEAWEEDFS_SERVICE_URL=http://seaweedfs:8333 # Required, no default
|
SEAWEEDFS_SERVICE_URL=http://seaweedfs:8333 # Required, no default
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ API.Specs/
|
|||||||
│ └── ApiGeneralSteps.cs # Shared/general step definitions
|
│ └── ApiGeneralSteps.cs # Shared/general step definitions
|
||||||
├── Mocks/
|
├── Mocks/
|
||||||
│ ├── MockEmailDispatcher.cs # Substitutes Features.Emails' IEmailDispatcher
|
│ ├── MockEmailDispatcher.cs # Substitutes Features.Emails' IEmailDispatcher
|
||||||
│ └── MockEmailProvider.cs # Substitutes Infrastructure.Email's IEmailProvider
|
│ └── MockEmailProvider.cs # Substitutes Features.Emails' IEmailProvider
|
||||||
└── TestApiFactory.cs # Test server setup (swaps in the mocks above)
|
└── TestApiFactory.cs # Test server setup (swaps in the mocks above)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ The Biergarten API validates JSON Web Tokens (JWTs) across three token types:
|
|||||||
|
|
||||||
### Infrastructure layer
|
### Infrastructure layer
|
||||||
|
|
||||||
#### [ITokenInfrastructure](../../web/backend/Infrastructure/Infrastructure.Jwt/ITokenInfrastructure.cs)
|
#### [ITokenInfrastructure](../../web/backend/Features/Features.Users/Services/ITokenInfrastructure.cs)
|
||||||
|
|
||||||
Low-level JWT operations.
|
Low-level JWT operations.
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ Low-level JWT operations.
|
|||||||
- `ValidateJwtAsync()` - Validates token signature, expiration, and format
|
- `ValidateJwtAsync()` - Validates token signature, expiration, and format
|
||||||
|
|
||||||
**Implementation:**
|
**Implementation:**
|
||||||
[JwtInfrastructure.cs](../../web/backend/Infrastructure/Infrastructure.Jwt/JwtInfrastructure.cs)
|
[JwtInfrastructure.cs](../../web/backend/Features/Features.Users/Services/JwtInfrastructure.cs)
|
||||||
|
|
||||||
- Uses Microsoft.IdentityModel.JsonWebTokens.JsonWebTokenHandler
|
- Uses Microsoft.IdentityModel.JsonWebTokens.JsonWebTokenHandler
|
||||||
- Algorithm: HS256 (HMAC-SHA256)
|
- Algorithm: HS256 (HMAC-SHA256)
|
||||||
@@ -76,12 +76,11 @@ directly, bypassing the `Features.Users` slice entirely.
|
|||||||
- Extracts and validates claims (Sub, UniqueName)
|
- Extracts and validates claims (Sub, UniqueName)
|
||||||
- Throws `UnauthorizedException` on validation failure
|
- Throws `UnauthorizedException` on validation failure
|
||||||
|
|
||||||
`TokenService` is registered by `Features.Users`' own `AddFeaturesUsers()`
|
`TokenService` and the lower-level `ITokenInfrastructure` (JWT
|
||||||
extension method, except for the lower-level `ITokenInfrastructure` (JWT
|
signing/verification) it depends on are both registered by `Features.Users`'
|
||||||
signing/verification) it depends on, which is registered by the host
|
own `AddFeaturesUsers()` extension method. `JwtAuthenticationHandler`
|
||||||
(`API.Core/ServiceCollectionExtensions.cs`, via `AddCoreInfrastructure()`,
|
(host-level auth middleware) also depends on `ITokenInfrastructure` directly,
|
||||||
called from `Program.cs`) since `JwtAuthenticationHandler` (host-level auth
|
resolving it from the same DI container.
|
||||||
middleware) also depends on it directly.
|
|
||||||
|
|
||||||
### Integration points
|
### Integration points
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,6 @@
|
|||||||
<ProjectReference Include="..\..\Domain\Domain.Exceptions\Domain.Exceptions.csproj" />
|
<ProjectReference Include="..\..\Domain\Domain.Exceptions\Domain.Exceptions.csproj" />
|
||||||
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Jwt\Infrastructure.Jwt.csproj" />
|
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.FileUpload\Infrastructure.FileUpload.csproj" />
|
|
||||||
<ProjectReference Include="..\..\Features\Features.Breweries\Features.Breweries.csproj" />
|
<ProjectReference Include="..\..\Features\Features.Breweries\Features.Breweries.csproj" />
|
||||||
<ProjectReference Include="..\..\Features\Features.Users\Features.Users.csproj" />
|
<ProjectReference Include="..\..\Features\Features.Users\Features.Users.csproj" />
|
||||||
<ProjectReference Include="..\..\Features\Features.Emails\Features.Emails.csproj" />
|
<ProjectReference Include="..\..\Features\Features.Emails\Features.Emails.csproj" />
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Text.Encodings.Web;
|
using System.Text.Encodings.Web;
|
||||||
|
using Features.Users.Services;
|
||||||
using Infrastructure.Configuration;
|
using Infrastructure.Configuration;
|
||||||
using Infrastructure.Jwt;
|
|
||||||
using Microsoft.AspNetCore.Authentication;
|
using Microsoft.AspNetCore.Authentication;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.Extensions.Primitives;
|
using Microsoft.Extensions.Primitives;
|
||||||
|
|||||||
@@ -34,10 +34,6 @@ COPY ["Features/Features.PhotoUpload.Tests/Features.PhotoUpload.Tests.csproj", "
|
|||||||
COPY ["Features/Features.Users/Features.Users.csproj", "Features/Features.Users/"]
|
COPY ["Features/Features.Users/Features.Users.csproj", "Features/Features.Users/"]
|
||||||
COPY ["Features/Features.Users.Tests/Features.Users.Tests.csproj", "Features/Features.Users.Tests/"]
|
COPY ["Features/Features.Users.Tests/Features.Users.Tests.csproj", "Features/Features.Users.Tests/"]
|
||||||
COPY ["Infrastructure/Infrastructure.Configuration/Infrastructure.Configuration.csproj", "Infrastructure/Infrastructure.Configuration/"]
|
COPY ["Infrastructure/Infrastructure.Configuration/Infrastructure.Configuration.csproj", "Infrastructure/Infrastructure.Configuration/"]
|
||||||
COPY ["Infrastructure/Infrastructure.Email/Infrastructure.Email.csproj", "Infrastructure/Infrastructure.Email/"]
|
|
||||||
COPY ["Infrastructure/Infrastructure.FileUpload/Infrastructure.FileUpload.csproj", "Infrastructure/Infrastructure.FileUpload/"]
|
|
||||||
COPY ["Infrastructure/Infrastructure.Jwt/Infrastructure.Jwt.csproj", "Infrastructure/Infrastructure.Jwt/"]
|
|
||||||
COPY ["Infrastructure/Infrastructure.PasswordHashing/Infrastructure.PasswordHashing.csproj", "Infrastructure/Infrastructure.PasswordHashing/"]
|
|
||||||
COPY ["Shared/Shared.Application/Shared.Application.csproj", "Shared/Shared.Application/"]
|
COPY ["Shared/Shared.Application/Shared.Application.csproj", "Shared/Shared.Application/"]
|
||||||
COPY ["Shared/Shared.Contracts/Shared.Contracts.csproj", "Shared/Shared.Contracts/"]
|
COPY ["Shared/Shared.Contracts/Shared.Contracts.csproj", "Shared/Shared.Contracts/"]
|
||||||
RUN dotnet restore "Biergarten.API.slnx"
|
RUN dotnet restore "Biergarten.API.slnx"
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ using Features.Users.Controllers;
|
|||||||
using Features.Users.DependencyInjection;
|
using Features.Users.DependencyInjection;
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using FluentValidation.AspNetCore;
|
using FluentValidation.AspNetCore;
|
||||||
using Infrastructure.FileUpload;
|
|
||||||
using Infrastructure.Jwt;
|
|
||||||
using Microsoft.OpenApi.Models;
|
using Microsoft.OpenApi.Models;
|
||||||
using Shared.Application.Behaviors;
|
using Shared.Application.Behaviors;
|
||||||
|
|
||||||
@@ -104,11 +102,7 @@ internal static class ServiceCollectionExtensions
|
|||||||
.AddFeaturesLocations();
|
.AddFeaturesLocations();
|
||||||
|
|
||||||
public IServiceCollection AddCoreInfrastructure() =>
|
public IServiceCollection AddCoreInfrastructure() =>
|
||||||
services
|
services.AddScoped<GlobalExceptionFilter>();
|
||||||
// ITokenInfrastructure is registered here because JwtAuthenticationHandler depends on it directly.
|
|
||||||
.AddScoped<ITokenInfrastructure, JwtInfrastructure>()
|
|
||||||
.AddSingleton<IFileStorageProvider, S3FileStorageProvider>()
|
|
||||||
.AddScoped<GlobalExceptionFilter>();
|
|
||||||
|
|
||||||
public IServiceCollection AddJwtAuthentication()
|
public IServiceCollection AddJwtAuthentication()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -39,7 +39,6 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\API.Core\API.Core.csproj" />
|
<ProjectReference Include="..\API.Core\API.Core.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Email\Infrastructure.Email.csproj" />
|
|
||||||
<ProjectReference Include="..\..\Features\Features.Emails\Features.Emails.csproj" />
|
<ProjectReference Include="..\..\Features\Features.Emails\Features.Emails.csproj" />
|
||||||
<ProjectReference Include="..\..\Features\Features.Locations\Features.Locations.csproj" />
|
<ProjectReference Include="..\..\Features\Features.Locations\Features.Locations.csproj" />
|
||||||
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
||||||
|
|||||||
@@ -24,10 +24,6 @@ COPY ["Features/Features.PhotoUpload.Tests/Features.PhotoUpload.Tests.csproj", "
|
|||||||
COPY ["Features/Features.Users/Features.Users.csproj", "Features/Features.Users/"]
|
COPY ["Features/Features.Users/Features.Users.csproj", "Features/Features.Users/"]
|
||||||
COPY ["Features/Features.Users.Tests/Features.Users.Tests.csproj", "Features/Features.Users.Tests/"]
|
COPY ["Features/Features.Users.Tests/Features.Users.Tests.csproj", "Features/Features.Users.Tests/"]
|
||||||
COPY ["Infrastructure/Infrastructure.Configuration/Infrastructure.Configuration.csproj", "Infrastructure/Infrastructure.Configuration/"]
|
COPY ["Infrastructure/Infrastructure.Configuration/Infrastructure.Configuration.csproj", "Infrastructure/Infrastructure.Configuration/"]
|
||||||
COPY ["Infrastructure/Infrastructure.Email/Infrastructure.Email.csproj", "Infrastructure/Infrastructure.Email/"]
|
|
||||||
COPY ["Infrastructure/Infrastructure.FileUpload/Infrastructure.FileUpload.csproj", "Infrastructure/Infrastructure.FileUpload/"]
|
|
||||||
COPY ["Infrastructure/Infrastructure.Jwt/Infrastructure.Jwt.csproj", "Infrastructure/Infrastructure.Jwt/"]
|
|
||||||
COPY ["Infrastructure/Infrastructure.PasswordHashing/Infrastructure.PasswordHashing.csproj", "Infrastructure/Infrastructure.PasswordHashing/"]
|
|
||||||
COPY ["Shared/Shared.Application/Shared.Application.csproj", "Shared/Shared.Application/"]
|
COPY ["Shared/Shared.Application/Shared.Application.csproj", "Shared/Shared.Application/"]
|
||||||
COPY ["Shared/Shared.Contracts/Shared.Contracts.csproj", "Shared/Shared.Contracts/"]
|
COPY ["Shared/Shared.Contracts/Shared.Contracts.csproj", "Shared/Shared.Contracts/"]
|
||||||
RUN dotnet restore "Biergarten.API.slnx"
|
RUN dotnet restore "Biergarten.API.slnx"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Infrastructure.Email;
|
using Features.Emails.Services;
|
||||||
|
|
||||||
namespace API.Specs.Mocks;
|
namespace API.Specs.Mocks;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using Features.Users.Services;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Infrastructure.Configuration;
|
using Infrastructure.Configuration;
|
||||||
using Infrastructure.Jwt;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Reqnroll;
|
using Reqnroll;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using API.Core;
|
using API.Core;
|
||||||
using API.Specs.Mocks;
|
using API.Specs.Mocks;
|
||||||
using Features.Emails.Services;
|
using Features.Emails.Services;
|
||||||
using Infrastructure.Email;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc.Testing;
|
using Microsoft.AspNetCore.Mvc.Testing;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|||||||
@@ -21,10 +21,6 @@
|
|||||||
</Folder>
|
</Folder>
|
||||||
<Folder Name="/Infrastructure/">
|
<Folder Name="/Infrastructure/">
|
||||||
<Project Path="Infrastructure/Infrastructure.Configuration/Infrastructure.Configuration.csproj" />
|
<Project Path="Infrastructure/Infrastructure.Configuration/Infrastructure.Configuration.csproj" />
|
||||||
<Project Path="Infrastructure/Infrastructure.Email/Infrastructure.Email.csproj" />
|
|
||||||
<Project Path="Infrastructure/Infrastructure.FileUpload/Infrastructure.FileUpload.csproj" />
|
|
||||||
<Project Path="Infrastructure/Infrastructure.Jwt/Infrastructure.Jwt.csproj" />
|
|
||||||
<Project Path="Infrastructure/Infrastructure.PasswordHashing/Infrastructure.PasswordHashing.csproj" />
|
|
||||||
</Folder>
|
</Folder>
|
||||||
<Folder Name="/Features/" />
|
<Folder Name="/Features/" />
|
||||||
<Folder Name="/Features/Users/">
|
<Folder Name="/Features/Users/">
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
<ProjectReference Include="..\..\Features\Features.Users\Features.Users.csproj" />
|
<ProjectReference Include="..\..\Features\Features.Users\Features.Users.csproj" />
|
||||||
<ProjectReference Include="..\..\Features\Features.Locations\Features.Locations.csproj" />
|
<ProjectReference Include="..\..\Features\Features.Locations\Features.Locations.csproj" />
|
||||||
<ProjectReference Include="..\..\Features\Features.PhotoUpload\Features.PhotoUpload.csproj" />
|
<ProjectReference Include="..\..\Features\Features.PhotoUpload\Features.PhotoUpload.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.FileUpload\Infrastructure.FileUpload.csproj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None
|
<None
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ using Features.Locations.Queries.GetCountry;
|
|||||||
using Features.Users.Commands.Profile.UploadAvatar;
|
using Features.Users.Commands.Profile.UploadAvatar;
|
||||||
using Features.Users.DependencyInjection;
|
using Features.Users.DependencyInjection;
|
||||||
using Features.Users.Services;
|
using Features.Users.Services;
|
||||||
using Infrastructure.FileUpload;
|
|
||||||
using MediatR;
|
using MediatR;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
@@ -31,7 +30,6 @@ internal class Program
|
|||||||
.AddFeaturesLocations()
|
.AddFeaturesLocations()
|
||||||
.AddFeaturesUsers()
|
.AddFeaturesUsers()
|
||||||
.AddFeaturesPhotoUpload()
|
.AddFeaturesPhotoUpload()
|
||||||
.AddSingleton<IFileStorageProvider, S3FileStorageProvider>()
|
|
||||||
.AddScoped<ITokenService, NoOpTokenService>()
|
.AddScoped<ITokenService, NoOpTokenService>()
|
||||||
.AddMediatR(cfg =>
|
.AddMediatR(cfg =>
|
||||||
cfg.RegisterServicesFromAssemblyContaining<CreateBreweryCommand>()
|
cfg.RegisterServicesFromAssemblyContaining<CreateBreweryCommand>()
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using Features.Emails.Services;
|
using Features.Emails.Services;
|
||||||
using Features.Emails.Templates.Rendering;
|
using Features.Emails.Templates.Rendering;
|
||||||
using Infrastructure.Email;
|
|
||||||
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="MailKit" Version="4.16.0" />
|
||||||
<PackageReference
|
<PackageReference
|
||||||
Include="Microsoft.Extensions.Configuration.Abstractions"
|
Include="Microsoft.Extensions.Configuration.Abstractions"
|
||||||
Version="10.0.1"
|
Version="10.0.1"
|
||||||
@@ -15,7 +16,6 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Email\Infrastructure.Email.csproj" />
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.Application\Shared.Application.csproj" />
|
<ProjectReference Include="..\..\Shared\Shared.Application\Shared.Application.csproj" />
|
||||||
<ProjectReference Include="..\Features.Emails.Templates\Features.Emails.Templates.csproj" />
|
<ProjectReference Include="..\Features.Emails.Templates\Features.Emails.Templates.csproj" />
|
||||||
<ProjectReference Include="..\Features.Users\Features.Users.csproj" />
|
<ProjectReference Include="..\Features.Users\Features.Users.csproj" />
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using Features.Emails.Templates.Rendering;
|
using Features.Emails.Templates.Rendering;
|
||||||
using Infrastructure.Configuration;
|
using Infrastructure.Configuration;
|
||||||
using Infrastructure.Email;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
|
|
||||||
namespace Features.Emails.Services;
|
namespace Features.Emails.Services;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Infrastructure.Email;
|
namespace Features.Emails.Services;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Service for sending emails.
|
/// Service for sending emails.
|
||||||
@@ -4,7 +4,7 @@ using MailKit.Security;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using MimeKit;
|
using MimeKit;
|
||||||
|
|
||||||
namespace Infrastructure.Email;
|
namespace Features.Emails.Services;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// SMTP email service implementation using MailKit.
|
/// SMTP email service implementation using MailKit.
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using Domain.Entities;
|
using Domain.Entities;
|
||||||
using Features.ImageUploads.Commands.UploadPhoto;
|
using Features.ImageUploads.Commands.UploadPhoto;
|
||||||
using Features.ImageUploads.Repository;
|
using Features.ImageUploads.Repository;
|
||||||
|
using Features.ImageUploads.Services;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Infrastructure.FileUpload;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using Domain.Entities;
|
using Domain.Entities;
|
||||||
using Features.ImageUploads.Repository;
|
using Features.ImageUploads.Repository;
|
||||||
using Infrastructure.FileUpload;
|
using Features.ImageUploads.Services;
|
||||||
using MediatR;
|
using MediatR;
|
||||||
|
|
||||||
namespace Features.ImageUploads.Commands.UploadPhoto;
|
namespace Features.ImageUploads.Commands.UploadPhoto;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Features.ImageUploads.Repository;
|
using Features.ImageUploads.Repository;
|
||||||
|
using Features.ImageUploads.Services;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Features.ImageUploads.DependencyInjection;
|
namespace Features.ImageUploads.DependencyInjection;
|
||||||
@@ -6,11 +7,16 @@ namespace Features.ImageUploads.DependencyInjection;
|
|||||||
/// <summary>Registers the services required by the PhotoUpload feature.</summary>
|
/// <summary>Registers the services required by the PhotoUpload feature.</summary>
|
||||||
public static class FeaturesPhotoUploadServiceCollectionExtensions
|
public static class FeaturesPhotoUploadServiceCollectionExtensions
|
||||||
{
|
{
|
||||||
/// <summary>Registers <see cref="IPhotoUploadRepository" /> and its implementation.</summary>
|
/// <summary>
|
||||||
|
/// Registers <see cref="IPhotoUploadRepository" /> and <see cref="IFileStorageProvider" /> and their
|
||||||
|
/// implementations.
|
||||||
|
/// </summary>
|
||||||
/// <returns><paramref name="services" />, for chaining.</returns>
|
/// <returns><paramref name="services" />, for chaining.</returns>
|
||||||
public static IServiceCollection AddFeaturesPhotoUpload(this IServiceCollection services)
|
public static IServiceCollection AddFeaturesPhotoUpload(this IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddScoped<IPhotoUploadRepository, PhotoUploadRepository>();
|
services
|
||||||
|
.AddScoped<IPhotoUploadRepository, PhotoUploadRepository>()
|
||||||
|
.AddSingleton<IFileStorageProvider, S3FileStorageProvider>();
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,19 @@
|
|||||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="AWSSDK.S3" Version="4.0.102.4" />
|
||||||
|
<PackageReference
|
||||||
|
Include="Microsoft.Extensions.Configuration.Abstractions"
|
||||||
|
Version="10.0.1"
|
||||||
|
/>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\Domain\Domain.Entities\Domain.Entities.csproj" />
|
<ProjectReference Include="..\..\Domain\Domain.Entities\Domain.Entities.csproj" />
|
||||||
<ProjectReference Include="..\..\Domain\Domain.Exceptions\Domain.Exceptions.csproj" />
|
<ProjectReference Include="..\..\Domain\Domain.Exceptions\Domain.Exceptions.csproj" />
|
||||||
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.FileUpload\Infrastructure.FileUpload.csproj" />
|
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
||||||
<ProjectReference Include="..\..\Shared\Shared.Contracts\Shared.Contracts.csproj" />
|
<ProjectReference Include="..\..\Shared\Shared.Contracts\Shared.Contracts.csproj" />
|
||||||
<ProjectReference Include="..\..\Shared\Shared.Application\Shared.Application.csproj" />
|
<ProjectReference Include="..\..\Shared\Shared.Application\Shared.Application.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Infrastructure.FileUpload;
|
namespace Features.ImageUploads.Services;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Service for storing and retrieving uploaded files in S3-compatible object storage.
|
/// Service for storing and retrieving uploaded files in S3-compatible object storage.
|
||||||
@@ -3,7 +3,7 @@ using Amazon.S3.Model;
|
|||||||
using Infrastructure.Configuration;
|
using Infrastructure.Configuration;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
|
|
||||||
namespace Infrastructure.FileUpload;
|
namespace Features.ImageUploads.Services;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// File storage service backed by an S3-compatible object store (e.g. SeaweedFS, AWS S3).
|
/// File storage service backed by an S3-compatible object store (e.g. SeaweedFS, AWS S3).
|
||||||
@@ -6,7 +6,6 @@ using Features.Users.Services;
|
|||||||
using Features.Users.Tests.TestSupport;
|
using Features.Users.Tests.TestSupport;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Infrastructure.Configuration;
|
using Infrastructure.Configuration;
|
||||||
using Infrastructure.Jwt;
|
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ using Features.Users.Services;
|
|||||||
using Features.Users.Tests.TestSupport;
|
using Features.Users.Tests.TestSupport;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Infrastructure.Configuration;
|
using Infrastructure.Configuration;
|
||||||
using Infrastructure.Jwt;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Features.Users.Identity;
|
using Features.Users.Identity;
|
||||||
using Features.Users.Repository;
|
using Features.Users.Repository;
|
||||||
using Features.Users.Services;
|
using Features.Users.Services;
|
||||||
using Infrastructure.PasswordHashing;
|
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
@@ -19,6 +18,7 @@ public static class FeaturesUsersServiceCollectionExtensions
|
|||||||
public static IServiceCollection AddFeaturesUsers(this IServiceCollection services)
|
public static IServiceCollection AddFeaturesUsers(this IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddScoped<ITokenService, TokenService>();
|
services.AddScoped<ITokenService, TokenService>();
|
||||||
|
services.AddScoped<ITokenInfrastructure, JwtInfrastructure>();
|
||||||
services.AddScoped<IPasswordInfrastructure, Argon2Infrastructure>();
|
services.AddScoped<IPasswordInfrastructure, Argon2Infrastructure>();
|
||||||
services.AddScoped<IUserListRepository, UserListRepository>();
|
services.AddScoped<IUserListRepository, UserListRepository>();
|
||||||
services.AddScoped<IUserProfileRepository, UserProfileRepository>();
|
services.AddScoped<IUserProfileRepository, UserProfileRepository>();
|
||||||
|
|||||||
@@ -15,11 +15,15 @@
|
|||||||
<ProjectReference Include="..\..\Domain\Domain.Entities\Domain.Entities.csproj" />
|
<ProjectReference Include="..\..\Domain\Domain.Entities\Domain.Entities.csproj" />
|
||||||
<ProjectReference Include="..\..\Domain\Domain.Exceptions\Domain.Exceptions.csproj" />
|
<ProjectReference Include="..\..\Domain\Domain.Exceptions\Domain.Exceptions.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.Jwt\Infrastructure.Jwt.csproj" />
|
|
||||||
<ProjectReference Include="..\..\Infrastructure\Infrastructure.PasswordHashing\Infrastructure.PasswordHashing.csproj" />
|
|
||||||
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
<ProjectReference Include="..\..\Database\Database.Connection\Database.Connection.csproj" />
|
||||||
<ProjectReference Include="..\Features.PhotoUpload\Features.PhotoUpload.csproj" />
|
<ProjectReference Include="..\Features.PhotoUpload\Features.PhotoUpload.csproj" />
|
||||||
<ProjectReference Include="..\..\Shared\Shared.Contracts\Shared.Contracts.csproj" />
|
<ProjectReference Include="..\..\Shared\Shared.Contracts\Shared.Contracts.csproj" />
|
||||||
<ProjectReference Include="..\..\Shared\Shared.Application\Shared.Application.csproj" />
|
<ProjectReference Include="..\..\Shared\Shared.Application\Shared.Application.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Konscious.Security.Cryptography.Argon2" Version="1.3.1" />
|
||||||
|
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.16.0" />
|
||||||
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.16.0" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using System.Security.Cryptography;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Konscious.Security.Cryptography;
|
using Konscious.Security.Cryptography;
|
||||||
|
|
||||||
namespace Infrastructure.PasswordHashing;
|
namespace Features.Users.Identity;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Hashes and verifies passwords using the Argon2id algorithm via Konscious.Security.Cryptography.
|
/// Hashes and verifies passwords using the Argon2id algorithm via Konscious.Security.Cryptography.
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
using Infrastructure.PasswordHashing;
|
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
namespace Features.Users.Identity;
|
namespace Features.Users.Identity;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Infrastructure.PasswordHashing;
|
namespace Features.Users.Identity;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Service for hashing and verifying user passwords.
|
/// Service for hashing and verifying user passwords.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
|
||||||
namespace Infrastructure.Jwt;
|
namespace Features.Users.Services;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Service for generating and validating JSON Web Tokens (JWTs) used for authentication.
|
/// Service for generating and validating JSON Web Tokens (JWTs) used for authentication.
|
||||||
@@ -5,7 +5,7 @@ using Microsoft.IdentityModel.JsonWebTokens;
|
|||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using JwtRegisteredClaimNames = System.IdentityModel.Tokens.Jwt.JwtRegisteredClaimNames;
|
using JwtRegisteredClaimNames = System.IdentityModel.Tokens.Jwt.JwtRegisteredClaimNames;
|
||||||
|
|
||||||
namespace Infrastructure.Jwt;
|
namespace Features.Users.Services;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Generates and validates HMAC-SHA256 signed JWTs using <see cref="JsonWebTokenHandler" />.
|
/// Generates and validates HMAC-SHA256 signed JWTs using <see cref="JsonWebTokenHandler" />.
|
||||||
@@ -3,7 +3,6 @@ using System.Security.Claims;
|
|||||||
using Domain.Exceptions;
|
using Domain.Exceptions;
|
||||||
using Features.Users.Identity;
|
using Features.Users.Identity;
|
||||||
using Infrastructure.Configuration;
|
using Infrastructure.Configuration;
|
||||||
using Infrastructure.Jwt;
|
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<RootNamespace>Infrastructure.Email</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="MailKit" Version="4.16.0" />
|
|
||||||
<PackageReference
|
|
||||||
Include="Microsoft.Extensions.Configuration.Abstractions"
|
|
||||||
Version="10.0.1"
|
|
||||||
/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<RootNamespace>Infrastructure.FileUpload</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="AWSSDK.S3" Version="4.0.102.4" />
|
|
||||||
<PackageReference
|
|
||||||
Include="Microsoft.Extensions.Configuration.Abstractions"
|
|
||||||
Version="10.0.1"
|
|
||||||
/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Infrastructure.Configuration\Infrastructure.Configuration.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<RootNamespace>Infrastructure.Jwt</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.2.1" />
|
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.2.1" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Domain\Domain.Exceptions\Domain.Exceptions.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<RootNamespace>Infrastructure.PasswordHashing</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Konscious.Security.Cryptography.Argon2" Version="1.3.1" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
Reference in New Issue
Block a user