diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/AddressConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/AddressConfiguration.cs index 5db0dc6..f250e3d 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/AddressConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/AddressConfiguration.cs @@ -1,18 +1,23 @@ -using Domains.ApplicantDomain; +using Domains; +using Domains.ApplicantDomain; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Database.Applicants.Configuration; -public class AddressConfiguration : IEntityTypeConfiguration
+public static class AddressConfiguration where T : class, IEntity { - public void Configure(EntityTypeBuilder
entity) + public static void Configure(OwnedNavigationBuilder entity) { + entity.HasOne(a => a.Country).WithMany().OnDelete(DeleteBehavior.Restrict); + entity.HasOne(a => a.City).WithMany().OnDelete(DeleteBehavior.Restrict); + entity.Property(p => p.Street) .IsUnicode(false) .HasMaxLength(100); + entity.Property(p => p.Building) .IsUnicode(false) .HasMaxLength(10); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/ApplicantConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/ApplicantConfiguration.cs index cc3bca4..cadf620 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/ApplicantConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/ApplicantConfiguration.cs @@ -9,11 +9,13 @@ public class ApplicantConfiguration : IEntityTypeConfiguration public void Configure(EntityTypeBuilder entity) { entity.ToTable("Applicants"); + entity.OwnsOne(p => p.Name, NameConfiguration.Configure); + entity.OwnsOne(p => p.FatherName, NameConfiguration.Configure); + entity.OwnsOne(p => p.MotherName, NameConfiguration.Configure); + entity.OwnsOne(p => p.Passport, PassportConfiguration.Configure); - entity.OwnsOne(p => p.Name); - entity.OwnsOne(p => p.FatherName); - entity.OwnsOne(p => p.MotherName); - entity.OwnsOne(p => p.Passport); + entity.HasOne(a => a.CityOfBirth).WithMany().OnDelete(DeleteBehavior.Restrict); + entity.HasOne(a => a.CountryOfBirth).WithMany().OnDelete(DeleteBehavior.Restrict); entity.Property(p => p.Citizenship) .IsUnicode(false) @@ -23,4 +25,4 @@ public class ApplicantConfiguration : IEntityTypeConfiguration .IsUnicode(false) .HasMaxLength(30); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/NameConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/NameConfiguration.cs index e13842a..2dd6923 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/NameConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/NameConfiguration.cs @@ -1,12 +1,12 @@ -using Domains.ApplicantDomain; -using Microsoft.EntityFrameworkCore; +using Domains; +using Domains.ApplicantDomain; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Database.Applicants.Configuration; -public class NameConfiguration : IEntityTypeConfiguration +public static class NameConfiguration where T : class, IEntity { - public void Configure(EntityTypeBuilder entity) + public static void Configure(OwnedNavigationBuilder entity) { entity.Property(p => p.FirstName) .IsUnicode(false) @@ -20,4 +20,4 @@ public class NameConfiguration : IEntityTypeConfiguration .IsUnicode(false) .HasMaxLength(50); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PassportConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PassportConfiguration.cs index 18ef216..faa35f1 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PassportConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PassportConfiguration.cs @@ -1,12 +1,12 @@ -using Domains.ApplicantDomain; -using Microsoft.EntityFrameworkCore; +using Domains; +using Domains.ApplicantDomain; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Database.Applicants.Configuration; -public class PassportConfiguration : IEntityTypeConfiguration +public static class PassportConfiguration where T : class, IEntity { - public void Configure(EntityTypeBuilder entity) + public static void Configure(OwnedNavigationBuilder entity) { entity.Property(p => p.Number) .IsUnicode(false) @@ -16,4 +16,4 @@ public class PassportConfiguration : IEntityTypeConfiguration .IsUnicode(false) .HasMaxLength(200); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PlaceOfWorkConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PlaceOfWorkConfiguration.cs index 9336d04..f339d9b 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PlaceOfWorkConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PlaceOfWorkConfiguration.cs @@ -8,7 +8,7 @@ public class PlaceOfWorkConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder entity) { - entity.OwnsOne(p => p.Address); + entity.OwnsOne(p => p.Address, AddressConfiguration.Configure); entity.Property(p => p.Name) .IsUnicode(false) @@ -18,4 +18,4 @@ public class PlaceOfWorkConfiguration : IEntityTypeConfiguration .IsUnicode(false) .HasMaxLength(20); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs index 51d0da2..0885dbe 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs @@ -1,4 +1,4 @@ -using ApplicationLayer.Applicants; +using ApplicationLayer.Applicants.NeededServices; using Domains.ApplicantDomain; using Infrastructure.Database.Generic; using Microsoft.EntityFrameworkCore; diff --git a/SchengenVisaApi/Infrastructure/Database/DbContext.cs b/SchengenVisaApi/Infrastructure/Database/DbContext.cs index 2d21103..021bc66 100644 --- a/SchengenVisaApi/Infrastructure/Database/DbContext.cs +++ b/SchengenVisaApi/Infrastructure/Database/DbContext.cs @@ -4,8 +4,7 @@ using Microsoft.EntityFrameworkCore; namespace Infrastructure.Database; -public class DbContext(DbContextOptions opts) - : Microsoft.EntityFrameworkCore.DbContext(opts), IGenericWriter, IGenericReader, IUnitOfWork +public class DbContext(DbContextOptions opts) : Microsoft.EntityFrameworkCore.DbContext(opts), IGenericWriter, IGenericReader, IUnitOfWork { protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -36,4 +35,4 @@ public class DbContext(DbContextOptions opts) { await SaveChangesAsync(cancellationToken); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/GeneralExceptions/EntityNotFoundByIdException.cs b/SchengenVisaApi/Infrastructure/Database/GeneralExceptions/EntityNotFoundByIdException.cs index b494c87..727fc95 100644 --- a/SchengenVisaApi/Infrastructure/Database/GeneralExceptions/EntityNotFoundByIdException.cs +++ b/SchengenVisaApi/Infrastructure/Database/GeneralExceptions/EntityNotFoundByIdException.cs @@ -1,10 +1,9 @@ using Domains; -namespace Infrastructure.Database.GeneralExceptions -{ - /// Exception to throw when entity not found - /// Identifier of entity - /// Type of entity - public class EntityNotFoundByIdException(Guid id) : EntityNotFoundException($"Entity {typeof(T).Name} with id {id} not found.") - where T : class, IEntity; -} +namespace Infrastructure.Database.GeneralExceptions; + +/// Exception to throw when entity not found +/// Identifier of entity +/// Type of entity +public class EntityNotFoundByIdException(Guid id) : EntityNotFoundException($"Entity {typeof(T).Name} with id {id} not found.") + where T : class, IEntity; \ No newline at end of file diff --git a/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs b/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs index 836494d..48d716d 100644 --- a/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs @@ -1,4 +1,4 @@ -using ApplicationLayer.Common; +using ApplicationLayer.GeneralNeededServices; using Domains; using Infrastructure.Database.GeneralExceptions; using Microsoft.EntityFrameworkCore; @@ -17,8 +17,8 @@ public abstract class GenericRepository(IGenericReader reader, IGenericWriter public async Task> GetAllAsync(CancellationToken cancellationToken) => await LoadDomain().ToListAsync(cancellationToken); - /// - public async Task GetOneAsync(Guid id, CancellationToken cancellationToken) + /// + public async Task GetByIdAsync(Guid id, CancellationToken cancellationToken) { var result = await LoadDomain().SingleOrDefaultAsync(a => a.Id == id, cancellationToken); return result ?? throw new EntityNotFoundByIdException(id); @@ -31,7 +31,7 @@ public abstract class GenericRepository(IGenericReader reader, IGenericWriter /// public async Task UpdateAsync(T entity, CancellationToken cancellationToken) { - await GetOneAsync(entity.Id, cancellationToken); + await GetByIdAsync(entity.Id, cancellationToken); writer.Update(entity); } diff --git a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/CitiesRepository.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/CitiesRepository.cs index 7849fae..75a1302 100644 --- a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/CitiesRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/CitiesRepository.cs @@ -1,7 +1,6 @@ -using ApplicationLayer.Locations; +using ApplicationLayer.Locations.NeededServices; using Domains.LocationDomain; using Infrastructure.Database.Generic; -using Infrastructure.Database.Locations.Repositories.Cities.Exceptions; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Database.Locations.Repositories.Cities; @@ -13,12 +12,4 @@ public sealed class CitiesRepository(IGenericReader reader, IGenericWriter write { return base.LoadDomain().Include(c => c.Country); } - - /// - /// city with provided name and country not found - public async Task GetByNameAsync(string name, string countryName, CancellationToken cancellationToken) - { - var result = await LoadDomain().Where(c => c.Name == name && c.Country.Name == countryName).SingleOrDefaultAsync(cancellationToken); - return result ?? throw new CityNotFoundByNameException(name, countryName); - } } diff --git a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/Exceptions/CityNotFoundByNameException.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/Exceptions/CityNotFoundByNameException.cs deleted file mode 100644 index 55ad91d..0000000 --- a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/Exceptions/CityNotFoundByNameException.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Domains.LocationDomain; -using Infrastructure.Database.GeneralExceptions; - -namespace Infrastructure.Database.Locations.Repositories.Cities.Exceptions -{ - /// Exception to throw when city cannot be found by its name and its country name - /// Name of the city - /// name of the city's country - public class CityNotFoundByNameException(string name, string countryName) - : EntityNotFoundException($"{name} with country {countryName} not found."); -} diff --git a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/CountriesRepository.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/CountriesRepository.cs index 7c6159d..b27908d 100644 --- a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/CountriesRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/CountriesRepository.cs @@ -1,4 +1,4 @@ -using ApplicationLayer.Locations; +using ApplicationLayer.Locations.NeededServices; using Domains.LocationDomain; using Infrastructure.Database.Generic; using Microsoft.EntityFrameworkCore; diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisaConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisaConfiguration.cs index 41cfb70..4741ddc 100644 --- a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisaConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisaConfiguration.cs @@ -1,15 +1,15 @@ -using Domains.VisaApplicationDomain; -using Microsoft.EntityFrameworkCore; +using Domains; +using Domains.VisaApplicationDomain; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Database.VisaApplications.Configuration; -public class PastVisaConfiguration : IEntityTypeConfiguration +public static class PastVisaConfiguration where T : class, IEntity { - public void Configure(EntityTypeBuilder entity) + public static void Configure(OwnedNavigationBuilder entity) { entity.Property(p => p.Name) .IsUnicode(false) .HasMaxLength(70); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisitConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisitConfiguration.cs new file mode 100644 index 0000000..9956633 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisitConfiguration.cs @@ -0,0 +1,15 @@ +using Domains; +using Domains.VisaApplicationDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.VisaApplications.Configuration +{ + public static class PastVisitConfiguration where T : class, IEntity + { + public static void Configure(OwnedNavigationBuilder entity) + { + entity.HasOne(p => p.DestinationCountry).WithMany().OnDelete(DeleteBehavior.Restrict); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PermissionToDestCountryConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PermissionToDestCountryConfiguration.cs index 9f02124..11df404 100644 --- a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PermissionToDestCountryConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PermissionToDestCountryConfiguration.cs @@ -1,15 +1,15 @@ -using Domains.VisaApplicationDomain; -using Microsoft.EntityFrameworkCore; +using Domains; +using Domains.VisaApplicationDomain; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Database.VisaApplications.Configuration; -public class PermissionToDestCountryConfiguration : IEntityTypeConfiguration +public static class PermissionToDestCountryConfiguration where T : class, IEntity { - public void Configure(EntityTypeBuilder entity) + public static void Configure(OwnedNavigationBuilder entity) { entity.Property(p => p.Issuer) .IsUnicode(false) .HasMaxLength(200); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/ReentryPermitConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/ReentryPermitConfiguration.cs index 8e834b5..7bc1ba6 100644 --- a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/ReentryPermitConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/ReentryPermitConfiguration.cs @@ -1,15 +1,15 @@ -using Domains.VisaApplicationDomain; -using Microsoft.EntityFrameworkCore; +using Domains; +using Domains.VisaApplicationDomain; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Database.VisaApplications.Configuration; -public class ReentryPermitConfiguration : IEntityTypeConfiguration +public static class ReentryPermitConfiguration where T : class, IEntity { - public void Configure(EntityTypeBuilder entity) + public static void Configure(OwnedNavigationBuilder entity) { entity.Property(p => p.Number) .IsUnicode(false) .HasMaxLength(25); } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/VisaApplicationConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/VisaApplicationConfiguration.cs index 16d23d2..efadf98 100644 --- a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/VisaApplicationConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/VisaApplicationConfiguration.cs @@ -10,14 +10,16 @@ public class VisaApplicationConfiguration : IEntityTypeConfiguration va.ReentryPermit, ReentryPermitConfiguration.Configure); + entity.OwnsOne(va => va.PermissionToDestCountry, PermissionToDestCountryConfiguration.Configure); + entity.OwnsMany(va => va.PastVisits, PastVisitConfiguration.Configure).ToTable("PastVisits"); + entity.OwnsMany(va => va.PastVisas).ToTable("PastVisas"); + + entity.HasOne(va => va.DestinationCountry).WithMany().OnDelete(DeleteBehavior.Restrict); + entity.HasOne(va => va.Applicant) - .WithMany(a => a.VisaApplications) + .WithMany() .HasForeignKey(va => va.ApplicantId) .IsRequired(); - - entity.OwnsOne(p => p.ReentryPermit); - entity.OwnsOne(p => p.PermissionToDestCountry); - entity.OwnsMany(p => p.PastVisits).ToTable("PastVisits"); - entity.OwnsMany(p => p.PastVisas).ToTable("PastVisas"); } } diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs index f23217b..e213453 100644 --- a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs @@ -1,4 +1,4 @@ -using ApplicationLayer.VisaApplications; +using ApplicationLayer.VisaApplications.NeededServices; using Domains.VisaApplicationDomain; using Infrastructure.Database.Generic; using Microsoft.EntityFrameworkCore;