Added interfaces to read and write data in DB and added DbContext implementing these

This commit is contained in:
2024-08-13 22:02:50 +03:00
parent 3c17580941
commit b424f0561e
16 changed files with 314 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.Applicant
{
public class ApplicantConfiguration : IEntityTypeConfiguration<Domains.ApplicantDomain.Applicant>
{
public void Configure(EntityTypeBuilder<Domains.ApplicantDomain.Applicant> entity)
{
entity.ToTable("Applicants");
entity.OwnsOne(p => p.Name);
entity.OwnsOne(p => p.FatherName);
entity.OwnsOne(p => p.MotherName);
entity.OwnsOne(p => p.Passport);
entity.Property(p => p.Citizenship)
.IsUnicode(false)
.HasMaxLength(30);
entity.Property(p => p.CitizenshipByBirth)
.IsUnicode(false)
.HasMaxLength(30);
}
}
}

View File

@@ -0,0 +1,24 @@
using Domains.ApplicantDomain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.Applicant
{
public class NameConfiguration : IEntityTypeConfiguration<Name>
{
public void Configure(EntityTypeBuilder<Name> entity)
{
entity.Property(p => p.FirstName)
.IsUnicode(false)
.HasMaxLength(50);
entity.Property(p => p.Surname)
.IsUnicode(false)
.HasMaxLength(50);
entity.Property(p => p.Patronymic)
.IsUnicode(false)
.HasMaxLength(50);
}
}
}

View File

@@ -0,0 +1,20 @@
using Domains.ApplicantDomain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.Applicant
{
public class PassportConfiguration : IEntityTypeConfiguration<Passport>
{
public void Configure(EntityTypeBuilder<Passport> entity)
{
entity.Property(p => p.Number)
.IsUnicode(false)
.HasMaxLength(20);
entity.Property(p => p.Issuer)
.IsUnicode(false)
.HasMaxLength(200);
}
}
}

View File

@@ -0,0 +1,22 @@
using Domains.ApplicantDomain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.Applicant
{
public class PlaceOfWorkConfiguration : IEntityTypeConfiguration<PlaceOfWork>
{
public void Configure(EntityTypeBuilder<PlaceOfWork> entity)
{
entity.OwnsOne(p => p.Address);
entity.Property(p => p.Name)
.IsUnicode(false)
.HasMaxLength(200);
entity.Property(p => p.PhoneNum)
.IsUnicode(false)
.HasMaxLength(20);
}
}
}

View File

@@ -0,0 +1,19 @@
using Domains.Common;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.Common
{
public class AddressConfiguration : IEntityTypeConfiguration<Address>
{
public void Configure(EntityTypeBuilder<Address> entity)
{
entity.Property(p => p.Street)
.IsUnicode(false)
.HasMaxLength(100);
entity.Property(p => p.Building)
.IsUnicode(false)
.HasMaxLength(10);
}
}
}

View File

@@ -0,0 +1,16 @@
using Domains.Common;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.Common
{
public class CityConfiguration : IEntityTypeConfiguration<City>
{
public void Configure(EntityTypeBuilder<City> entity)
{
entity.Property(p => p.Name)
.IsUnicode(false)
.HasMaxLength(70);
}
}
}

View File

@@ -0,0 +1,16 @@
using Domains.Common;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.Common
{
public class CountryConfiguration : IEntityTypeConfiguration<Country>
{
public void Configure(EntityTypeBuilder<Country> entity)
{
entity.Property(p => p.Name)
.IsUnicode(false)
.HasMaxLength(70);
}
}
}

View File

@@ -0,0 +1,16 @@
using Domains.VisaApplicationDomain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.VisaApplication
{
public class PastVisaConfiguration : IEntityTypeConfiguration<PastVisa>
{
public void Configure(EntityTypeBuilder<PastVisa> entity)
{
entity.Property(p => p.Name)
.IsUnicode(false)
.HasMaxLength(70);
}
}
}

View File

@@ -0,0 +1,16 @@
using Domains.VisaApplicationDomain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.VisaApplication
{
public class PermissionToDestCountryConfiguration : IEntityTypeConfiguration<PermissionToDestCountry>
{
public void Configure(EntityTypeBuilder<PermissionToDestCountry> entity)
{
entity.Property(p => p.Issuer)
.IsUnicode(false)
.HasMaxLength(200);
}
}
}

