diff --git a/SchengenVisaApi/Domains/Common/Address.cs b/SchengenVisaApi/Domains/ApplicantDomain/Address.cs similarity index 86% rename from SchengenVisaApi/Domains/Common/Address.cs rename to SchengenVisaApi/Domains/ApplicantDomain/Address.cs index 1e6bca5..d319e32 100644 --- a/SchengenVisaApi/Domains/Common/Address.cs +++ b/SchengenVisaApi/Domains/ApplicantDomain/Address.cs @@ -1,4 +1,6 @@ -namespace Domains.Common +using Domains.LocationDomain; + +namespace Domains.ApplicantDomain { /// Model of address /// Owned diff --git a/SchengenVisaApi/Domains/ApplicantDomain/Applicant.cs b/SchengenVisaApi/Domains/ApplicantDomain/Applicant.cs index c174ac6..cc45700 100644 --- a/SchengenVisaApi/Domains/ApplicantDomain/Applicant.cs +++ b/SchengenVisaApi/Domains/ApplicantDomain/Applicant.cs @@ -1,4 +1,5 @@ -using Domains.Common; +using Domains.LocationDomain; +using Domains.VisaApplicationDomain; namespace Domains.ApplicantDomain { @@ -49,5 +50,8 @@ namespace Domains.ApplicantDomain /// Is a non-resident public bool IsNonResident { get; set; } + + /// List of 's applications + public List VisaApplications { get; set; } = null!; } } diff --git a/SchengenVisaApi/Domains/ApplicantDomain/PlaceOfWork.cs b/SchengenVisaApi/Domains/ApplicantDomain/PlaceOfWork.cs index bb1521c..4655bf6 100644 --- a/SchengenVisaApi/Domains/ApplicantDomain/PlaceOfWork.cs +++ b/SchengenVisaApi/Domains/ApplicantDomain/PlaceOfWork.cs @@ -1,6 +1,4 @@ -using Domains.Common; - -namespace Domains.ApplicantDomain +namespace Domains.ApplicantDomain { public class PlaceOfWork : IEntity { @@ -10,7 +8,7 @@ namespace Domains.ApplicantDomain /// Name of hirer public string Name { get; set; } = null!; - /// of hirer + /// of hirer public Address Address { get; set; } = null!; /// Phone number of hirer diff --git a/SchengenVisaApi/Domains/IEntity.cs b/SchengenVisaApi/Domains/IEntity.cs index bc6d213..0007e83 100644 --- a/SchengenVisaApi/Domains/IEntity.cs +++ b/SchengenVisaApi/Domains/IEntity.cs @@ -1,5 +1,8 @@ namespace Domains { /// Interface that every entity should inherit from - public interface IEntity { } + public interface IEntity + { + public Guid Id { get; } + } } diff --git a/SchengenVisaApi/Domains/Common/City.cs b/SchengenVisaApi/Domains/LocationDomain/City.cs similarity index 77% rename from SchengenVisaApi/Domains/Common/City.cs rename to SchengenVisaApi/Domains/LocationDomain/City.cs index 7840e57..1aa4830 100644 --- a/SchengenVisaApi/Domains/Common/City.cs +++ b/SchengenVisaApi/Domains/LocationDomain/City.cs @@ -1,4 +1,4 @@ -namespace Domains.Common +namespace Domains.LocationDomain { /// Model of a city public class City : IEntity @@ -9,7 +9,7 @@ /// Name of the city public string Name { get; set; } = null!; - /// in which the city is located + /// in which the city is located public Country Country { get; set; } = null!; } } diff --git a/SchengenVisaApi/Domains/Common/Country.cs b/SchengenVisaApi/Domains/LocationDomain/Country.cs similarity index 93% rename from SchengenVisaApi/Domains/Common/Country.cs rename to SchengenVisaApi/Domains/LocationDomain/Country.cs index a871e5f..06a21a3 100644 --- a/SchengenVisaApi/Domains/Common/Country.cs +++ b/SchengenVisaApi/Domains/LocationDomain/Country.cs @@ -1,4 +1,4 @@ -namespace Domains.Common +namespace Domains.LocationDomain { /// Model of a country public class Country : IEntity diff --git a/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs b/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs index 401638a..1108852 100644 --- a/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs +++ b/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs @@ -1,5 +1,6 @@ -using Domains.ApplicantDomain; -using Domains.Common; +using System.ComponentModel.DataAnnotations.Schema; +using Domains.ApplicantDomain; +using Domains.LocationDomain; namespace Domains.VisaApplicationDomain { @@ -9,8 +10,11 @@ namespace Domains.VisaApplicationDomain /// Unique identifier of public Guid Id { get; private set; } = Guid.NewGuid(); + /// Identifier of the + public Guid ApplicantId { get; set; } + /// Applicant of - public Applicant Applicant { get; set; } = null!; + public Applicant Applicant { get; set; } /// /// always null if is not a non-resident diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/AddressConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/AddressConfiguration.cs similarity index 84% rename from SchengenVisaApi/Infrastructure/Database/Configuration/Common/AddressConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/AddressConfiguration.cs index 805ce78..868e7dc 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/AddressConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/AddressConfiguration.cs @@ -1,8 +1,8 @@ -using Domains.Common; +using Domains.ApplicantDomain; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.Common +namespace Infrastructure.Database.Applicants.Configuration { public class AddressConfiguration : IEntityTypeConfiguration
{ diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/ApplicantConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/ApplicantConfiguration.cs similarity index 73% rename from SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/ApplicantConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/ApplicantConfiguration.cs index aa841e7..025c6f3 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/ApplicantConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/ApplicantConfiguration.cs @@ -1,11 +1,12 @@ -using Microsoft.EntityFrameworkCore; +using Domains.ApplicantDomain; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.Applicant +namespace Infrastructure.Database.Applicants.Configuration { - public class ApplicantConfiguration : IEntityTypeConfiguration + public class ApplicantConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder entity) + public void Configure(EntityTypeBuilder entity) { entity.ToTable("Applicants"); diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/NameConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/NameConfiguration.cs similarity index 91% rename from SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/NameConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/NameConfiguration.cs index 4d21e5a..e194101 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/NameConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/NameConfiguration.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.Applicant +namespace Infrastructure.Database.Applicants.Configuration { public class NameConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PassportConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PassportConfiguration.cs similarity index 90% rename from SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PassportConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PassportConfiguration.cs index e7a4df6..e9a1a6e 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PassportConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PassportConfiguration.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.Applicant +namespace Infrastructure.Database.Applicants.Configuration { public class PassportConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PlaceOfWorkConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PlaceOfWorkConfiguration.cs similarity index 90% rename from SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PlaceOfWorkConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PlaceOfWorkConfiguration.cs index 49b3259..6203a4c 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/Applicant/PlaceOfWorkConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Configuration/PlaceOfWorkConfiguration.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.Applicant +namespace Infrastructure.Database.Applicants.Configuration { public class PlaceOfWorkConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs new file mode 100644 index 0000000..a1e5170 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs @@ -0,0 +1,18 @@ +using Domains.ApplicantDomain; +using Infrastructure.Database.Generic; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Database.Applicants.Repositories +{ + public class ApplicantsRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) + : GenericRepository(writer, unitOfWork), IApplicantsRepository + { + protected override IQueryable LoadDomain() + { + return reader.GetAll() + .Include(a => a.CountryOfBirth) + .Include(a => a.CityOfBirth) + .Include(a => a.PlaceOfWork); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/IApplicantsRepository.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/IApplicantsRepository.cs new file mode 100644 index 0000000..fe1280c --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/IApplicantsRepository.cs @@ -0,0 +1,7 @@ +using Domains.ApplicantDomain; +using Infrastructure.Database.Generic; + +namespace Infrastructure.Database.Applicants.Repositories +{ + public interface IApplicantsRepository : IGenericRepository { } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/VisaApplicationConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/VisaApplicationConfiguration.cs deleted file mode 100644 index bb9f942..0000000 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/VisaApplicationConfiguration.cs +++ /dev/null @@ -1,16 +0,0 @@ -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 index a5dca34..e3c09f6 100644 --- a/SchengenVisaApi/Infrastructure/Database/DbContext.cs +++ b/SchengenVisaApi/Infrastructure/Database/DbContext.cs @@ -1,41 +1,36 @@ using System.Reflection; +using Infrastructure.Database.Generic; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Database { - public class DbContext : Microsoft.EntityFrameworkCore.DbContext, IWriter, IReader, IUnitOfWork + public class DbContext : Microsoft.EntityFrameworkCore.DbContext, IGenericWriter, IGenericReader, IUnitOfWork { protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); } - async Task IWriter.AddAsync(T entity, CancellationToken cancellationToken) + async Task IGenericWriter.AddAsync(T entity, CancellationToken cancellationToken) { await AddAsync(entity, cancellationToken); } - void IWriter.Update(T entity) + void IGenericWriter.Update(T entity) { Update(entity); } - void IWriter.Remove(T entity) + void IGenericWriter.Remove(T entity) { Remove(entity); } - IQueryable IReader.GetAll() + IQueryable IGenericReader.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/GeneralExceptions/EntityNotFoundException.cs b/SchengenVisaApi/Infrastructure/Database/GeneralExceptions/EntityNotFoundException.cs new file mode 100644 index 0000000..79e5a5a --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/GeneralExceptions/EntityNotFoundException.cs @@ -0,0 +1,4 @@ +namespace Infrastructure.Database.GeneralExceptions +{ + public class EntityNotFoundException(Guid id) : Exception($"Entity {typeof(T).Name} with id '{id}' not found"); +} diff --git a/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs b/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs new file mode 100644 index 0000000..306dbde --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs @@ -0,0 +1,38 @@ +using Domains; +using Infrastructure.Database.GeneralExceptions; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Database.Generic +{ + public abstract class GenericRepository(IGenericWriter writer, IUnitOfWork unitOfWork) : IGenericRepository + where T : class, IEntity + { + public async Task> GetAllAsync(CancellationToken cancellationToken) + => await LoadDomain().ToListAsync(cancellationToken); + + public async Task GetOneAsync(Guid id, CancellationToken cancellationToken) + { + var result = await LoadDomain().SingleOrDefaultAsync(a => a.Id == id, cancellationToken); + return result ?? throw new EntityNotFoundException(id); + } + + public async Task AddAsync(T entity, CancellationToken cancellationToken) + => await writer.AddAsync(entity, cancellationToken); + + public async Task UpdateAsync(T entity, CancellationToken cancellationToken) + { + await GetOneAsync(entity.Id, cancellationToken); + writer.Update(entity); + } + + public void Remove(T entity) + { + writer.Remove(entity); + } + + public async Task SaveAsync(CancellationToken cancellationToken) + => await unitOfWork.SaveAsync(cancellationToken); + + protected abstract IQueryable LoadDomain(); + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Generic/IGenericReader.cs b/SchengenVisaApi/Infrastructure/Database/Generic/IGenericReader.cs new file mode 100644 index 0000000..ecdc94a --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Generic/IGenericReader.cs @@ -0,0 +1,11 @@ +using Domains; + +namespace Infrastructure.Database.Generic +{ + public interface IGenericReader + { + /// Get all entities of type stored in storage + /// Entity type to seek in storage + IQueryable GetAll() where T : class, IEntity; + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Generic/IGenericRepository.cs b/SchengenVisaApi/Infrastructure/Database/Generic/IGenericRepository.cs new file mode 100644 index 0000000..e7ec271 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Generic/IGenericRepository.cs @@ -0,0 +1,19 @@ +using Domains; + +namespace Infrastructure.Database.Generic +{ + public interface IGenericRepository where T : class, IEntity + { + Task> GetAllAsync(CancellationToken cancellationToken); + + Task GetOneAsync(Guid id, CancellationToken cancellationToken); + + Task AddAsync(T entity, CancellationToken cancellationToken); + + Task UpdateAsync(T entity, CancellationToken cancellationToken); + + void Remove(T entity); + + Task SaveAsync(CancellationToken cancellationToken); + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/IWriter.cs b/SchengenVisaApi/Infrastructure/Database/Generic/IGenericWriter.cs similarity index 92% rename from SchengenVisaApi/Infrastructure/Database/IWriter.cs rename to SchengenVisaApi/Infrastructure/Database/Generic/IGenericWriter.cs index 2251c01..c53fefe 100644 --- a/SchengenVisaApi/Infrastructure/Database/IWriter.cs +++ b/SchengenVisaApi/Infrastructure/Database/Generic/IGenericWriter.cs @@ -1,10 +1,10 @@ using Domains; -namespace Infrastructure.Database +namespace Infrastructure.Database.Generic { /// Writes data to data storage /// should be used to save changes - public interface IWriter + public interface IGenericWriter { /// Add to data storage /// Entity to add diff --git a/SchengenVisaApi/Infrastructure/Database/IReader.cs b/SchengenVisaApi/Infrastructure/Database/IReader.cs deleted file mode 100644 index 2d844ee..0000000 --- a/SchengenVisaApi/Infrastructure/Database/IReader.cs +++ /dev/null @@ -1,18 +0,0 @@ -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/Configuration/Common/CityConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Configuration/CityConfiguration.cs similarity index 80% rename from SchengenVisaApi/Infrastructure/Database/Configuration/Common/CityConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/Locations/Configuration/CityConfiguration.cs index f4b872c..d43ea6a 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CityConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Configuration/CityConfiguration.cs @@ -1,8 +1,8 @@ -using Domains.Common; +using Domains.LocationDomain; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.Common +namespace Infrastructure.Database.Locations.Configuration { public class CityConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CountryConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Configuration/CountryConfiguration.cs similarity index 80% rename from SchengenVisaApi/Infrastructure/Database/Configuration/Common/CountryConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/Locations/Configuration/CountryConfiguration.cs index 9956d57..1e909f9 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/Common/CountryConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Configuration/CountryConfiguration.cs @@ -1,8 +1,8 @@ -using Domains.Common; +using Domains.LocationDomain; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.Common +namespace Infrastructure.Database.Locations.Configuration { public class CountryConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/CitiesRepository.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/CitiesRepository.cs new file mode 100644 index 0000000..da38369 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/CitiesRepository.cs @@ -0,0 +1,15 @@ +using Domains.LocationDomain; +using Infrastructure.Database.Generic; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Database.Locations.Repositories.Cities +{ + public class CitiesRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) + : GenericRepository(writer, unitOfWork), ICitiesRepository + { + protected override IQueryable LoadDomain() + { + return reader.GetAll().Include(c => c.Country); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/ICitiesRepository.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/ICitiesRepository.cs new file mode 100644 index 0000000..5f5cf9b --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Cities/ICitiesRepository.cs @@ -0,0 +1,7 @@ +using Domains.LocationDomain; +using Infrastructure.Database.Generic; + +namespace Infrastructure.Database.Locations.Repositories.Cities +{ + public interface ICitiesRepository : IGenericRepository { } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/CountriesRepository.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/CountriesRepository.cs new file mode 100644 index 0000000..f1ab02a --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/CountriesRepository.cs @@ -0,0 +1,15 @@ +using Domains.LocationDomain; +using Infrastructure.Database.Generic; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Database.Locations.Repositories.Countries +{ + public class CountriesRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) + : GenericRepository(writer, unitOfWork), ICountriesRepository + { + protected override IQueryable LoadDomain() + { + return reader.GetAll().Include(c => c.Cities); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/ICountriesRepository.cs b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/ICountriesRepository.cs new file mode 100644 index 0000000..0361a9b --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/Locations/Repositories/Countries/ICountriesRepository.cs @@ -0,0 +1,7 @@ +using Domains.LocationDomain; +using Infrastructure.Database.Generic; + +namespace Infrastructure.Database.Locations.Repositories.Countries +{ + public interface ICountriesRepository : IGenericRepository { } +} diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PastVisaConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisaConfiguration.cs similarity index 86% rename from SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PastVisaConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisaConfiguration.cs index 41deeb2..2041a81 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PastVisaConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PastVisaConfiguration.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.VisaApplication +namespace Infrastructure.Database.VisaApplications.Configuration { public class PastVisaConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PermissionToDestCountryConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PermissionToDestCountryConfiguration.cs similarity index 87% rename from SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PermissionToDestCountryConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PermissionToDestCountryConfiguration.cs index c7c6ed3..a8a3c44 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/PermissionToDestCountryConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/PermissionToDestCountryConfiguration.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.VisaApplication +namespace Infrastructure.Database.VisaApplications.Configuration { public class PermissionToDestCountryConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/ReentryPermitConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/ReentryPermitConfiguration.cs similarity index 87% rename from SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/ReentryPermitConfiguration.cs rename to SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/ReentryPermitConfiguration.cs index a3c0c3a..7e6755c 100644 --- a/SchengenVisaApi/Infrastructure/Database/Configuration/VisaApplication/ReentryPermitConfiguration.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/ReentryPermitConfiguration.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace Infrastructure.Database.Configuration.VisaApplication +namespace Infrastructure.Database.VisaApplications.Configuration { public class ReentryPermitConfiguration : IEntityTypeConfiguration { diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/VisaApplicationConfiguration.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/VisaApplicationConfiguration.cs new file mode 100644 index 0000000..fee6000 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Configuration/VisaApplicationConfiguration.cs @@ -0,0 +1,22 @@ +using Domains.VisaApplicationDomain; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Database.VisaApplications.Configuration +{ + public class VisaApplicationConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.ToTable("VisaApplications"); + + entity.HasOne(va => va.Applicant) + .WithMany(a => a.VisaApplications) + .HasForeignKey(va => va.ApplicantId) + .IsRequired(); + + entity.OwnsOne(p => p.ReentryPermit); + entity.OwnsOne(p => p.PermissionToDestCountry); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/IVisaApplicationsRepository.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/IVisaApplicationsRepository.cs new file mode 100644 index 0000000..14e4965 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/IVisaApplicationsRepository.cs @@ -0,0 +1,7 @@ +using Domains.VisaApplicationDomain; +using Infrastructure.Database.Generic; + +namespace Infrastructure.Database.VisaApplications.Repositories +{ + public interface IVisaApplicationsRepository : IGenericRepository { } +} diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs new file mode 100644 index 0000000..abbe608 --- /dev/null +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs @@ -0,0 +1,18 @@ +using Domains.VisaApplicationDomain; +using Infrastructure.Database.Generic; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Database.VisaApplications.Repositories +{ + public class VisaApplicationsRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) + : GenericRepository(writer, unitOfWork), IVisaApplicationsRepository + { + protected override IQueryable LoadDomain() + { + return reader.GetAll() + .Include(a => a.DestinationCountry) + .Include(a => a.PastVisas) + .Include(a => a.PastVisits); + } + } +} diff --git a/SchengenVisaApi/Infrastructure/Infrastructure.csproj b/SchengenVisaApi/Infrastructure/Infrastructure.csproj index 438798e..9d49b38 100644 --- a/SchengenVisaApi/Infrastructure/Infrastructure.csproj +++ b/SchengenVisaApi/Infrastructure/Infrastructure.csproj @@ -15,8 +15,4 @@ - - - -