This commit is contained in:
2024-08-12 17:38:02 +03:00
parent 14f9092f63
commit 5db1d1b1c5
22 changed files with 316 additions and 55 deletions

View File

@@ -0,0 +1,47 @@
using Domains.Common;
namespace Domains.ApplicantDomain
{
/// Model of an applicant
public class Applicant : IEntity
{
/// Unique identifier of the <see cref="Applicant"/>
public Guid Id { get; set; }
/// Full name of the <see cref="Applicant"/>
public Name Name { get; set; } = null!;
/// Date of birth of the <see cref="Applicant"/>
public DateOnly BirthDate { get; set; }
/// <see cref="Country"/> of birth of the <see cref="Applicant"/>
public Country CountryOfBirth { get; set; } = null!;
/// <see cref="City"/> of birth of the <see cref="Applicant"/>
public City CityOfBirth { get; set; } = null!;
/// Citizenship of <see cref="Applicant"/>
public string Citizenship { get; set; } = null!;
/// Citizenship by birth of <see cref="Applicant"/>
public string CitizenshipByBirth { get; set; } = null!;
/// Gender of <see cref="Applicant"/>
public Gender Gender { get; set; }
/// Marital status of <see cref="Applicant"/>
public MaritalStatus MaritalStatus { get; set; }
/// Full name of the <see cref="Applicant"/>'s father
public Name FatherName { get; set; } = null!;
/// Full name of the <see cref="Applicant"/>'s mother
public Name MotherName { get; set; } = null!;
/// Place of <see cref="Applicant"/>'s work
public PlaceOfWork PlaceOfWork { get; set; } = null!;
/// Is <see cref="Applicant"/> a non-resident
public bool IsNonResident { get; set; }
}
}

View File

@@ -0,0 +1,10 @@
namespace Domains.ApplicantDomain
{
public enum Gender
{
Unknown,
Male,
Female,
Turkish
}
}

View File

@@ -0,0 +1,11 @@
namespace Domains.ApplicantDomain
{
public enum MaritalStatus
{
Other,
Married,
Unmarried,
Separated,
WidowOrWidower
}
}

View File

@@ -0,0 +1,13 @@
namespace Domains.ApplicantDomain
{
/// Model of full name
/// <remarks>Owned</remarks>
public class Name
{
public string FirstName { get; set; } = null!;
public string Surname { get; set; } = null!;
public string? Patronymic { get; set; }
}
}

View File

