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 @@
-
-
-
-