From b424f0561e9cc8d8e32002a21badc3ac231e8e3a Mon Sep 17 00:00:00 2001 From: prtsie Date: Tue, 13 Aug 2024 22:02:50 +0300 Subject: [PATCH] Added interfaces to read and write data in DB and added DbContext implementing these --- .../Applicant/ApplicantConfiguration.cs | 26 +++++++++++ .../Applicant/NameConfiguration.cs | 24 ++++++++++ .../Applicant/PassportConfiguration.cs | 20 +++++++++ .../Applicant/PlaceOfWorkConfiguration.cs | 22 +++++++++ .../Common/AddressConfiguration.cs | 19 ++++++++ .../Configuration/Common/CityConfiguration.cs | 16 +++++++ .../Common/CountryConfiguration.cs | 16 +++++++ .../VisaApplication/PastVisaConfiguration.cs | 16 +++++++ .../PermissionToDestCountryConfiguration.cs | 16 +++++++ .../ReentryPermitConfiguration.cs | 16 +++++++ .../VisaApplicationConfiguration.cs | 17 +++++++ .../Infrastructure/Database/DbContext.cs | 45 +++++++++++++++++++ .../Infrastructure/Database/IReader.cs | 18 ++++++++ .../Infrastructure/Database/IUnitOfWork.cs | 9 ++++ .../Infrastructure/Database/IWriter.cs | 25 +++++++++++ .../Infrastructure/Infrastructure.csproj | 9 ++++ 16 files changed, 314 insertions(+) create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/ApplicantConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/NameConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PassportConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PlaceOfWorkConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/Common/AddressConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/Common/CityConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/Common/CountryConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PastVisaConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PermissionToDestCountryConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/ReentryPermitConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/VisaApplicationConfiguration.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/DbContext.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/IReader.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/IUnitOfWork.cs create mode 100644 SchengenVisaApi/Infrastructure/Database/IWriter.cs diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/ApplicantConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/ApplicantConfiguration.cs new file mode 100644 index 0000000..aa841e7 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/ApplicantConfiguration.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.Applicant +{ + public class ApplicantConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder 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); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/NameConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/NameConfiguration.cs new file mode 100644 index 0000000..4d21e5a --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/NameConfiguration.cs @@ -0,0 +1,24 @@ +using Domains.ApplicantDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.Applicant +{ + public class NameConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder 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); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PassportConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PassportConfiguration.cs new file mode 100644 index 0000000..e7a4df6 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PassportConfiguration.cs @@ -0,0 +1,20 @@ +using Domains.ApplicantDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.Applicant +{ + public class PassportConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(p => p.Number) + .IsUnicode(false) + .HasMaxLength(20); + + entity.Property(p => p.Issuer) + .IsUnicode(false) + .HasMaxLength(200); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PlaceOfWorkConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PlaceOfWorkConfiguration.cs new file mode 100644 index 0000000..49b3259 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PlaceOfWorkConfiguration.cs @@ -0,0 +1,22 @@ +using Domains.ApplicantDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.Applicant +{ + public class PlaceOfWorkConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.OwnsOne(p => p.Address); + + entity.Property(p => p.Name) + .IsUnicode(false) + .HasMaxLength(200); + + entity.Property(p => p.PhoneNum) + .IsUnicode(false) + .HasMaxLength(20); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/AddressConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/Common/AddressConfiguration.cs new file mode 100644 index 0000000..805ce78 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/Common/AddressConfiguration.cs @@ -0,0 +1,19 @@ +using Domains.Common; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.Common +{ + public class AddressConfiguration : IEntityTypeConfiguration
+ { + public void Configure(EntityTypeBuilder
entity) + { + entity.Property(p => p.Street) + .IsUnicode(false) + .HasMaxLength(100); + entity.Property(p => p.Building) + .IsUnicode(false) + .HasMaxLength(10); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CityConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CityConfiguration.cs new file mode 100644 index 0000000..f4b872c --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CityConfiguration.cs @@ -0,0 +1,16 @@ +using Domains.Common; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.Common +{ + public class CityConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(p => p.Name) + .IsUnicode(false) + .HasMaxLength(70); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CountryConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CountryConfiguration.cs new file mode 100644 index 0000000..9956d57 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CountryConfiguration.cs @@ -0,0 +1,16 @@ +using Domains.Common; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.Common +{ + public class CountryConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(p => p.Name) + .IsUnicode(false) + .HasMaxLength(70); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PastVisaConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PastVisaConfiguration.cs new file mode 100644 index 0000000..41deeb2 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PastVisaConfiguration.cs @@ -0,0 +1,16 @@ +using Domains.VisaApplicationDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.VisaApplication +{ + public class PastVisaConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(p => p.Name) + .IsUnicode(false) + .HasMaxLength(70); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PermissionToDestCountryConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PermissionToDestCountryConfiguration.cs new file mode 100644 index 0000000..c7c6ed3 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PermissionToDestCountryConfiguration.cs @@ -0,0 +1,16 @@ +using Domains.VisaApplicationDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.VisaApplication +{ + public class PermissionToDestCountryConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(p => p.Issuer) + .IsUnicode(false) + .HasMaxLength(200); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/ReentryPermitConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/ReentryPermitConfiguration.cs new file mode 100644 index 0000000..a3c0c3a --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/ReentryPermitConfiguration.cs @@ -0,0 +1,16 @@ +using Domains.VisaApplicationDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.VisaApplication +{ + public class ReentryPermitConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(p => p.Number) + .IsUnicode(false) + .HasMaxLength(25); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/VisaApplicationConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/VisaApplicationConfiguration.cs new file mode 100644 index 0000000..2ae43d2 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/VisaApplicationConfiguration.cs @@ -0,0 +1,17 @@ +using Domains.VisaApplicationDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.Configuration.VisaApplication +{ + public class VisaApplicationConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.ToTable("VisaApplications"); + + entity.OwnsOne(p => p.ReentryPermit); + entity.OwnsOne(p => p.PermissionToDestCountry); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/DbContext.cs b/SchengenVisaApi/Infrastructure/Database/DbContext.cs new file mode 100644 index 0000000..eb23719 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/DbContext.cs @@ -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 entity, CancellationToken cancellationToken) + { + await AddAsync(entity, cancellationToken); + } + + void IWriter.Update(T entity) + { + Update(entity); + } + + void IWriter.Remove(T entity) + { + Remove(entity); + } + + IQueryable IReader.GetAll() + { + return Set(); + } + + async Task IReader.GetOneAsync(Guid id, CancellationToken cancellationToken) + where T : class + { + return await Set().FindAsync([id], cancellationToken: cancellationToken); + } + + async Task IUnitOfWork.SaveAsync(CancellationToken cancellationToken) + { + await SaveChangesAsync(cancellationToken); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/IReader.cs b/SchengenVisaApi/Infrastructure/Database/IReader.cs new file mode 100644 index 0000000..2d844ee --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/IReader.cs @@ -0,0 +1,18 @@ +using Domains; + +namespace Infrastructure.Database +{ + public interface IReader + { + /// Get all entities of type stored in storage + /// Entity type to seek in storage + IQueryable GetAll() where T : class, IEntity; + + /// Get one entity with specific from storage + /// Identifier of entity + /// Cancellation Token + /// Type of entity + /// Entity or null if not found + Task GetOneAsync(Guid id, CancellationToken cancellationToken) where T : class, IEntity; + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/IUnitOfWork.cs b/SchengenVisaApi/Infrastructure/Database/IUnitOfWork.cs new file mode 100644 index 0000000..2b068e8 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/IUnitOfWork.cs @@ -0,0 +1,9 @@ +namespace Infrastructure.Database +{ + public interface IUnitOfWork + { + /// Save changes in data storage + /// Cancellation Token + Task SaveAsync(CancellationToken cancellationToken); + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/IWriter.cs b/SchengenVisaApi/Infrastructure/Database/IWriter.cs new file mode 100644 index 0000000..2251c01 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/IWriter.cs @@ -0,0 +1,25 @@ +using Domains; + +namespace Infrastructure.Database +{ + /// Writes data to data storage + /// should be used to save changes + public interface IWriter + { + /// Add to data storage + /// Entity to add + /// Cancellation Token + /// Entity type + Task AddAsync(T entity, CancellationToken cancellationToken) where T : class, IEntity; + + /// Update in data storage + /// Entity to update + /// Entity type + void Update(T entity) where T : class, IEntity; + + /// Remove from data storage + /// Entity to remove + /// Entity type + void Remove(T entity) where T : class, IEntity; + } +} diff --git a/SchengenVisaApi/Infrastructure/Infrastructure.csproj b/SchengenVisaApi/Infrastructure/Infrastructure.csproj index 72db325..438798e 100644 --- a/SchengenVisaApi/Infrastructure/Infrastructure.csproj +++ b/SchengenVisaApi/Infrastructure/Infrastructure.csproj @@ -10,4 +10,13 @@ + + + + + + + + +