@@ -0,0 +1,21 @@
namespace Domains.ApplicantDomain
{
/// Model of passport
public class Passport : IEntity
{
/// Unique identifier of <see cref="Passport"/>
public Guid Id { get; set; } = Guid.NewGuid();
/// Number of <see cref="Passport"/>
public string Number { get; set; }
/// Issuing authority of <see cref="Passport"/>
public string Issuer { get; set; }
/// Date of issue
public DateOnly IssueDate { get; set; }
/// Date when the <see cref="Passport"/> expires
public DateOnly ExpirationDate { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
using Domains.Common;
namespace Domains.ApplicantDomain
{
public class PlaceOfWork : IEntity
{
/// Unique identifier of <see cref="PlaceOfWork"/>
public Guid Id { get; private set; } = Guid.NewGuid();
/// Name of hirer
public string Name { get; set; } = null!;
/// <see cref="Domains.Common.Address"/> of hirer
public Address Address { get; set; } = null!;
/// Phone number of hirer
public string PhoneNum { get; set; } = null!;
}
}

View File

@@ -0,0 +1,19 @@
namespace Domains.Common
{
/// Model of address
/// <remarks>Owned</remarks>
public class Address
{
/// Country part of address
public Country Country { get; set; } = null!;
/// City part of address
public City City { get; set; } = null!;
/// Street part of address
public string Street { get; set; } = null!;
/// Building part of address
public string Building { get; set; } = null!;
}
}

View File

@@ -0,0 +1,15 @@
namespace Domains.Common
{
/// Model of a city
public class City : IEntity
{
/// Unique identifier of the city
public Guid Id { get; private set; } = Guid.NewGuid();
/// Name of the city
public string Name { get; set; } = null!;
/// <see cref="Domains.Common.Country"/> in which the city is located
public Country Country { get; set; } = null!;
}
}

View File

@@ -0,0 +1,15 @@
namespace Domains.Common
{
/// Model of a country
public class Country : IEntity
{
/// Name of the country
public string Name { get; set; } = null!;
/// Located in Schengen area
public bool IsSchengen { get; set; }
/// List of <see cref="City"/> that country have
public List<City> Cities { get; set; } = null!;
}
}

View File

@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,5 @@
namespace Domains
{
/// Interface that every entity should inherit from
public interface IEntity { }
}

View File

@@ -0,0 +1,20 @@
using Domains.ApplicantDomain;
namespace Domains.VisaApplicationDomain
{
/// Visa that <see cref="Applicant"/> already had
public class PastVisa : IEntity
{
/// Unique identifier of <see cref="PastVisa"/>
public Guid Id { get; private set; } = Guid.NewGuid();
/// Date of issue
public DateOnly IssueDate { get; set; }
/// Name of visa
public string Name { get; set; } = null!;
/// Date when visa expires
public DateOnly ExpirationDate { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using Domains.ApplicantDomain;
namespace Domains.VisaApplicationDomain
{
/// Visit in a Schengen country that <see cref="Applicant"/> already had
public class PastVisit : IEntity
{
/// Unique identifier of <see cref="PastVisit"/>
public Guid Id { get; private set; } = Guid.NewGuid();
/// First day of <see cref="PastVisit"/>
public DateOnly StartDate { get; set; }
/// Last day of <see cref="PastVisit"/>
public DateOnly EndDate { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
namespace Domains.VisaApplicationDomain
{
/// Permission to enter the destination country
/// <remarks>Owned</remarks>
public class PermissionToDestCountry
{
/// Date when <see cref="PermissionToDestCountry"/> expires
public DateOnly ExpirationDate { get; set; }
/// Issuing authority
public string Issuer { get; set; } = null!;
}
}

View File

@@ -0,0 +1,12 @@
namespace Domains.VisaApplicationDomain
{
/// Permission to enter a country the issuer wants to come from
public class ReentryPermit : IEntity
{
/// Unique identifier of <see cref="PastVisa"/>
public Guid Id { get; private set; } = Guid.NewGuid();
/// Date when <see cref="ReentryPermit"/> expires
public DateOnly ExpirationDate { get; set; }
}
}

View File

@@ -0,0 +1,33 @@
using Domains.ApplicantDomain;
using Domains.Common;
namespace Domains.VisaApplicationDomain
{
/// Model of visit request
public class VisaApplication : IEntity
{
/// Unique identifier of <see cref="VisaApplication"/>
public Guid Id { get; private set; } = Guid.NewGuid();
/// Applicant of <see cref="VisaApplication"/>
public Applicant Applicant { get; set; } = null!;
/// <inheritdoc cref="Domains.VisaApplicationDomain.ReentryPermit"/>
/// <remarks>always null if <see cref="Applicant"/> is not a non-resident</remarks>
public ReentryPermit? ReentryPermit { get; set; }
/// <see cref="Country"/> that <see cref="Applicant"/> wants to visit
public Country DestinationCountry { get; set; } = null!;
/// <summary>
/// List of <see cref="PastVisa"/> that applicant had before
/// </summary>
public List<PastVisa> PastVisas { get; set; } = null!;
/// Permission to enter the destination country of <see cref="Applicant"/>
/// <remarks>always null if <see cref="DestinationCountry"/> is Schengen</remarks>
public PermissionToDestCountry? PermissionToDestCountry { get; set; }
public List<PastVisit> PastVisits { get; set; } = null!;
}
}

View File

@@ -2,6 +2,8 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchengenVisaApi", "SchengenVisaApi\SchengenVisaApi.csproj", "{BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchengenVisaApi", "SchengenVisaApi\SchengenVisaApi.csproj", "{BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domains", "Domains\Domains.csproj", "{5DC8BC74-5A1F-48E3-9EB8-6C50CD3D7778}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -12,5 +14,9 @@ Global
{BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}.Release|Any CPU.ActiveCfg = Release|Any CPU {BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}.Release|Any CPU.Build.0 = Release|Any CPU {BA957CD4-48D1-4B24-A0E0-BA57B84B1DC3}.Release|Any CPU.Build.0 = Release|Any CPU
{5DC8BC74-5A1F-48E3-9EB8-6C50CD3D7778}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5DC8BC74-5A1F-48E3-9EB8-6C50CD3D7778}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5DC8BC74-5A1F-48E3-9EB8-6C50CD3D7778}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5DC8BC74-5A1F-48E3-9EB8-6C50CD3D7778}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@@ -0,0 +1,20 @@
using Microsoft.AspNetCore.Mvc;
namespace SchengenVisaApi.Controllers;
[ApiController]
[Route("[controller]")]
public class VisaApplicationController : ControllerBase
{
public VisaApplicationController()
{
}
[HttpGet]
public void Create()
{
throw new NotImplementedException();
}
}

View File

@@ -1,32 +0,0 @@
using Microsoft.AspNetCore.Mvc;
namespace SchengenVisaApi.Controllers;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

View File

@@ -1,26 +1,24 @@
using System.Reflection;
namespace SchengenVisaApi; namespace SchengenVisaApi;
#pragma warning disable CS1591
public class Program public class Program
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); builder.Services.AddSwaggerGen(options =>
{
var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
});
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
}
app.UseHttpsRedirection(); app.UseHttpsRedirection();
@@ -31,4 +29,5 @@ public class Program
app.Run(); app.Run();
} }
} }
#pragma warning restore CS1591

View File

@@ -5,6 +5,7 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization> <InvariantGlobalization>true</InvariantGlobalization>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,12 +0,0 @@
namespace SchengenVisaApi;
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}