Changed models, added Application layer models
This commit is contained in:
		| @@ -1,4 +1,5 @@ | |||||||
| using Domains.ApplicantDomain; | using ApplicationLayer.VisaApplication.Models; | ||||||
|  | using Domains.ApplicantDomain; | ||||||
| using Domains.VisaApplicationDomain; | using Domains.VisaApplicationDomain; | ||||||
|  |  | ||||||
| namespace ApplicationLayer.VisaApplication; | namespace ApplicationLayer.VisaApplication; | ||||||
| @@ -19,7 +20,7 @@ public record CreateVisaApplicationRequest( | |||||||
|     bool IsNonResident, |     bool IsNonResident, | ||||||
|     ReentryPermit ReentryPermit, |     ReentryPermit ReentryPermit, | ||||||
|     string JobTitle, |     string JobTitle, | ||||||
|     PlaceOfWork PlaceOfWork, |     PlaceOfWorkModel PlaceOfWork, | ||||||
|     string DestinationCountry, |     string DestinationCountry, | ||||||
|     VisaCategory VisaCategory, |     VisaCategory VisaCategory, | ||||||
|     bool IsForGroup, |     bool IsForGroup, | ||||||
| @@ -28,4 +29,4 @@ public record CreateVisaApplicationRequest( | |||||||
|     PastVisa[] PastVisas, |     PastVisa[] PastVisas, | ||||||
|     PermissionToDestCountry? PermissionToDestCountry, |     PermissionToDestCountry? PermissionToDestCountry, | ||||||
|     PastVisit[] PastVisits |     PastVisit[] PastVisits | ||||||
|     ); | ); | ||||||
|   | |||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | namespace ApplicationLayer.VisaApplication.Models; | ||||||
|  |  | ||||||
|  | public class AddressModel | ||||||
|  | { | ||||||
|  |     /// Country part of address | ||||||
|  |     public string Country { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     /// City part of address | ||||||
|  |     public string City { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     /// Street part of address | ||||||
|  |     public string Street { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     /// Building part of address | ||||||
|  |     public string Building { get; set; } = null!; | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | namespace ApplicationLayer.VisaApplication.Models; | ||||||
|  |  | ||||||
|  | public class PlaceOfWorkModel | ||||||
|  | { | ||||||
|  |     /// Name of hirer | ||||||
|  |     public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     /// <see cref="AddressModel"/> of hirer | ||||||
|  |     public AddressModel Address { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     /// Phone number of hirer | ||||||
|  |     public string PhoneNum { get; set; } = null!; | ||||||
|  | } | ||||||
| @@ -1,21 +1,20 @@ | |||||||
| using Domains.LocationDomain; | using Domains.LocationDomain; | ||||||
|  |  | ||||||
| namespace Domains.ApplicantDomain | namespace Domains.ApplicantDomain; | ||||||
|  |  | ||||||
|  | /// Model of address | ||||||
|  | /// <remarks>Owned</remarks> | ||||||
|  | public class Address | ||||||
| { | { | ||||||
|     /// Model of address |     /// Country part of address | ||||||
|     /// <remarks>Owned</remarks> |     public Country Country { get; set; } = null!; | ||||||
|     public class Address |  | ||||||
|     { |  | ||||||
|         /// Country part of address |  | ||||||
|         public Country Country { get; set; } = null!; |  | ||||||
|  |  | ||||||
|         /// City part of address |     /// City part of address | ||||||
|         public City City { get; set; } = null!; |     public City City { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Street part of address |     /// Street part of address | ||||||
|         public string Street { get; set; } = null!; |     public string Street { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Building part of address |     /// Building part of address | ||||||
|         public string Building { get; set; } = null!; |     public string Building { get; set; } = null!; | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,57 +1,56 @@ | |||||||
| using Domains.LocationDomain; | using Domains.LocationDomain; | ||||||
| using Domains.VisaApplicationDomain; | using Domains.VisaApplicationDomain; | ||||||
|  |  | ||||||
| namespace Domains.ApplicantDomain | namespace Domains.ApplicantDomain; | ||||||
|  |  | ||||||
|  | /// Model of an applicant | ||||||
|  | public class Applicant : IEntity | ||||||
| { | { | ||||||
|     /// Model of an applicant |     /// Unique identifier of the <see cref="Applicant"/> | ||||||
|     public class Applicant : IEntity |     public Guid Id { get; set; } | ||||||
|     { |  | ||||||
|         /// Unique identifier of the <see cref="Applicant"/> |  | ||||||
|         public Guid Id { get; set; } |  | ||||||
|  |  | ||||||
|         /// Full name of the <see cref="Applicant"/> |     /// Full name of the <see cref="Applicant"/> | ||||||
|         public Name Name { get; set; } = null!; |     public Name Name { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Passport of <see cref="Applicant"/> |     /// Passport of <see cref="Applicant"/> | ||||||
|         public Passport Passport { get; set; } = null!; |     public Passport Passport { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Date of birth of the <see cref="Applicant"/> |     /// Date of birth of the <see cref="Applicant"/> | ||||||
|         public DateTime BirthDate { get; set; } |     public DateTime BirthDate { get; set; } | ||||||
|  |  | ||||||
|         /// <see cref="Country"/> of birth of the <see cref="Applicant"/> |     /// <see cref="Country"/> of birth of the <see cref="Applicant"/> | ||||||
|         public Country CountryOfBirth { get; set; } = null!; |     public Country CountryOfBirth { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// <see cref="City"/> of birth of the <see cref="Applicant"/> |     /// <see cref="City"/> of birth of the <see cref="Applicant"/> | ||||||
|         public City CityOfBirth { get; set; } = null!; |     public City CityOfBirth { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Citizenship of <see cref="Applicant"/> |     /// Citizenship of <see cref="Applicant"/> | ||||||
|         public string Citizenship { get; set; } = null!; |     public string Citizenship { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Citizenship by birth of <see cref="Applicant"/> |     /// Citizenship by birth of <see cref="Applicant"/> | ||||||
|         public string CitizenshipByBirth { get; set; } = null!; |     public string CitizenshipByBirth { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Gender of <see cref="Applicant"/> |     /// Gender of <see cref="Applicant"/> | ||||||
|         public Gender Gender { get; set; } |     public Gender Gender { get; set; } | ||||||
|  |  | ||||||
|         /// Marital status of <see cref="Applicant"/> |     /// Marital status of <see cref="Applicant"/> | ||||||
|         public MaritalStatus MaritalStatus { get; set; } |     public MaritalStatus MaritalStatus { get; set; } | ||||||
|  |  | ||||||
|         /// Full name of the <see cref="Applicant"/>'s father |     /// Full name of the <see cref="Applicant"/>'s father | ||||||
|         public Name FatherName { get; set; } = null!; |     public Name FatherName { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Full name of the <see cref="Applicant"/>'s mother |     /// Full name of the <see cref="Applicant"/>'s mother | ||||||
|         public Name MotherName { get; set; } = null!; |     public Name MotherName { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Position of <see cref="Applicant"/> |     /// Position of <see cref="Applicant"/> | ||||||
|         public string JobTitle { get; set; } = null!; |     public string JobTitle { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Place of <see cref="Applicant"/>'s work |     /// Place of <see cref="Applicant"/>'s work | ||||||
|         public PlaceOfWork PlaceOfWork { get; set; } = null!; |     public PlaceOfWork PlaceOfWork { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Is <see cref="Applicant"/> a non-resident |     /// Is <see cref="Applicant"/> a non-resident | ||||||
|         public bool IsNonResident { get; set; } |     public bool IsNonResident { get; set; } | ||||||
|  |  | ||||||
|         /// List of <see cref="Applicant"/>'s applications |     /// List of <see cref="Applicant"/>'s applications | ||||||
|         public List<VisaApplication> VisaApplications { get; set; } = null!; |     public List<VisaApplication> VisaApplications { get; set; } = null!; | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,10 +1,9 @@ | |||||||
| namespace Domains.ApplicantDomain | namespace Domains.ApplicantDomain; | ||||||
|  |  | ||||||
|  | public enum Gender | ||||||
| { | { | ||||||
|     public enum Gender |     Unknown, | ||||||
|     { |     Male, | ||||||
|         Unknown, |     Female, | ||||||
|         Male, |     Turkish | ||||||
|         Female, |  | ||||||
|         Turkish |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,11 +1,10 @@ | |||||||
| namespace Domains.ApplicantDomain | namespace Domains.ApplicantDomain; | ||||||
|  |  | ||||||
|  | public enum MaritalStatus | ||||||
| { | { | ||||||
|     public enum MaritalStatus |     Other, | ||||||
|     { |     Married, | ||||||
|         Other, |     Unmarried, | ||||||
|         Married, |     Separated, | ||||||
|         Unmarried, |     WidowOrWidower | ||||||
|         Separated, |  | ||||||
|         WidowOrWidower |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,13 +1,12 @@ | |||||||
| namespace Domains.ApplicantDomain | namespace Domains.ApplicantDomain; | ||||||
|  |  | ||||||
|  | /// Model of full name | ||||||
|  | /// <remarks>Owned</remarks> | ||||||
|  | public class Name | ||||||
| { | { | ||||||
|     /// Model of full name |     public string FirstName { get; set; } = null!; | ||||||
|     /// <remarks>Owned</remarks> |  | ||||||
|     public class Name |  | ||||||
|     { |  | ||||||
|         public string FirstName { get; set; } = null!; |  | ||||||
|  |  | ||||||
|         public string Surname { get; set; } = null!; |     public string Surname { get; set; } = null!; | ||||||
|  |  | ||||||
|         public string? Patronymic { get; set; } |     public string? Patronymic { get; set; } | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,19 +1,18 @@ | |||||||
| namespace Domains.ApplicantDomain | namespace Domains.ApplicantDomain; | ||||||
|  |  | ||||||
|  | /// Model of passport | ||||||
|  | /// <remarks>Owned</remarks> | ||||||
|  | public class Passport | ||||||
| { | { | ||||||
|     /// Model of passport |     /// Number of <see cref="Passport"/> | ||||||
|     /// <remarks>Owned</remarks> |     public string Number { get; set; } = null!; | ||||||
|     public class Passport |  | ||||||
|     { |  | ||||||
|         /// Number of <see cref="Passport"/> |  | ||||||
|         public string Number { get; set; } = null!; |  | ||||||
|  |  | ||||||
|         /// Issuing authority of <see cref="Passport"/> |     /// Issuing authority of <see cref="Passport"/> | ||||||
|         public string Issuer { get; set; } = null!; |     public string Issuer { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Date of issue |     /// Date of issue | ||||||
|         public DateTime IssueDate { get; set; } |     public DateTime IssueDate { get; set; } | ||||||
|  |  | ||||||
|         /// Date when the <see cref="Passport"/> expires |     /// Date when the <see cref="Passport"/> expires | ||||||
|         public DateTime ExpirationDate { get; set; } |     public DateTime ExpirationDate { get; set; } | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,17 +1,16 @@ | |||||||
| namespace Domains.ApplicantDomain | namespace Domains.ApplicantDomain; | ||||||
|  |  | ||||||
|  | public class PlaceOfWork : IEntity | ||||||
| { | { | ||||||
|     public class PlaceOfWork : IEntity |     /// Unique identifier of <see cref="PlaceOfWork"/> | ||||||
|     { |     public Guid Id { get; private set; } = Guid.NewGuid(); | ||||||
|         /// Unique identifier of <see cref="PlaceOfWork"/> |  | ||||||
|         public Guid Id { get; private set; } = Guid.NewGuid(); |  | ||||||
|  |  | ||||||
|         /// Name of hirer |     /// Name of hirer | ||||||
|         public string Name { get; set; } = null!; |     public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// <see cref="ApplicantDomain.Address"/> of hirer |     /// <see cref="ApplicantDomain.Address"/> of hirer | ||||||
|         public Address Address { get; set; } = null!; |     public Address Address { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Phone number of hirer |     /// Phone number of hirer | ||||||
|         public string PhoneNum { get; set; } = null!; |     public string PhoneNum { get; set; } = null!; | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,8 +1,7 @@ | |||||||
| namespace Domains | namespace Domains; | ||||||
|  |  | ||||||
|  | /// Interface that every entity should inherit from | ||||||
|  | public interface IEntity | ||||||
| { | { | ||||||
|     /// Interface that every entity should inherit from |     public Guid Id { get; } | ||||||
|     public interface IEntity |  | ||||||
|     { |  | ||||||
|         public Guid Id { get; } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,15 +1,14 @@ | |||||||
| namespace Domains.LocationDomain | namespace Domains.LocationDomain; | ||||||
|  |  | ||||||
|  | /// Model of a city | ||||||
|  | public class City : IEntity | ||||||
| { | { | ||||||
|     /// Model of a city |     /// Unique identifier of the <see cref="City"/> | ||||||
|     public class City : IEntity |     public Guid Id { get; private set; } = Guid.NewGuid(); | ||||||
|     { |  | ||||||
|         /// Unique identifier of the <see cref="City"/> |  | ||||||
|         public Guid Id { get; private set; } = Guid.NewGuid(); |  | ||||||
|  |  | ||||||
|         /// Name of the city |     /// Name of the city | ||||||
|         public string Name { get; set; } = null!; |     public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// <see cref="LocationDomain.Country"/> in which the city is located |     /// <see cref="LocationDomain.Country"/> in which the city is located | ||||||
|         public Country Country { get; set; } = null!; |     public Country Country { get; set; } = null!; | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,18 +1,17 @@ | |||||||
| namespace Domains.LocationDomain | namespace Domains.LocationDomain; | ||||||
|  |  | ||||||
|  | /// Model of a country | ||||||
|  | public class Country : IEntity | ||||||
| { | { | ||||||
|     /// Model of a country |     /// Unique identifier of the <see cref="Country"/> | ||||||
|     public class Country : IEntity |     public Guid Id { get; private set; } = Guid.NewGuid(); | ||||||
|     { |  | ||||||
|         /// Unique identifier of the <see cref="Country"/> |  | ||||||
|         public Guid Id { get; private set; } = Guid.NewGuid(); |  | ||||||
|  |  | ||||||
|         /// Name of the country |     /// Name of the country | ||||||
|         public string Name { get; set; } = null!; |     public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Located in Schengen area |     /// Located in Schengen area | ||||||
|         public bool IsSchengen { get; set; } |     public bool IsSchengen { get; set; } | ||||||
|  |  | ||||||
|         /// List of <see cref="City"/> that country have |     /// List of <see cref="City"/> that country have | ||||||
|         public List<City> Cities { get; set; } = null!; |     public List<City> Cities { get; set; } = null!; | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,20 +1,17 @@ | |||||||
| using Domains.ApplicantDomain; | using Domains.ApplicantDomain; | ||||||
|  |  | ||||||
| namespace Domains.VisaApplicationDomain | namespace Domains.VisaApplicationDomain; | ||||||
|  |  | ||||||
|  | /// Visa that <see cref="Applicant"/> already had | ||||||
|  | /// <remarks>Owned</remarks> | ||||||
|  | public class PastVisa | ||||||
| { | { | ||||||
|     /// Visa that <see cref="Applicant"/> already had |     /// Date of issue | ||||||
|     public class PastVisa : IEntity |     public DateTime IssueDate { get; set; } | ||||||
|     { |  | ||||||
|         /// Unique identifier of <see cref="PastVisa"/> |  | ||||||
|         public Guid Id { get; private set; } = Guid.NewGuid(); |  | ||||||
|  |  | ||||||
|         /// Date of issue |     /// Name of visa | ||||||
|         public DateTime IssueDate { get; set; } |     public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Name of visa |     /// Date when visa expires | ||||||
|         public string Name { get; set; } = null!; |     public DateTime ExpirationDate { get; set; } | ||||||
|  |  | ||||||
|         /// Date when visa expires |  | ||||||
|         public DateTime ExpirationDate { get; set; } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,17 +1,14 @@ | |||||||
| using Domains.ApplicantDomain; | using Domains.ApplicantDomain; | ||||||
|  |  | ||||||
| namespace Domains.VisaApplicationDomain | namespace Domains.VisaApplicationDomain; | ||||||
|  |  | ||||||
|  | /// Visit in a Schengen country that <see cref="Applicant"/> already had | ||||||
|  | /// <remarks>Owned</remarks> | ||||||
|  | public class PastVisit | ||||||
| { | { | ||||||
|     /// Visit in a Schengen country that <see cref="Applicant"/> already had |     /// First day of <see cref="PastVisit"/> | ||||||
|     public class PastVisit : IEntity |     public DateTime StartDate { get; set; } | ||||||
|     { |  | ||||||
|         /// Unique identifier of <see cref="PastVisit"/> |  | ||||||
|         public Guid Id { get; private set; } = Guid.NewGuid(); |  | ||||||
|  |  | ||||||
|         /// First day of <see cref="PastVisit"/> |     /// Last day of <see cref="PastVisit"/> | ||||||
|         public DateTime StartDate { get; set; } |     public DateTime EndDate { get; set; } | ||||||
|  |  | ||||||
|         /// Last day of <see cref="PastVisit"/> |  | ||||||
|         public DateTime EndDate { get; set; } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,13 +1,12 @@ | |||||||
| namespace Domains.VisaApplicationDomain | namespace Domains.VisaApplicationDomain; | ||||||
| { |  | ||||||
|     /// Permission to enter the destination country |  | ||||||
|     /// <remarks>Owned</remarks> |  | ||||||
|     public class PermissionToDestCountry |  | ||||||
|     { |  | ||||||
|         /// Date when <see cref="PermissionToDestCountry"/> expires |  | ||||||
|         public DateTime ExpirationDate { get; set; } |  | ||||||
|  |  | ||||||
|         /// Issuing authority | /// Permission to enter the destination country | ||||||
|         public string Issuer { get; set; } = null!; | /// <remarks>Owned</remarks> | ||||||
|     } | public class PermissionToDestCountry | ||||||
|  | { | ||||||
|  |     /// Date when <see cref="PermissionToDestCountry"/> expires | ||||||
|  |     public DateTime ExpirationDate { get; set; } | ||||||
|  |  | ||||||
|  |     /// Issuing authority | ||||||
|  |     public string Issuer { get; set; } = null!; | ||||||
| } | } | ||||||
| @@ -1,13 +1,12 @@ | |||||||
| namespace Domains.VisaApplicationDomain | namespace Domains.VisaApplicationDomain; | ||||||
| { |  | ||||||
|     /// Permission to enter a country the issuer wants to come from |  | ||||||
|     /// <remarks>Owned</remarks> |  | ||||||
|     public class ReentryPermit |  | ||||||
|     { |  | ||||||
|         /// Number of <see cref="ReentryPermit"/> |  | ||||||
|         public string Number { get; set; } = null!; |  | ||||||
|  |  | ||||||
|         /// Date when <see cref="ReentryPermit"/> expires | /// Permission to enter a country the issuer wants to come from | ||||||
|         public DateTime ExpirationDate { get; set; } | /// <remarks>Owned</remarks> | ||||||
|     } | public class ReentryPermit | ||||||
|  | { | ||||||
|  |     /// Number of <see cref="ReentryPermit"/> | ||||||
|  |     public string Number { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     /// Date when <see cref="ReentryPermit"/> expires | ||||||
|  |     public DateTime ExpirationDate { get; set; } | ||||||
| } | } | ||||||
| @@ -1,10 +1,9 @@ | |||||||
| namespace Domains.VisaApplicationDomain | namespace Domains.VisaApplicationDomain; | ||||||
|  |  | ||||||
|  | /// Requested number of entries | ||||||
|  | public enum RequestedNumberOfEntries | ||||||
| { | { | ||||||
|     /// Requested number of entries |     Many, | ||||||
|     public enum RequestedNumberOfEntries |     One, | ||||||
|     { |     Two | ||||||
|         Many, |  | ||||||
|         One, |  | ||||||
|         Two |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,51 +1,50 @@ | |||||||
| using Domains.ApplicantDomain; | using Domains.ApplicantDomain; | ||||||
| using Domains.LocationDomain; | using Domains.LocationDomain; | ||||||
|  |  | ||||||
| namespace Domains.VisaApplicationDomain | namespace Domains.VisaApplicationDomain; | ||||||
|  |  | ||||||
|  | /// Model of visit request | ||||||
|  | public class VisaApplication : IEntity | ||||||
| { | { | ||||||
|     /// Model of visit request |     /// Unique identifier of <see cref="VisaApplication"/> | ||||||
|     public class VisaApplication : IEntity |     public Guid Id { get; private set; } = Guid.NewGuid(); | ||||||
|     { |  | ||||||
|         /// Unique identifier of <see cref="VisaApplication"/> |  | ||||||
|         public Guid Id { get; private set; } = Guid.NewGuid(); |  | ||||||
|  |  | ||||||
|         /// Identifier of the <see cref="Applicant"/> |     /// Identifier of the <see cref="Applicant"/> | ||||||
|         public Guid ApplicantId { get; set; } |     public Guid ApplicantId { get; set; } | ||||||
|  |  | ||||||
|         /// Applicant of <see cref="VisaApplication"/> |     /// Applicant of <see cref="VisaApplication"/> | ||||||
|         public Applicant Applicant { get; set; } = null!; |     public Applicant Applicant { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// <inheritdoc cref="Domains.VisaApplicationDomain.ReentryPermit"/> |     /// <inheritdoc cref="Domains.VisaApplicationDomain.ReentryPermit"/> | ||||||
|         /// <remarks>always null if <see cref="Applicant"/> is not a non-resident</remarks> |     /// <remarks>always null if <see cref="Applicant"/> is not a non-resident</remarks> | ||||||
|         public ReentryPermit? ReentryPermit { get; set; } |     public ReentryPermit? ReentryPermit { get; set; } | ||||||
|  |  | ||||||
|         /// <see cref="Country"/> that <see cref="Applicant"/> wants to visit |     /// <see cref="Country"/> that <see cref="Applicant"/> wants to visit | ||||||
|         public Country DestinationCountry { get; set; } = null!; |     public Country DestinationCountry { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// <summary> |     /// <summary> | ||||||
|         /// List of <see cref="PastVisa"/> that applicant had before |     /// List of <see cref="PastVisa"/> that applicant had before | ||||||
|         /// </summary> |     /// </summary> | ||||||
|         public List<PastVisa> PastVisas { get; set; } = null!; |     public List<PastVisa> PastVisas { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// Permission to enter the destination country of <see cref="Applicant"/> |     /// Permission to enter the destination country of <see cref="Applicant"/> | ||||||
|         /// <remarks>always null if <see cref="DestinationCountry"/> is Schengen</remarks> |     /// <remarks>always null if <see cref="DestinationCountry"/> is Schengen</remarks> | ||||||
|         public PermissionToDestCountry? PermissionToDestCountry { get; set; } |     public PermissionToDestCountry? PermissionToDestCountry { get; set; } | ||||||
|  |  | ||||||
|         public List<PastVisit> PastVisits { get; set; } = null!; |     public List<PastVisit> PastVisits { get; set; } = null!; | ||||||
|  |  | ||||||
|         /// <see cref="Domains.VisaApplicationDomain.VisaCategory"/> |     /// <see cref="Domains.VisaApplicationDomain.VisaCategory"/> | ||||||
|         public VisaCategory VisaCategory { get; set; } |     public VisaCategory VisaCategory { get; set; } | ||||||
|  |  | ||||||
|         /// Is for group |     /// Is for group | ||||||
|         public bool ForGroup { get; set; } |     public bool ForGroup { get; set; } | ||||||
|  |  | ||||||
|         /// <see cref="Domains.VisaApplicationDomain.RequestedNumberOfEntries"/> |     /// <see cref="Domains.VisaApplicationDomain.RequestedNumberOfEntries"/> | ||||||
|         public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } |     public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } | ||||||
|  |  | ||||||
|         /// When application was created |     /// When application was created | ||||||
|         public DateTime RequestDate { get; set; } |     public DateTime RequestDate { get; set; } | ||||||
|  |  | ||||||
|         /// Valid days requested |     /// Valid days requested | ||||||
|         public int ValidDaysRequested { get; set; } |     public int ValidDaysRequested { get; set; } | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,9 +1,8 @@ | |||||||
| namespace Domains.VisaApplicationDomain | namespace Domains.VisaApplicationDomain; | ||||||
|  |  | ||||||
|  | /// Category of visa | ||||||
|  | public enum VisaCategory | ||||||
| { | { | ||||||
|     /// Category of visa |     Transit, | ||||||
|     public enum VisaCategory |     ShortDated | ||||||
|     { |  | ||||||
|         Transit, |  | ||||||
|         ShortDated |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -2,18 +2,17 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Applicants.Configuration | namespace Infrastructure.Database.Applicants.Configuration; | ||||||
|  |  | ||||||
|  | public class AddressConfiguration : IEntityTypeConfiguration<Address> | ||||||
| { | { | ||||||
|     public class AddressConfiguration : IEntityTypeConfiguration<Address> |     public void Configure(EntityTypeBuilder<Address> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<Address> entity) |         entity.Property(p => p.Street) | ||||||
|         { |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.Street) |             .HasMaxLength(100); | ||||||
|                 .IsUnicode(false) |         entity.Property(p => p.Building) | ||||||
|                 .HasMaxLength(100); |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.Building) |             .HasMaxLength(10); | ||||||
|                 .IsUnicode(false) |  | ||||||
|                 .HasMaxLength(10); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,26 +2,25 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Applicants.Configuration | namespace Infrastructure.Database.Applicants.Configuration; | ||||||
|  |  | ||||||
|  | public class ApplicantConfiguration : IEntityTypeConfiguration<Applicant> | ||||||
| { | { | ||||||
|     public class ApplicantConfiguration : IEntityTypeConfiguration<Applicant> |     public void Configure(EntityTypeBuilder<Applicant> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<Applicant> entity) |         entity.ToTable("Applicants"); | ||||||
|         { |  | ||||||
|             entity.ToTable("Applicants"); |  | ||||||
|  |  | ||||||
|             entity.OwnsOne(p => p.Name); |         entity.OwnsOne(p => p.Name); | ||||||
|             entity.OwnsOne(p => p.FatherName); |         entity.OwnsOne(p => p.FatherName); | ||||||
|             entity.OwnsOne(p => p.MotherName); |         entity.OwnsOne(p => p.MotherName); | ||||||
|             entity.OwnsOne(p => p.Passport); |         entity.OwnsOne(p => p.Passport); | ||||||
|  |  | ||||||
|             entity.Property(p => p.Citizenship) |         entity.Property(p => p.Citizenship) | ||||||
|                 .IsUnicode(false) |             .IsUnicode(false) | ||||||
|                 .HasMaxLength(30); |             .HasMaxLength(30); | ||||||
|  |  | ||||||
|             entity.Property(p => p.CitizenshipByBirth) |         entity.Property(p => p.CitizenshipByBirth) | ||||||
|                 .IsUnicode(false) |             .IsUnicode(false) | ||||||
|                 .HasMaxLength(30); |             .HasMaxLength(30); | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,23 +2,22 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Applicants.Configuration | namespace Infrastructure.Database.Applicants.Configuration; | ||||||
|  |  | ||||||
|  | public class NameConfiguration : IEntityTypeConfiguration<Name> | ||||||
| { | { | ||||||
|     public class NameConfiguration : IEntityTypeConfiguration<Name> |     public void Configure(EntityTypeBuilder<Name> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<Name> entity) |         entity.Property(p => p.FirstName) | ||||||
|         { |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.FirstName) |             .HasMaxLength(50); | ||||||
|                 .IsUnicode(false) |  | ||||||
|                 .HasMaxLength(50); |  | ||||||
|  |  | ||||||
|             entity.Property(p => p.Surname) |         entity.Property(p => p.Surname) | ||||||
|                 .IsUnicode(false) |             .IsUnicode(false) | ||||||
|                 .HasMaxLength(50); |             .HasMaxLength(50); | ||||||
|  |  | ||||||
|             entity.Property(p => p.Patronymic) |         entity.Property(p => p.Patronymic) | ||||||
|                 .IsUnicode(false) |             .IsUnicode(false) | ||||||
|                 .HasMaxLength(50); |             .HasMaxLength(50); | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,19 +2,18 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Applicants.Configuration | namespace Infrastructure.Database.Applicants.Configuration; | ||||||
| { |  | ||||||
|     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) | public class PassportConfiguration : IEntityTypeConfiguration<Passport> | ||||||
|                 .IsUnicode(false) | { | ||||||
|                 .HasMaxLength(200); |     public void Configure(EntityTypeBuilder<Passport> entity) | ||||||
|         } |     { | ||||||
|  |         entity.Property(p => p.Number) | ||||||
|  |             .IsUnicode(false) | ||||||
|  |             .HasMaxLength(20); | ||||||
|  |  | ||||||
|  |         entity.Property(p => p.Issuer) | ||||||
|  |             .IsUnicode(false) | ||||||
|  |             .HasMaxLength(200); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,21 +2,20 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Applicants.Configuration | namespace Infrastructure.Database.Applicants.Configuration; | ||||||
|  |  | ||||||
|  | public class PlaceOfWorkConfiguration : IEntityTypeConfiguration<PlaceOfWork> | ||||||
| { | { | ||||||
|     public class PlaceOfWorkConfiguration : IEntityTypeConfiguration<PlaceOfWork> |     public void Configure(EntityTypeBuilder<PlaceOfWork> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<PlaceOfWork> entity) |         entity.OwnsOne(p => p.Address); | ||||||
|         { |  | ||||||
|             entity.OwnsOne(p => p.Address); |  | ||||||
|  |  | ||||||
|             entity.Property(p => p.Name) |         entity.Property(p => p.Name) | ||||||
|                 .IsUnicode(false) |             .IsUnicode(false) | ||||||
|                 .HasMaxLength(200); |             .HasMaxLength(200); | ||||||
|  |  | ||||||
|             entity.Property(p => p.PhoneNum) |         entity.Property(p => p.PhoneNum) | ||||||
|                 .IsUnicode(false) |             .IsUnicode(false) | ||||||
|                 .HasMaxLength(20); |             .HasMaxLength(20); | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,21 +2,20 @@ | |||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Applicants.Repositories | namespace Infrastructure.Database.Applicants.Repositories; | ||||||
|  |  | ||||||
|  | /// Repository pattern for <see cref="Applicant"/> | ||||||
|  | /// <param name="reader"><inheritdoc cref="IGenericReader"/></param> | ||||||
|  | /// <param name="writer"><inheritdoc cref="IGenericWriter"/></param> | ||||||
|  | /// <param name="unitOfWork"><inheritdoc cref="IUnitOfWork"/></param> | ||||||
|  | public sealed class ApplicantsRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) | ||||||
|  |     : GenericRepository<Applicant>(reader, writer, unitOfWork), IApplicantsRepository | ||||||
| { | { | ||||||
|     /// Repository pattern for <see cref="Applicant"/> |     protected override IQueryable<Applicant> LoadDomain() | ||||||
|     /// <param name="reader"><inheritdoc cref="IGenericReader"/></param> |  | ||||||
|     /// <param name="writer"><inheritdoc cref="IGenericWriter"/></param> |  | ||||||
|     /// <param name="unitOfWork"><inheritdoc cref="IUnitOfWork"/></param> |  | ||||||
|     public sealed class ApplicantsRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) |  | ||||||
|         : GenericRepository<Applicant>(reader, writer, unitOfWork), IApplicantsRepository |  | ||||||
|     { |     { | ||||||
|         protected override IQueryable<Applicant> LoadDomain() |         return base.LoadDomain() | ||||||
|         { |             .Include(a => a.CountryOfBirth) | ||||||
|             return base.LoadDomain() |             .Include(a => a.CityOfBirth) | ||||||
|                 .Include(a => a.CountryOfBirth) |             .Include(a => a.PlaceOfWork); | ||||||
|                 .Include(a => a.CityOfBirth) |  | ||||||
|                 .Include(a => a.PlaceOfWork); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,8 +1,7 @@ | |||||||
| using Domains.ApplicantDomain; | using Domains.ApplicantDomain; | ||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Applicants.Repositories | namespace Infrastructure.Database.Applicants.Repositories; | ||||||
| { |  | ||||||
|     /// Repository pattern for <see cref="Applicant"/> | /// Repository pattern for <see cref="Applicant"/> | ||||||
|     public interface IApplicantsRepository : IGenericRepository<Applicant> { } | public interface IApplicantsRepository : IGenericRepository<Applicant> { } | ||||||
| } |  | ||||||
| @@ -2,39 +2,38 @@ | |||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database | namespace Infrastructure.Database; | ||||||
|  |  | ||||||
|  | public class DbContext(DbContextOptions<DbContext> opts) | ||||||
|  |     : Microsoft.EntityFrameworkCore.DbContext(opts), IGenericWriter, IGenericReader, IUnitOfWork | ||||||
| { | { | ||||||
|     public class DbContext(DbContextOptions<DbContext> opts) |     protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||||
|         : Microsoft.EntityFrameworkCore.DbContext(opts), IGenericWriter, IGenericReader, IUnitOfWork |  | ||||||
|     { |     { | ||||||
|         protected override void OnModelCreating(ModelBuilder modelBuilder) |         modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); | ||||||
|         { |     } | ||||||
|             modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         async Task IGenericWriter.AddAsync<T>(T entity, CancellationToken cancellationToken) |     async Task IGenericWriter.AddAsync<T>(T entity, CancellationToken cancellationToken) | ||||||
|         { |     { | ||||||
|             await AddAsync(entity, cancellationToken); |         await AddAsync(entity, cancellationToken); | ||||||
|         } |     } | ||||||
|  |  | ||||||
|         void IGenericWriter.Update<T>(T entity) |     void IGenericWriter.Update<T>(T entity) | ||||||
|         { |     { | ||||||
|             Update(entity); |         Update(entity); | ||||||
|         } |     } | ||||||
|  |  | ||||||
|         void IGenericWriter.Remove<T>(T entity) |     void IGenericWriter.Remove<T>(T entity) | ||||||
|         { |     { | ||||||
|             Remove(entity); |         Remove(entity); | ||||||
|         } |     } | ||||||
|  |  | ||||||
|         IQueryable<T> IGenericReader.GetAll<T>() |     IQueryable<T> IGenericReader.GetAll<T>() | ||||||
|         { |     { | ||||||
|             return Set<T>(); |         return Set<T>(); | ||||||
|         } |     } | ||||||
|  |  | ||||||
|         async Task IUnitOfWork.SaveAsync(CancellationToken cancellationToken) |     async Task IUnitOfWork.SaveAsync(CancellationToken cancellationToken) | ||||||
|         { |     { | ||||||
|             await SaveChangesAsync(cancellationToken); |         await SaveChangesAsync(cancellationToken); | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,10 +1,9 @@ | |||||||
| using Domains; | using Domains; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.GeneralExceptions | namespace Infrastructure.Database.GeneralExceptions; | ||||||
| { |  | ||||||
|     /// Exception to throw when entity with specific id not found | /// Exception to throw when entity with specific id not found | ||||||
|     /// <param name="id">Identifier of entity</param> | /// <param name="id">Identifier of entity</param> | ||||||
|     /// <typeparam name="T">Not found entity type</typeparam> | /// <typeparam name="T">Not found entity type</typeparam> | ||||||
|     public class EntityNotFoundException<T>(Guid id) : Exception($"Entity {typeof(T).Name} with id '{id}' not found") | public class EntityNotFoundException<T>(Guid id) : Exception($"Entity {typeof(T).Name} with id '{id}' not found") | ||||||
|         where T : class, IEntity; |     where T : class, IEntity; | ||||||
| } |  | ||||||
| @@ -2,52 +2,51 @@ | |||||||
| using Infrastructure.Database.GeneralExceptions; | using Infrastructure.Database.GeneralExceptions; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Generic | namespace Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
|  | /// Generic repository pattern | ||||||
|  | /// <param name="writer"><inheritdoc cref="IGenericWriter"/></param> | ||||||
|  | /// <param name="unitOfWork"><inheritdoc cref="IUnitOfWork"/></param> | ||||||
|  | /// <typeparam name="T">Type of entity</typeparam> | ||||||
|  | /// <remarks>Should be inherited to create typed repositories</remarks> | ||||||
|  | public abstract class GenericRepository<T>(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) : IGenericRepository<T> | ||||||
|  |     where T : class, IEntity | ||||||
| { | { | ||||||
|     /// Generic repository pattern |     /// <inheritdoc cref="IGenericRepository{T}.GetAllAsync"/> | ||||||
|     /// <param name="writer"><inheritdoc cref="IGenericWriter"/></param> |     public async Task<List<T>> GetAllAsync(CancellationToken cancellationToken) | ||||||
|     /// <param name="unitOfWork"><inheritdoc cref="IUnitOfWork"/></param> |         => await LoadDomain().ToListAsync(cancellationToken); | ||||||
|     /// <typeparam name="T">Type of entity</typeparam> |  | ||||||
|     /// <remarks>Should be inherited to create typed repositories</remarks> |     /// <inheritdoc cref="IGenericRepository{T}.GetOneAsync"/> | ||||||
|     public abstract class GenericRepository<T>(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) : IGenericRepository<T> |     public async Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken) | ||||||
|         where T : class, IEntity |  | ||||||
|     { |     { | ||||||
|         /// <inheritdoc cref="IGenericRepository{T}.GetAllAsync"/> |         var result = await LoadDomain().SingleOrDefaultAsync(a => a.Id == id, cancellationToken); | ||||||
|         public async Task<List<T>> GetAllAsync(CancellationToken cancellationToken) |         return result ?? throw new EntityNotFoundException<T>(id); | ||||||
|             => await LoadDomain().ToListAsync(cancellationToken); |     } | ||||||
|  |  | ||||||
|         /// <inheritdoc cref="IGenericRepository{T}.GetOneAsync"/> |     /// <inheritdoc cref="IGenericRepository{T}.AddAsync"/> | ||||||
|         public async Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken) |     public async Task AddAsync(T entity, CancellationToken cancellationToken) | ||||||
|         { |         => await writer.AddAsync(entity, cancellationToken); | ||||||
|             var result = await LoadDomain().SingleOrDefaultAsync(a => a.Id == id, cancellationToken); |  | ||||||
|             return result ?? throw new EntityNotFoundException<T>(id); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /// <inheritdoc cref="IGenericRepository{T}.AddAsync"/> |     /// <inheritdoc cref="IGenericRepository{T}.UpdateAsync"/> | ||||||
|         public async Task AddAsync(T entity, CancellationToken cancellationToken) |     public async Task UpdateAsync(T entity, CancellationToken cancellationToken) | ||||||
|             => await writer.AddAsync(entity, cancellationToken); |     { | ||||||
|  |         await GetOneAsync(entity.Id, cancellationToken); | ||||||
|  |         writer.Update(entity); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         /// <inheritdoc cref="IGenericRepository{T}.UpdateAsync"/> |     /// <inheritdoc cref="IGenericRepository{T}.Remove"/> | ||||||
|         public async Task UpdateAsync(T entity, CancellationToken cancellationToken) |     public void Remove(T entity) | ||||||
|         { |     { | ||||||
|             await GetOneAsync(entity.Id, cancellationToken); |         writer.Remove(entity); | ||||||
|             writer.Update(entity); |     } | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /// <inheritdoc cref="IGenericRepository{T}.Remove"/> |     /// <inheritdoc cref="IGenericRepository{T}.SaveAsync"/> | ||||||
|         public void Remove(T entity) |     public async Task SaveAsync(CancellationToken cancellationToken) | ||||||
|         { |         => await unitOfWork.SaveAsync(cancellationToken); | ||||||
|             writer.Remove(entity); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /// <inheritdoc cref="IGenericRepository{T}.SaveAsync"/> |     /// Should be overriden to load navigation properties of entity | ||||||
|         public async Task SaveAsync(CancellationToken cancellationToken) |     protected virtual IQueryable<T> LoadDomain() | ||||||
|             => await unitOfWork.SaveAsync(cancellationToken); |     { | ||||||
|  |         return reader.GetAll<T>(); | ||||||
|         /// Should be overriden to load navigation properties of entity |  | ||||||
|         protected virtual IQueryable<T> LoadDomain() |  | ||||||
|         { |  | ||||||
|             return reader.GetAll<T>(); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,12 +1,11 @@ | |||||||
| using Domains; | using Domains; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Generic | namespace Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
|  | /// Reads from data storage | ||||||
|  | public interface IGenericReader | ||||||
| { | { | ||||||
|     /// Reads from data storage |     /// Get all entities of type T stored in storage | ||||||
|     public interface IGenericReader |     /// <typeparam name="T">Entity type to seek in storage</typeparam> | ||||||
|     { |     IQueryable<T> GetAll<T>() where T : class, IEntity; | ||||||
|         /// Get all entities of type T stored in storage |  | ||||||
|         /// <typeparam name="T">Entity type to seek in storage</typeparam> |  | ||||||
|         IQueryable<T> GetAll<T>() where T : class, IEntity; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,37 +1,36 @@ | |||||||
| using Domains; | using Domains; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Generic | namespace Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | /// Generic repository pattern | ||||||
|  | /// </summary> | ||||||
|  | /// <typeparam name="T">Entity type</typeparam> | ||||||
|  | public interface IGenericRepository<T> where T : class, IEntity | ||||||
| { | { | ||||||
|  |     /// Get all entities from data storage | ||||||
|  |     Task<List<T>> GetAllAsync(CancellationToken cancellationToken); | ||||||
|  |  | ||||||
|  |     /// Get one entity with specific id | ||||||
|  |     /// <param name="id">Identifier of entity</param> | ||||||
|  |     Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken); | ||||||
|  |  | ||||||
|  |     /// Add entity to storage | ||||||
|  |     /// <param name="entity">Entity to add</param> | ||||||
|  |     Task AddAsync(T entity, CancellationToken cancellationToken); | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Generic repository pattern |     /// Update entity in storage | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <typeparam name="T">Entity type</typeparam> |     /// <param name="entity">Entity to update</param> | ||||||
|     public interface IGenericRepository<T> where T : class, IEntity |     Task UpdateAsync(T entity, CancellationToken cancellationToken); | ||||||
|     { |  | ||||||
|         /// Get all entities from data storage |  | ||||||
|         Task<List<T>> GetAllAsync(CancellationToken cancellationToken); |  | ||||||
|  |  | ||||||
|         /// Get one entity with specific id |     /// <summary> | ||||||
|         /// <param name="id">Identifier of entity</param> |     /// Remove entity from storage | ||||||
|         Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken); |     /// </summary> | ||||||
|  |     /// <param name="entity">Entity to remove</param> | ||||||
|  |     void Remove(T entity); | ||||||
|  |  | ||||||
|         /// Add entity to storage |     /// Save changes in storage | ||||||
|         /// <param name="entity">Entity to add</param> |     Task SaveAsync(CancellationToken cancellationToken); | ||||||
|         Task AddAsync(T entity, CancellationToken cancellationToken); |  | ||||||
|  |  | ||||||
|         /// <summary> |  | ||||||
|         /// Update entity in storage |  | ||||||
|         /// </summary> |  | ||||||
|         /// <param name="entity">Entity to update</param> |  | ||||||
|         Task UpdateAsync(T entity, CancellationToken cancellationToken); |  | ||||||
|  |  | ||||||
|         /// <summary> |  | ||||||
|         /// Remove entity from storage |  | ||||||
|         /// </summary> |  | ||||||
|         /// <param name="entity">Entity to remove</param> |  | ||||||
|         void Remove(T entity); |  | ||||||
|  |  | ||||||
|         /// Save changes in storage |  | ||||||
|         Task SaveAsync(CancellationToken cancellationToken); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,25 +1,24 @@ | |||||||
| using Domains; | using Domains; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Generic | namespace Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
|  | /// Writes data to data storage | ||||||
|  | /// <remarks><see cref="IUnitOfWork"/> should be used to save changes</remarks> | ||||||
|  | public interface IGenericWriter | ||||||
| { | { | ||||||
|     /// Writes data to data storage |     /// Add entity to data storage | ||||||
|     /// <remarks><see cref="IUnitOfWork"/> should be used to save changes</remarks> |     /// <param name="entity">Entity to add</param> | ||||||
|     public interface IGenericWriter |     /// <param name="cancellationToken">Cancellation Token</param> | ||||||
|     { |     /// <typeparam name="T">Entity type</typeparam> | ||||||
|         /// Add entity to data storage |     Task AddAsync<T>(T entity, CancellationToken cancellationToken) where T : class, IEntity; | ||||||
|         /// <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 entity in data storage |     /// Update entity in data storage | ||||||
|         /// <param name="entity">Entity to update</param> |     /// <param name="entity">Entity to update</param> | ||||||
|         /// <typeparam name="T">Entity type</typeparam> |     /// <typeparam name="T">Entity type</typeparam> | ||||||
|         void Update<T>(T entity) where T : class, IEntity; |     void Update<T>(T entity) where T : class, IEntity; | ||||||
|  |  | ||||||
|         /// Remove entity from data storage |     /// Remove entity from data storage | ||||||
|         /// <param name="entity">Entity to remove</param> |     /// <param name="entity">Entity to remove</param> | ||||||
|         /// <typeparam name="T">Entity type</typeparam> |     /// <typeparam name="T">Entity type</typeparam> | ||||||
|         void Remove<T>(T entity) where T : class, IEntity; |     void Remove<T>(T entity) where T : class, IEntity; | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -1,9 +1,8 @@ | |||||||
| namespace Infrastructure.Database | namespace Infrastructure.Database; | ||||||
|  |  | ||||||
|  | public interface IUnitOfWork | ||||||
| { | { | ||||||
|     public interface IUnitOfWork |     /// Saves changes in data storage | ||||||
|     { |     /// <param name="cancellationToken">Cancellation Token</param> | ||||||
|         /// Saves changes in data storage |     Task SaveAsync(CancellationToken cancellationToken); | ||||||
|         /// <param name="cancellationToken">Cancellation Token</param> |  | ||||||
|         Task SaveAsync(CancellationToken cancellationToken); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @@ -2,15 +2,14 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Locations.Configuration | namespace Infrastructure.Database.Locations.Configuration; | ||||||
|  |  | ||||||
|  | public class CityConfiguration : IEntityTypeConfiguration<City> | ||||||
| { | { | ||||||
|     public class CityConfiguration : IEntityTypeConfiguration<City> |     public void Configure(EntityTypeBuilder<City> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<City> entity) |         entity.Property(p => p.Name) | ||||||
|         { |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.Name) |             .HasMaxLength(70); | ||||||
|                 .IsUnicode(false) |  | ||||||
|                 .HasMaxLength(70); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,15 +2,14 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Locations.Configuration | namespace Infrastructure.Database.Locations.Configuration; | ||||||
|  |  | ||||||
|  | public class CountryConfiguration : IEntityTypeConfiguration<Country> | ||||||
| { | { | ||||||
|     public class CountryConfiguration : IEntityTypeConfiguration<Country> |     public void Configure(EntityTypeBuilder<Country> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<Country> entity) |         entity.Property(p => p.Name) | ||||||
|         { |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.Name) |             .HasMaxLength(70); | ||||||
|                 .IsUnicode(false) |  | ||||||
|                 .HasMaxLength(70); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,14 +2,13 @@ | |||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Locations.Repositories.Cities | namespace Infrastructure.Database.Locations.Repositories.Cities; | ||||||
|  |  | ||||||
|  | public sealed class CitiesRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) | ||||||
|  |     : GenericRepository<City>(reader, writer, unitOfWork), ICitiesRepository | ||||||
| { | { | ||||||
|     public sealed class CitiesRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) |     protected override IQueryable<City> LoadDomain() | ||||||
|         : GenericRepository<City>(reader, writer, unitOfWork), ICitiesRepository |  | ||||||
|     { |     { | ||||||
|         protected override IQueryable<City> LoadDomain() |         return base.LoadDomain().Include(c => c.Country); | ||||||
|         { |  | ||||||
|             return base.LoadDomain().Include(c => c.Country); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,7 +1,6 @@ | |||||||
| using Domains.LocationDomain; | using Domains.LocationDomain; | ||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Locations.Repositories.Cities | namespace Infrastructure.Database.Locations.Repositories.Cities; | ||||||
| { |  | ||||||
|     public interface ICitiesRepository : IGenericRepository<City> { } | public interface ICitiesRepository : IGenericRepository<City> { } | ||||||
| } |  | ||||||
| @@ -2,14 +2,13 @@ | |||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Locations.Repositories.Countries | namespace Infrastructure.Database.Locations.Repositories.Countries; | ||||||
|  |  | ||||||
|  | public sealed class CountriesRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) | ||||||
|  |     : GenericRepository<Country>(reader, writer, unitOfWork), ICountriesRepository | ||||||
| { | { | ||||||
|     public sealed class CountriesRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) |     protected override IQueryable<Country> LoadDomain() | ||||||
|         : GenericRepository<Country>(reader, writer, unitOfWork), ICountriesRepository |  | ||||||
|     { |     { | ||||||
|         protected override IQueryable<Country> LoadDomain() |         return base.LoadDomain().Include(c => c.Cities); | ||||||
|         { |  | ||||||
|             return base.LoadDomain().Include(c => c.Cities); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,7 +1,6 @@ | |||||||
| using Domains.LocationDomain; | using Domains.LocationDomain; | ||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.Locations.Repositories.Countries | namespace Infrastructure.Database.Locations.Repositories.Countries; | ||||||
| { |  | ||||||
|     public interface ICountriesRepository : IGenericRepository<Country> { } | public interface ICountriesRepository : IGenericRepository<Country> { } | ||||||
| } |  | ||||||
| @@ -2,15 +2,14 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.VisaApplications.Configuration | namespace Infrastructure.Database.VisaApplications.Configuration; | ||||||
|  |  | ||||||
|  | public class PastVisaConfiguration : IEntityTypeConfiguration<PastVisa> | ||||||
| { | { | ||||||
|     public class PastVisaConfiguration : IEntityTypeConfiguration<PastVisa> |     public void Configure(EntityTypeBuilder<PastVisa> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<PastVisa> entity) |         entity.Property(p => p.Name) | ||||||
|         { |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.Name) |             .HasMaxLength(70); | ||||||
|                 .IsUnicode(false) |  | ||||||
|                 .HasMaxLength(70); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,15 +2,14 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.VisaApplications.Configuration | namespace Infrastructure.Database.VisaApplications.Configuration; | ||||||
|  |  | ||||||
|  | public class PermissionToDestCountryConfiguration : IEntityTypeConfiguration<PermissionToDestCountry> | ||||||
| { | { | ||||||
|     public class PermissionToDestCountryConfiguration : IEntityTypeConfiguration<PermissionToDestCountry> |     public void Configure(EntityTypeBuilder<PermissionToDestCountry> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<PermissionToDestCountry> entity) |         entity.Property(p => p.Issuer) | ||||||
|         { |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.Issuer) |             .HasMaxLength(200); | ||||||
|                 .IsUnicode(false) |  | ||||||
|                 .HasMaxLength(200); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,15 +2,14 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.VisaApplications.Configuration | namespace Infrastructure.Database.VisaApplications.Configuration; | ||||||
|  |  | ||||||
|  | public class ReentryPermitConfiguration : IEntityTypeConfiguration<ReentryPermit> | ||||||
| { | { | ||||||
|     public class ReentryPermitConfiguration : IEntityTypeConfiguration<ReentryPermit> |     public void Configure(EntityTypeBuilder<ReentryPermit> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<ReentryPermit> entity) |         entity.Property(p => p.Number) | ||||||
|         { |             .IsUnicode(false) | ||||||
|             entity.Property(p => p.Number) |             .HasMaxLength(25); | ||||||
|                 .IsUnicode(false) |  | ||||||
|                 .HasMaxLength(25); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,21 +2,22 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Builders; | using Microsoft.EntityFrameworkCore.Metadata.Builders; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.VisaApplications.Configuration | namespace Infrastructure.Database.VisaApplications.Configuration; | ||||||
|  |  | ||||||
|  | public class VisaApplicationConfiguration : IEntityTypeConfiguration<VisaApplication> | ||||||
| { | { | ||||||
|     public class VisaApplicationConfiguration : IEntityTypeConfiguration<VisaApplication> |     public void Configure(EntityTypeBuilder<VisaApplication> entity) | ||||||
|     { |     { | ||||||
|         public void Configure(EntityTypeBuilder<VisaApplication> entity) |         entity.ToTable("VisaApplications"); | ||||||
|         { |  | ||||||
|             entity.ToTable("VisaApplications"); |  | ||||||
|  |  | ||||||
|             entity.HasOne(va => va.Applicant) |         entity.HasOne(va => va.Applicant) | ||||||
|                 .WithMany(a => a.VisaApplications) |             .WithMany(a => a.VisaApplications) | ||||||
|                 .HasForeignKey(va => va.ApplicantId) |             .HasForeignKey(va => va.ApplicantId) | ||||||
|                 .IsRequired(); |             .IsRequired(); | ||||||
|  |  | ||||||
|             entity.OwnsOne(p => p.ReentryPermit); |         entity.OwnsOne(p => p.ReentryPermit); | ||||||
|             entity.OwnsOne(p => p.PermissionToDestCountry); |         entity.OwnsOne(p => p.PermissionToDestCountry); | ||||||
|         } |         entity.OwnsMany(p => p.PastVisits).ToTable("PastVisits"); | ||||||
|  |         entity.OwnsMany(p => p.PastVisas).ToTable("PastVisas"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| using Domains.VisaApplicationDomain; | using Domains.VisaApplicationDomain; | ||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.VisaApplications.Repositories | namespace Infrastructure.Database.VisaApplications.Repositories; | ||||||
| { |  | ||||||
|     public interface IVisaApplicationsRepository : IGenericRepository<VisaApplication> { } | public interface IVisaApplicationsRepository : IGenericRepository<VisaApplication> { } | ||||||
| } |  | ||||||
| @@ -2,17 +2,16 @@ | |||||||
| using Infrastructure.Database.Generic; | using Infrastructure.Database.Generic; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  |  | ||||||
| namespace Infrastructure.Database.VisaApplications.Repositories | namespace Infrastructure.Database.VisaApplications.Repositories; | ||||||
|  |  | ||||||
|  | public sealed class VisaApplicationsRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) | ||||||
|  |     : GenericRepository<VisaApplication>(reader, writer, unitOfWork), IVisaApplicationsRepository | ||||||
| { | { | ||||||
|     public sealed class VisaApplicationsRepository(IGenericReader reader, IGenericWriter writer, IUnitOfWork unitOfWork) |     protected override IQueryable<VisaApplication> LoadDomain() | ||||||
|         : GenericRepository<VisaApplication>(reader, writer, unitOfWork), IVisaApplicationsRepository |  | ||||||
|     { |     { | ||||||
|         protected override IQueryable<VisaApplication> LoadDomain() |         return base.LoadDomain() | ||||||
|         { |             .Include(a => a.DestinationCountry) | ||||||
|             return base.LoadDomain() |             .Include(a => a.PastVisas) | ||||||
|                 .Include(a => a.DestinationCountry) |             .Include(a => a.PastVisits); | ||||||
|                 .Include(a => a.PastVisas) |  | ||||||
|                 .Include(a => a.PastVisits); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -8,28 +8,27 @@ using Microsoft.EntityFrameworkCore; | |||||||
| using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||||
| using DbContext = Infrastructure.Database.DbContext; | using DbContext = Infrastructure.Database.DbContext; | ||||||
|  |  | ||||||
| namespace Infrastructure | namespace Infrastructure; | ||||||
|  |  | ||||||
|  | /// Provides methods to add services to DI-container | ||||||
|  | public static class DependencyInjection | ||||||
| { | { | ||||||
|     /// Provides methods to add services to DI-container |     /// Add services needed for Infrastructure layer | ||||||
|     public static class DependencyInjection |     public static IServiceCollection AddInfrastructure(this IServiceCollection services) | ||||||
|     { |     { | ||||||
|         /// Add services needed for Infrastructure layer |         //TODO строка подключения | ||||||
|         public static IServiceCollection AddInfrastructure(this IServiceCollection services) |         services.AddDbContext<DbContext>(opts => | ||||||
|         { |             opts.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=visadb;Integrated Security=True;")); | ||||||
|             //TODO строка подключения |  | ||||||
|             services.AddDbContext<DbContext>(opts => |  | ||||||
|                 opts.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=visadb;Integrated Security=True;")); |  | ||||||
|  |  | ||||||
|             services.AddScoped<IGenericReader>(serviceProvider => serviceProvider.GetRequiredService<DbContext>()); |         services.AddScoped<IGenericReader>(serviceProvider => serviceProvider.GetRequiredService<DbContext>()); | ||||||
|             services.AddScoped<IGenericWriter>(serviceProvider => serviceProvider.GetRequiredService<DbContext>()); |         services.AddScoped<IGenericWriter>(serviceProvider => serviceProvider.GetRequiredService<DbContext>()); | ||||||
|             services.AddScoped<IUnitOfWork>(serviceProvider => serviceProvider.GetRequiredService<DbContext>()); |         services.AddScoped<IUnitOfWork>(serviceProvider => serviceProvider.GetRequiredService<DbContext>()); | ||||||
|  |  | ||||||
|             services.AddScoped<IApplicantsRepository, ApplicantsRepository>(); |         services.AddScoped<IApplicantsRepository, ApplicantsRepository>(); | ||||||
|             services.AddScoped<IVisaApplicationsRepository, VisaApplicationsRepository>(); |         services.AddScoped<IVisaApplicationsRepository, VisaApplicationsRepository>(); | ||||||
|             services.AddScoped<ICitiesRepository, CitiesRepository>(); |         services.AddScoped<ICitiesRepository, CitiesRepository>(); | ||||||
|             services.AddScoped<ICountriesRepository, CountriesRepository>(); |         services.AddScoped<ICountriesRepository, CountriesRepository>(); | ||||||
|  |  | ||||||
|             return services; |         return services; | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,31 +1,30 @@ | |||||||
| using System.Reflection; | using System.Reflection; | ||||||
| using Infrastructure; | using Infrastructure; | ||||||
|  |  | ||||||
| namespace SchengenVisaApi | namespace SchengenVisaApi; | ||||||
|  |  | ||||||
|  | /// Provides methods to add services to DI-container | ||||||
|  | public static class DependencyInjection | ||||||
| { | { | ||||||
|     /// Provides methods to add services to DI-container |     /// Add needed services | ||||||
|     public static class DependencyInjection |     public static IServiceCollection RegisterServices(this IServiceCollection services) | ||||||
|     { |     { | ||||||
|         /// Add needed services |         services | ||||||
|         public static IServiceCollection RegisterServices(this IServiceCollection services) |             .AddInfrastructure() | ||||||
|         { |             .AddPresentation(); | ||||||
|             services |  | ||||||
|                 .AddInfrastructure() |  | ||||||
|                 .AddPresentation(); |  | ||||||
|  |  | ||||||
|             return services; |         return services; | ||||||
|         } |     } | ||||||
|  |  | ||||||
|         /// Add services needed for Presentation layer |     /// Add services needed for Presentation layer | ||||||
|         private static void AddPresentation(this IServiceCollection services) |     private static void AddPresentation(this IServiceCollection services) | ||||||
|  |     { | ||||||
|  |         services.AddControllers(); | ||||||
|  |         services.AddEndpointsApiExplorer(); | ||||||
|  |         services.AddSwaggerGen(options => | ||||||
|         { |         { | ||||||
|             services.AddControllers(); |             var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; | ||||||
|             services.AddEndpointsApiExplorer(); |             options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); | ||||||
|             services.AddSwaggerGen(options => |         }); | ||||||
|             { |  | ||||||
|                 var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; |  | ||||||
|                 options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,5 +1,4 @@ | |||||||
| namespace SchengenVisaApi; | namespace SchengenVisaApi; | ||||||
|  |  | ||||||
| #pragma warning disable CS1591 | #pragma warning disable CS1591 | ||||||
| public class Program | public class Program | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,19 +1,18 @@ | |||||||
| namespace SchengenVisaApi | namespace SchengenVisaApi; | ||||||
|  |  | ||||||
|  | /// Provides methods for configuring middleware | ||||||
|  | public static class PipelineRequest | ||||||
| { | { | ||||||
|     /// Provides methods for configuring middleware |     /// Configure middleware | ||||||
|     public static class PipelineRequest |     public static WebApplication ConfigurePipelineRequest(this WebApplication app) | ||||||
|     { |     { | ||||||
|         /// Configure middleware |         app.UseSwagger() | ||||||
|         public static WebApplication ConfigurePipelineRequest(this WebApplication app) |             .UseSwaggerUI(); | ||||||
|         { |  | ||||||
|             app.UseSwagger() |  | ||||||
|                 .UseSwaggerUI(); |  | ||||||
|  |  | ||||||
|             app.UseHttpsRedirection(); |         app.UseHttpsRedirection(); | ||||||
|  |  | ||||||
|             app.MapControllers(); |         app.MapControllers(); | ||||||
|  |  | ||||||
|             return app; |         return app; | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user