View File

@@ -0,0 +1,16 @@
using Domains.VisaApplicationDomain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.VisaApplication
{
public class ReentryPermitConfiguration : IEntityTypeConfiguration<ReentryPermit>
{
public void Configure(EntityTypeBuilder<ReentryPermit> entity)
{
entity.Property(p => p.Number)
.IsUnicode(false)
.HasMaxLength(25);
}
}
}

View File

@@ -0,0 +1,17 @@
using Domains.VisaApplicationDomain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Configuration.VisaApplication
{
public class VisaApplicationConfiguration : IEntityTypeConfiguration<Domains.VisaApplicationDomain.VisaApplication>
{
public void Configure(EntityTypeBuilder<Domains.VisaApplicationDomain.VisaApplication> entity)
{
entity.ToTable("VisaApplications");
entity.OwnsOne(p => p.ReentryPermit);
entity.OwnsOne(p => p.PermissionToDestCountry);
}
}
}

View File

@@ -0,0 +1,45 @@
using System.Reflection;
using Domains;
using Microsoft.EntityFrameworkCore;
namespace Infrastructure.Database
{
public class DbContext : Microsoft.EntityFrameworkCore.DbContext, IWriter, IReader, IUnitOfWork
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
}
async Task IWriter.AddAsync<T>(T entity, CancellationToken cancellationToken)
{
await AddAsync(entity, cancellationToken);
}
void IWriter.Update<T>(T entity)
{
Update(entity);
}
void IWriter.Remove<T>(T entity)
{
Remove(entity);
}
IQueryable<T> IReader.GetAll<T>()
{
return Set<T>();
}
async Task<T?> IReader.GetOneAsync<T>(Guid id, CancellationToken cancellationToken)
where T : class
{
return await Set<T>().FindAsync([id], cancellationToken: cancellationToken);
}
async Task IUnitOfWork.SaveAsync(CancellationToken cancellationToken)
{
await SaveChangesAsync(cancellationToken);
}
}
}

View File

@@ -0,0 +1,18 @@
using Domains;
namespace Infrastructure.Database
{
public interface IReader
{
/// Get all entities of type <typeparamref name="T"/> stored in storage
/// <typeparam name="T">Entity type to seek in storage</typeparam>
IQueryable<T> GetAll<T>() where T : class, IEntity;
/// Get one entity with specific <paramref name="id"/> from storage
/// <param name="id">Identifier of entity</param>
/// <param name="cancellationToken">Cancellation Token</param>
/// <typeparam name="T">Type of entity</typeparam>
/// <returns>Entity or null if not found</returns>
Task<T?> GetOneAsync<T>(Guid id, CancellationToken cancellationToken) where T : class, IEntity;
}
}

View File

@@ -0,0 +1,9 @@
namespace Infrastructure.Database
{
public interface IUnitOfWork
{
/// Save changes in data storage
/// <param name="cancellationToken">Cancellation Token</param>
Task SaveAsync(CancellationToken cancellationToken);
}
}

View File

@@ -0,0 +1,25 @@
using Domains;
namespace Infrastructure.Database
{
/// Writes data to data storage
/// <remarks><see cref="IUnitOfWork"/> should be used to save changes</remarks>
public interface IWriter
{
/// Add <paramref name="entity"/> to data storage
/// <param name="entity">Entity to add</param>
/// <param name="cancellationToken">Cancellation Token</param>
/// <typeparam name="T">Entity type</typeparam>
Task AddAsync<T>(T entity, CancellationToken cancellationToken) where T : class, IEntity;
/// Update <paramref name="entity"/> in data storage
/// <param name="entity">Entity to update</param>
/// <typeparam name="T">Entity type</typeparam>
void Update<T>(T entity) where T : class, IEntity;
/// Remove <paramref name="entity"/> from data storage
/// <param name="entity">Entity to remove</param>
/// <typeparam name="T">Entity type</typeparam>
void Remove<T>(T entity) where T : class, IEntity;
}
}

View File

@@ -10,4 +10,13 @@
<ProjectReference Include="..\ApplicationLayer\ApplicationLayer.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0-preview.7.24405.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.0-preview.7.24405.3" />
</ItemGroup>
<ItemGroup>
<Folder Include="Database\Repositories\" />
</ItemGroup>
</Project>