From 96acf03acf3c76b9e553098f2ec6f913a83f1b25 Mon Sep 17 00:00:00 2001 From: prtsie Date: Wed, 28 Aug 2024 12:46:58 +0300 Subject: [PATCH 01/30] Added client library --- SchengenVisaApi/SchengenVisaApi.sln | 6 + SchengenVisaApi/VisaApiClient/Client.cs | 2060 +++++++++++++++++ SchengenVisaApi/VisaApiClient/ClientBase.cs | 39 + .../VisaApiClient/VisaApiClient.csproj | 13 + 4 files changed, 2118 insertions(+) create mode 100644 SchengenVisaApi/VisaApiClient/Client.cs create mode 100644 SchengenVisaApi/VisaApiClient/ClientBase.cs create mode 100644 SchengenVisaApi/VisaApiClient/VisaApiClient.csproj diff --git a/SchengenVisaApi/SchengenVisaApi.sln b/SchengenVisaApi/SchengenVisaApi.sln index 2b17885..294420a 100644 --- a/SchengenVisaApi/SchengenVisaApi.sln +++ b/SchengenVisaApi/SchengenVisaApi.sln @@ -8,6 +8,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApplicationLayer", "Applica EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Infrastructure", "Infrastructure\Infrastructure.csproj", "{2BE88B8B-10CE-48AA-9884-ABEE4A4487F7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisaApiClient", "VisaApiClient\VisaApiClient.csproj", "{46172CC0-8935-4158-9B7F-50FCCBDB6F67}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -30,5 +32,9 @@ Global {2BE88B8B-10CE-48AA-9884-ABEE4A4487F7}.Debug|Any CPU.Build.0 = Debug|Any CPU {2BE88B8B-10CE-48AA-9884-ABEE4A4487F7}.Release|Any CPU.ActiveCfg = Release|Any CPU {2BE88B8B-10CE-48AA-9884-ABEE4A4487F7}.Release|Any CPU.Build.0 = Release|Any CPU + {46172CC0-8935-4158-9B7F-50FCCBDB6F67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46172CC0-8935-4158-9B7F-50FCCBDB6F67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46172CC0-8935-4158-9B7F-50FCCBDB6F67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46172CC0-8935-4158-9B7F-50FCCBDB6F67}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs new file mode 100644 index 0000000..53062d3 --- /dev/null +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -0,0 +1,2060 @@ +//---------------------- +// +// Generated using the NSwag toolchain v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) +// +//---------------------- + +#nullable enable + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 612 // Disable "CS0612 '...' is obsolete" +#pragma warning disable 649 // Disable "CS0649 Field is never assigned to, and will always have its default value null" +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." +#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" +#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant" +#pragma warning disable 8603 // Disable "CS8603 Possible null reference return" +#pragma warning disable 8604 // Disable "CS8604 Possible null reference argument for parameter" +#pragma warning disable 8625 // Disable "CS8625 Cannot convert null literal to non-nullable reference type" +#pragma warning disable 8765 // Disable "CS8765 Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes)." + +namespace VisaApiClient +{ + using System = global::System; + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Client : ClientBase + { + #pragma warning disable 8618 + private string _baseUrl; + #pragma warning restore 8618 + + private System.Net.Http.HttpClient _httpClient; + private static System.Lazy _settings = new System.Lazy(CreateSerializerSettings, true); + private Newtonsoft.Json.JsonSerializerSettings _instanceSettings; + + #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + public Client(string baseUrl, System.Net.Http.HttpClient httpClient) + #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + { + BaseUrl = baseUrl; + _httpClient = httpClient; + Initialize(); + } + + private static Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set + { + _baseUrl = value; + if (!string.IsNullOrEmpty(_baseUrl) && !_baseUrl.EndsWith("/")) + _baseUrl += '/'; + } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _instanceSettings ?? _settings.Value; } } + + static partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void Initialize(); + + /// + /// Adds applicant with user account + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RegisterAsync(RegisterApplicantRequest? body) + { + return RegisterAsync(body, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Adds applicant with user account + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RegisterAsync(RegisterApplicantRequest? body, System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(body, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/register" + urlBuilder_.Append("users/register"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 409) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Adds approving authority with user account + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RegisterAuthorityAsync(RegisterRequest? body) + { + return RegisterAuthorityAsync(body, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Adds approving authority with user account + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RegisterAuthorityAsync(RegisterRequest? body, System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(body, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/authorities" + urlBuilder_.Append("users/authorities"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 409) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Returns list of authority accounts + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetAuthorityAccountsAsync() + { + return GetAuthorityAccountsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Returns list of authority accounts + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetAuthorityAccountsAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/authorities" + urlBuilder_.Append("users/authorities"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Returns JWT-token for authentication + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task LoginAsync(string? email, string? password) + { + return LoginAsync(email, password, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Returns JWT-token for authentication + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task LoginAsync(string? email, string? password, System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/login" + urlBuilder_.Append("users/login"); + urlBuilder_.Append('?'); + if (email != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("email")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(email, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + if (password != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("password")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(password, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + urlBuilder_.Length--; + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Changes authority's account authentication data + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ChangeAuthorityAuthDataAsync(System.Guid authorityAccountId, AuthData? body) + { + return ChangeAuthorityAuthDataAsync(authorityAccountId, body, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Changes authority's account authentication data + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ChangeAuthorityAuthDataAsync(System.Guid authorityAccountId, AuthData? body, System.Threading.CancellationToken cancellationToken) + { + if (authorityAccountId == null) + throw new System.ArgumentNullException("authorityAccountId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(body, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/authorities/{authorityAccountId}" + urlBuilder_.Append("users/authorities/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(authorityAccountId, System.Globalization.CultureInfo.InvariantCulture))); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Removes authority's account + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RemoveAuthorityAccountAsync(System.Guid authorityAccountId) + { + return RemoveAuthorityAccountAsync(authorityAccountId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Removes authority's account + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RemoveAuthorityAccountAsync(System.Guid authorityAccountId, System.Threading.CancellationToken cancellationToken) + { + if (authorityAccountId == null) + throw new System.ArgumentNullException("authorityAccountId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/authorities/{authorityAccountId}" + urlBuilder_.Append("users/authorities/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(authorityAccountId, System.Globalization.CultureInfo.InvariantCulture))); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Returns pending applications + /// + /// + /// Accessible only for approving authorities + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetPendingAsync() + { + return GetPendingAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Returns pending applications + /// + /// + /// Accessible only for approving authorities + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetPendingAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "visaApplications/pending" + urlBuilder_.Append("visaApplications/pending"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Returns all applications of one applicant + /// + /// + /// Returns applications of authorized applicant + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetForApplicantAsync() + { + return GetForApplicantAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Returns all applications of one applicant + /// + /// + /// Returns applications of authorized applicant + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetForApplicantAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "visaApplications/ofApplicant" + urlBuilder_.Append("visaApplications/ofApplicant"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Adds new application + /// + /// + /// Adds application for authorized applicant + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateApplicationAsync(VisaApplicationCreateRequest? body) + { + return CreateApplicationAsync(body, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Adds new application + /// + /// + /// Adds application for authorized applicant + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateApplicationAsync(VisaApplicationCreateRequest? body, System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(body, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "visaApplications" + urlBuilder_.Append("visaApplications"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Sets application status to closed + /// + /// + /// Accessible only for applicant + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CloseApplicationAsync(System.Guid applicationId) + { + return CloseApplicationAsync(applicationId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Sets application status to closed + /// + /// + /// Accessible only for applicant + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CloseApplicationAsync(System.Guid applicationId, System.Threading.CancellationToken cancellationToken) + { + if (applicationId == null) + throw new System.ArgumentNullException("applicationId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("PATCH"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "visaApplications/{applicationId}" + urlBuilder_.Append("visaApplications/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(applicationId, System.Globalization.CultureInfo.InvariantCulture))); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Approve or reject applications + /// + /// + /// Accessible only for authorities + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task SetStatusFromAuthorityAsync(System.Guid applicationId, AuthorityRequestStatuses? status) + { + return SetStatusFromAuthorityAsync(applicationId, status, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Approve or reject applications + /// + /// + /// Accessible only for authorities + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task SetStatusFromAuthorityAsync(System.Guid applicationId, AuthorityRequestStatuses? status, System.Threading.CancellationToken cancellationToken) + { + if (applicationId == null) + throw new System.ArgumentNullException("applicationId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("PATCH"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "visaApplications/approving/{applicationId}" + urlBuilder_.Append("visaApplications/approving/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(applicationId, System.Globalization.CultureInfo.InvariantCulture))); + urlBuilder_.Append('?'); + if (status != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("status")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(status, System.Globalization.CultureInfo.InvariantCulture))).Append('&'); + } + urlBuilder_.Length--; + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value is string[]) + { + return string.Join(",", (string[])value); + } + else if (value.GetType().IsArray) + { + var valueArray = (System.Array)value; + var valueTextArray = new string[valueArray.Length]; + for (var i = 0; i < valueArray.Length; i++) + { + valueTextArray[i] = ConvertToString(valueArray.GetValue(i), cultureInfo); + } + return string.Join(",", valueTextArray); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Address + { + [Newtonsoft.Json.JsonProperty("country", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Country { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("city", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? City { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("street", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Street { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("building", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Building { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApplicantModel + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Name Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Passport Passport { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset BirthDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("countryOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? CountryOfBirth { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("cityOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? CityOfBirth { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("citizenship", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Citizenship { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("citizenshipByBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? CitizenshipByBirth { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public Gender Gender { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public MaritalStatus MaritalStatus { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Name FatherName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Name MotherName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("jobTitle", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? JobTitle { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PlaceOfWork PlaceOfWork { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsNonResident { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum ApplicationStatus + { + + [System.Runtime.Serialization.EnumMember(Value = @"Pending")] + Pending = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Approved")] + Approved = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Rejected")] + Rejected = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"Closed")] + Closed = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AuthData + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Password { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum AuthorityRequestStatuses + { + + [System.Runtime.Serialization.EnumMember(Value = @"Approved")] + Approved = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Rejected")] + Rejected = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum Gender + { + + [System.Runtime.Serialization.EnumMember(Value = @"Unknown")] + Unknown = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Male")] + Male = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Female")] + Female = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"Turkish")] + Turkish = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum MaritalStatus + { + + [System.Runtime.Serialization.EnumMember(Value = @"Other")] + Other = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Married")] + Married = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Unmarried")] + Unmarried = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"Separated")] + Separated = 3, + + [System.Runtime.Serialization.EnumMember(Value = @"WidowOrWidower")] + WidowOrWidower = 4, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Name + { + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? FirstName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("surname", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Surname { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("patronymic", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Patronymic { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Passport + { + [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Number { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Issuer { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("issueDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset IssueDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset ExpirationDate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PastVisa + { + [Newtonsoft.Json.JsonProperty("issueDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset IssueDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset ExpirationDate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PastVisit + { + [Newtonsoft.Json.JsonProperty("startDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset StartDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("endDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset EndDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? DestinationCountry { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PermissionToDestCountry + { + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset ExpirationDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Issuer { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PlaceOfWork + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("address", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Address Address { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNum", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNum { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PlaceOfWorkModel + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("address", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Address Address { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNum", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNum { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProblemDetails + { + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Type { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("title", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Title { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Status { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("detail", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Detail { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("instance", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Instance { get; set; } = default!; + + private System.Collections.Generic.IDictionary? _additionalProperties; + + [Newtonsoft.Json.JsonExtensionData] + public System.Collections.Generic.IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ReentryPermit + { + [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Number { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset ExpirationDate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RegisterApplicantRequest + { + [Newtonsoft.Json.JsonProperty("authData", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AuthData AuthData { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("applicantName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Name ApplicantName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Passport Passport { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset BirthDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("cityOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? CityOfBirth { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("countryOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? CountryOfBirth { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("citizenship", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Citizenship { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("citizenshipByBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? CitizenshipByBirth { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public Gender Gender { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public MaritalStatus MaritalStatus { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Name FatherName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Name MotherName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("jobTitle", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? JobTitle { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PlaceOfWorkModel PlaceOfWork { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsNonResident { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RegisterRequest + { + [Newtonsoft.Json.JsonProperty("authData", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AuthData AuthData { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum RequestedNumberOfEntries + { + + [System.Runtime.Serialization.EnumMember(Value = @"Many")] + Many = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"One")] + One = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Two")] + Two = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum Role + { + + [System.Runtime.Serialization.EnumMember(Value = @"Applicant")] + Applicant = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"ApprovingAuthority")] + ApprovingAuthority = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Admin")] + Admin = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class User + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("role", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public Role Role { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Password { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class VisaApplicationCreateRequest + { + [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ReentryPermit ReentryPermit { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? DestinationCountry { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public VisaCategory VisaCategory { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("isForGroup", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsForGroup { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("validDaysRequested", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int ValidDaysRequested { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? PastVisas { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountry PermissionToDestCountry { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? PastVisits { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class VisaApplicationModelForApplicant + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public ApplicationStatus Status { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ReentryPermit ReentryPermit { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? DestinationCountry { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? PastVisas { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountry PermissionToDestCountry { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? PastVisits { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public VisaCategory VisaCategory { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("forGroup", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool ForGroup { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("requestDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset RequestDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("validDaysRequested", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int ValidDaysRequested { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class VisaApplicationModelForAuthority + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("applicant", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ApplicantModel Applicant { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public ApplicationStatus Status { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ReentryPermit ReentryPermit { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? DestinationCountry { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? PastVisas { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountry PermissionToDestCountry { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? PastVisits { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public VisaCategory VisaCategory { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("forGroup", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool ForGroup { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("requestDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset RequestDate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("validDaysRequested", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int ValidDaysRequested { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum VisaCategory + { + + [System.Runtime.Serialization.EnumMember(Value = @"Transit")] + Transit = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"ShortDated")] + ShortDated = 1, + + } + + + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : System.Exception + { + public int StatusCode { get; private set; } + + public string? Response { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception? innerException) + : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) + { + StatusCode = statusCode; + Response = response; + Headers = headers; + } + + public override string ToString() + { + return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : ApiException + { + public TResult Result { get; private set; } + + public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception? innerException) + : base(message, statusCode, response, headers, innerException) + { + Result = result; + } + } + +} + +#pragma warning restore 108 +#pragma warning restore 114 +#pragma warning restore 472 +#pragma warning restore 612 +#pragma warning restore 1573 +#pragma warning restore 1591 +#pragma warning restore 8073 +#pragma warning restore 3016 +#pragma warning restore 8603 +#pragma warning restore 8604 +#pragma warning restore 8625 diff --git a/SchengenVisaApi/VisaApiClient/ClientBase.cs b/SchengenVisaApi/VisaApiClient/ClientBase.cs new file mode 100644 index 0000000..ecc1532 --- /dev/null +++ b/SchengenVisaApi/VisaApiClient/ClientBase.cs @@ -0,0 +1,39 @@ +using System.Text; + +namespace VisaApiClient +{ + public class ClientBase + { + private const string LoginPath = "users/login"; + + protected string? AuthToken { get; private set; } + + protected void SetAuthToken(string token) + { + AuthToken = token; + } + + protected Task CreateHttpRequestMessageAsync(CancellationToken cancellationToken) + { + var msg = new HttpRequestMessage(); + msg.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", AuthToken); + return Task.FromResult(msg); + } + + + protected async Task PrepareRequestAsync(HttpClient client, HttpRequestMessage request, string url, CancellationToken cancellationToken) + => await Task.CompletedTask; + + protected async Task PrepareRequestAsync(HttpClient client, HttpRequestMessage request, StringBuilder urlBuilder, CancellationToken cancellationToken) + => await Task.CompletedTask; + + protected async Task ProcessResponseAsync(HttpClient client, HttpResponseMessage response, CancellationToken cancellationToken) + { + if (response.RequestMessage!.RequestUri!.AbsolutePath == LoginPath) + { + var token = await response.Content.ReadAsStringAsync(cancellationToken); + SetAuthToken(token); + } + } + } +} diff --git a/SchengenVisaApi/VisaApiClient/VisaApiClient.csproj b/SchengenVisaApi/VisaApiClient/VisaApiClient.csproj new file mode 100644 index 0000000..a9c778a --- /dev/null +++ b/SchengenVisaApi/VisaApiClient/VisaApiClient.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + From ce077ad6b92a2a501b537cd8b198307d07d6ecea Mon Sep 17 00:00:00 2001 From: prtsie Date: Wed, 28 Aug 2024 14:25:27 +0300 Subject: [PATCH 02/30] Created blazor web-assembly project by template --- .../BlazorWebAssemblyVisaApiClient/App.razor | 12 ++ .../BlazorWebAssemblyVisaApiClient.csproj | 14 +++ .../Layout/MainLayout.razor | 16 +++ .../Layout/MainLayout.razor.css | 77 +++++++++++++ .../Layout/NavMenu.razor | 40 +++++++ .../Layout/NavMenu.razor.css | 83 ++++++++++++++ .../Pages/Counter.razor | 19 ++++ .../Pages/Home.razor | 7 ++ .../Pages/Weather.razor | 60 ++++++++++ .../BlazorWebAssemblyVisaApiClient/Program.cs | 18 +++ .../Properties/launchSettings.json | 41 +++++++ .../_Imports.razor | 10 ++ .../wwwroot/css/app.css | 103 ++++++++++++++++++ .../wwwroot/css/bootstrap/bootstrap.min.css | 7 ++ .../css/bootstrap/bootstrap.min.css.map | 1 + .../wwwroot/favicon.png | Bin 0 -> 1148 bytes .../wwwroot/icon-192.png | Bin 0 -> 2626 bytes .../wwwroot/index.html | 32 ++++++ .../wwwroot/sample-data/weather.json | 27 +++++ SchengenVisaApi/SchengenVisaApi.sln | 6 + 20 files changed, 573 insertions(+) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor.css create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor.css create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Counter.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Home.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Weather.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Properties/launchSettings.json create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css.map create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/favicon.png create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/icon-192.png create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/sample-data/weather.json diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor new file mode 100644 index 0000000..a8cf817 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor @@ -0,0 +1,12 @@ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj new file mode 100644 index 0000000..e7cf21b --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor new file mode 100644 index 0000000..c44193d --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor @@ -0,0 +1,16 @@ +@inherits LayoutComponentBase +
+ + +
+
+ About +
+ +
+ @Body +
+
+
diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor.css b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor.css new file mode 100644 index 0000000..ecf25e5 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/MainLayout.razor.css @@ -0,0 +1,77 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor new file mode 100644 index 0000000..b03233d --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor @@ -0,0 +1,40 @@ + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor.css b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor.css new file mode 100644 index 0000000..881d128 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor.css @@ -0,0 +1,83 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Counter.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Counter.razor new file mode 100644 index 0000000..7f483c9 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Counter.razor @@ -0,0 +1,19 @@ +@page "/counter" + +Counter + +

Counter

+ +

Current count: @currentCount

+ + + +@code { + private int currentCount = 0; + + private void IncrementCount() + { + currentCount++; + } + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Home.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Home.razor new file mode 100644 index 0000000..9001e0b --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Home.razor @@ -0,0 +1,7 @@ +@page "/" + +Home + +

Hello, world!

+ +Welcome to your new app. diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Weather.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Weather.razor new file mode 100644 index 0000000..e78bc29 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Weather.razor @@ -0,0 +1,60 @@ +@page "/weather" +@inject HttpClient Http + +Weather + +

Weather

+ +

This component demonstrates fetching data from the server.

+ +@if (forecasts == null) +{ +

+ Loading... +

+} +else +{ + + + + + + + + + + + @foreach (var forecast in forecasts) + { + + + + + + + } + +
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
+} + +@code { + private WeatherForecast[]? forecasts; + + protected override async Task OnInitializedAsync() + { + forecasts = await Http.GetFromJsonAsync("sample-data/weather.json"); + } + + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public string? Summary { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + } + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs new file mode 100644 index 0000000..4832aee --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; + +namespace BlazorWebAssemblyVisaApiClient; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); + + await builder.Build().RunAsync(); + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Properties/launchSettings.json b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Properties/launchSettings.json new file mode 100644 index 0000000..4b1258b --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:25927", + "sslPort": 44345 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5038", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7200;http://localhost:5038", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor new file mode 100644 index 0000000..9a36077 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor @@ -0,0 +1,10 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using BlazorWebAssemblyVisaApiClient +@using BlazorWebAssemblyVisaApiClient.Layout diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css new file mode 100644 index 0000000..54a8aa3 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css @@ -0,0 +1,103 @@ +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css new file mode 100644 index 0000000..02ae65b --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-rgb:33,37,41;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css.map b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css.map new file mode 100644 index 0000000..afcd9e3 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}-root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` @@ -11,17 +11,7 @@

diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor index 67f7bfc..9fcbcac 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor @@ -1,31 +1,38 @@ -@page "/login" +@page "/" @using VisaApiClient +@using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants Authentication - - - - - - -

@loginResult

+
+ + + +
+ + + or + Register +

@loginResult

+
+
@code { private AuthData loginData = new(); private string loginResult = string.Empty; - [Inject] - private Client Client { get; set; } = null!; + [Inject] private Client Client { get; set; } = null!; - private async Task TryLogin(EditContext obj) + private async Task TryLogin() { + loginResult = "Wait..."; + StateHasChanged(); try { var token = await Client.LoginAsync(loginData.Email, loginData.Password); Client.SetAuthToken(token); - loginResult = "Logged in successfully"; + loginResult = "Logged in successfully."; } catch (ApiException e) { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Counter.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Counter.razor deleted file mode 100644 index 7f483c9..0000000 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Counter.razor +++ /dev/null @@ -1,19 +0,0 @@ -@page "/counter" - -Counter - -

Counter

- -

Current count: @currentCount

- - - -@code { - private int currentCount = 0; - - private void IncrementCount() - { - currentCount++; - } - -} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Home.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Home.razor deleted file mode 100644 index 9001e0b..0000000 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Home.razor +++ /dev/null @@ -1,7 +0,0 @@ -@page "/" - -Home - -

Hello, world!

- -Welcome to your new app. diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor new file mode 100644 index 0000000..454bac2 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -0,0 +1,218 @@ +@page "/register" +@using System.Net +@using System.Text +@using AutoMapper +@using VisaApiClient +@using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants +@using BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services +@using global::FluentValidation +@using Newtonsoft.Json +@using Newtonsoft.Json.Linq + +Registration + +
+

Registration data

+ + + +
+
Authentication data
+ +
+ +
+
Your Fullname
+ +
+ +
+
Fullname of your mother
+ +
+ +
+
Fullname of your father
+ +
+ +
+
Your passport
+ +
+ +
+
Birth data
+
+
+
+
+
+
+ +
+
+ +
+
Citizenship
+
+
+
+
+ +
+
+ +
+
Address of your place of work
+
+ +
+
+ +
+
Place of work data
+
+
+ +
+ +
+
+ +
+
Other
+ +
+ +

+ +
+ +

+ +
+ +
+

+ + +

@((MarkupString)requestResult)

+
+
+ +@code +{ + private RegisterApplicantRequestModel requestModel = new(); + private string requestResult = string.Empty; + private string requestResultClass = string.Empty; + + [Inject] public Client Client { get; set; } = null!; + + [Inject] IValidator RegisterApplicantRequestValidator { get; set; } = null!; + + [Inject] IMapper Mapper { get; set; } = null!; + + [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; + + protected override void OnInitialized() + { + requestModel.BirthDate = DateTime.Now; + } + + private void SetRequestResultMessage(string message) + { + requestResult = message; + requestResultClass = string.Empty; + StateHasChanged(); + } + + private void SetRequestResultSuccess(string message) + { + requestResult = message; + requestResultClass = "text-success"; + StateHasChanged(); + } + + private void SetRequestResultError(string message) + { + requestResult = message; + requestResultClass = "validation-message"; + StateHasChanged(); + } + + private string ErrorsToString(IEnumerable errors) + { + var stringBuilder = new StringBuilder(); + foreach (var error in errors) + { + stringBuilder.Append($"{error}
"); + } + + return stringBuilder.ToString(); + } + + private async void TryRegisterApplicant() + { + var validationResult = await RegisterApplicantRequestValidator.ValidateAsync(requestModel); + if (!validationResult.IsValid) + { + var errorsString = ErrorsToString(validationResult.Errors.Select(e => e.ErrorMessage)); + SetRequestResultError(errorsString); + + return; + } + + SetRequestResultMessage("Wait..."); + + var request = Mapper.Map(requestModel); + try + { + await Client.RegisterAsync(request); + SetRequestResultSuccess("Register successful. Now log in."); + } + catch (ApiException e) + { + if (e.StatusCode == (int)HttpStatusCode.BadRequest + && e.Result.AdditionalProperties.TryGetValue("errors", out var errors)) + { + var errorsList = ((JArray)errors).ToObject>(); + if (errorsList is null) + { + throw new JsonException(); + } + + SetRequestResultError(ErrorsToString(errorsList)); + } + else + { + SetRequestResultError(e.Result.Detail!); + } + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Weather.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Weather.razor deleted file mode 100644 index e78bc29..0000000 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Weather.razor +++ /dev/null @@ -1,60 +0,0 @@ -@page "/weather" -@inject HttpClient Http - -Weather - -

Weather

- -

This component demonstrates fetching data from the server.

- -@if (forecasts == null) -{ -

- Loading... -

-} -else -{ - - - - - - - - - - - @foreach (var forecast in forecasts) - { - - - - - - - } - -
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
-} - -@code { - private WeatherForecast[]? forecasts; - - protected override async Task OnInitializedAsync() - { - forecasts = await Http.GetFromJsonAsync("sample-data/weather.json"); - } - - public class WeatherForecast - { - public DateOnly Date { get; set; } - - public int TemperatureC { get; set; } - - public string? Summary { get; set; } - - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - } - -} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs index 1d6c60f..7b2d39c 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs @@ -1,3 +1,6 @@ +using System.Reflection; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services; +using FluentValidation; using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using VisaApiClient; @@ -17,8 +20,12 @@ public class Program //todo make pretty builder.Services.AddScoped(_ => new HttpClient { BaseAddress = new Uri(baseAddress) }); - builder.Services.AddScoped(sp => - new Client(baseAddress, sp.GetRequiredService())); + builder.Services.AddScoped(sp => new Client(baseAddress, sp.GetRequiredService())); + + builder.Services.AddSingleton(); + builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly()); + + builder.Services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly()); await builder.Build().RunAsync(); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css index 54a8aa3..a29bbe7 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/css/app.css @@ -98,6 +98,37 @@ a, .btn-link { content: var(--blazor-load-percentage-text, "Loading"); } + .fullscreen { + height: 100vh; + } + + .with-centered-content { + height: 100%; + display: flex; + flex-direction: column; + } + + .with-centered-content > * { + margin: auto; + } + + .horizontal-centered-content > * { + margin-left: auto; + margin-right: auto; + text-align: center; + } + + .form { + width: fit-content; + text-align: left; + } + + .form-block { + margin: 10px 20px; + display: inline-block; + vertical-align: top; + } + code { color: #c02d76; } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/sample-data/weather.json b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/sample-data/weather.json deleted file mode 100644 index b745973..0000000 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/sample-data/weather.json +++ /dev/null @@ -1,27 +0,0 @@ -[ - { - "date": "2022-01-06", - "temperatureC": 1, - "summary": "Freezing" - }, - { - "date": "2022-01-07", - "temperatureC": 14, - "summary": "Bracing" - }, - { - "date": "2022-01-08", - "temperatureC": -13, - "summary": "Freezing" - }, - { - "date": "2022-01-09", - "temperatureC": -16, - "summary": "Balmy" - }, - { - "date": "2022-01-10", - "temperatureC": -2, - "summary": "Chilly" - } -] diff --git a/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs b/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs index c365334..4cf9808 100644 --- a/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs +++ b/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs @@ -20,7 +20,7 @@ public class GlobalExceptionsFilter : IAsyncExceptionFilter switch (exception) { case ValidationException validationException: - problemDetails.Extensions.Add("Errors", validationException.Errors.Select(e => e.ErrorMessage)); + problemDetails.Extensions.Add("errors", validationException.Errors.Select(e => e.ErrorMessage)); problemDetails.Detail = "Validation errors occured"; problemDetails.Status = StatusCodes.Status400BadRequest; problemDetails.Title = "Bad request"; @@ -68,4 +68,4 @@ public class GlobalExceptionsFilter : IAsyncExceptionFilter await Results.Problem(problemDetails).ExecuteAsync(context.HttpContext); context.ExceptionHandled = true; } -} \ No newline at end of file +} From 1f050a6fd4577be65945452f91c739c89b9402d3 Mon Sep 17 00:00:00 2001 From: prtsie Date: Sun, 1 Sep 2024 19:30:28 +0300 Subject: [PATCH 11/30] Auth and error handling components --- .../BlazorWebAssemblyVisaApiClient/App.razor | 28 ++++---- .../Common/BlazorClientException.cs | 4 ++ .../Components/Auth/AuthComponent.razor | 67 +++++++++++++++++++ .../Auth/Exceptions/NotLoggedInException.cs | 7 ++ .../Base/VisaClientComponentBase.razor | 9 +++ .../Components/Status.razor | 34 ++++++++++ .../ErrorHandling/GlobalErrorHandler.razor | 14 ++++ .../Pages/Auth.razor | 23 ++----- .../Pages/Register.razor | 48 +++++-------- 9 files changed, 174 insertions(+), 60 deletions(-) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/BlazorClientException.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Base/VisaClientComponentBase.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor index a8cf817..b965270 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/App.razor @@ -1,12 +1,16 @@ - - - - - - - Not found - -

Sorry, there's nothing at this address.

-
-
-
+@using BlazorWebAssemblyVisaApiClient.ErrorHandling + + + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
+
diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/BlazorClientException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/BlazorClientException.cs new file mode 100644 index 0000000..94264ad --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/BlazorClientException.cs @@ -0,0 +1,4 @@ +namespace BlazorWebAssemblyVisaApiClient.Common +{ + public class BlazorClientException(string message) : Exception(message); +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor new file mode 100644 index 0000000..79947a1 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor @@ -0,0 +1,67 @@ +@using System.Net +@using BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions +@using BlazorWebAssemblyVisaApiClient.ErrorHandling +@using VisaApiClient + +@code { + public static bool LoggedIn; + private static AuthData savedData = null!; + + [CascadingParameter] private GlobalErrorHandler ErrorHandler { get; set; } = null!; + + [CascadingParameter] private Status? Status { get; set; } + + [Inject] private Client Client { get; set; } = null!; + + [Inject] private NavigationManager Nav { get; set; } = null!; + + ///Authorize with email and password + /// Message to user + public async Task TryAuthorize(AuthData authData) + { + Status?.SetMessage("Wait..."); + try + { + var token = await Client.LoginAsync(authData.Email, authData.Password); + Client.SetAuthToken(token); + savedData = authData; + + Status?.SetSucces("Logged in successfully."); + } + catch (ApiException e) + { + if (e.Result.Status == (int)HttpStatusCode.Forbidden) + { + Status?.SetError(e.Result.Detail!); + } + else + { + Status?.SetError("Error occured"); + ErrorHandler.Handle(e); + } + } + catch (Exception e) + { + Status?.SetError("Error occured"); + ErrorHandler.Handle(e); + } + } + + ///Re-auth if token expired or something + public async Task ReAuthenticate(bool redirectOnFailure = true) + { + if (!LoggedIn) + { + if (redirectOnFailure) + { + Nav.NavigateTo("/"); + return; + } + + throw new NotLoggedInException(); + } + + await TryAuthorize(savedData); + } + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs new file mode 100644 index 0000000..4346983 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs @@ -0,0 +1,7 @@ +using BlazorWebAssemblyVisaApiClient.Common; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions +{ + public class NotLoggedInException() : BlazorClientException("User is not logged in"); +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Base/VisaClientComponentBase.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Base/VisaClientComponentBase.razor new file mode 100644 index 0000000..99d7312 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Base/VisaClientComponentBase.razor @@ -0,0 +1,9 @@ +@using BlazorWebAssemblyVisaApiClient.ErrorHandling +@using VisaApiClient + +@code +{ + [CascadingParameter] protected GlobalErrorHandler ErrorHandler { get; set; } = null!; + + [Inject] protected Client Client { get; set; } = null!; +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor new file mode 100644 index 0000000..fb92472 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor @@ -0,0 +1,34 @@ +

@((MarkupString)StatusText)

+ + @ChildContent + + +@code { + private string statusClass = string.Empty; + + [Parameter] + public RenderFragment? ChildContent { get; set; } + + public string StatusText { get; set; } = string.Empty; + + public void SetMessage(string message) + { + statusClass = string.Empty; + StatusText = message; + StateHasChanged(); + } + + public void SetError(string message) + { + statusClass = "validation-message"; + StatusText = message; + StateHasChanged(); + } + + public void SetSucces(string message) + { + statusClass = "text-success"; + StatusText = message; + StateHasChanged(); + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor new file mode 100644 index 0000000..cd8bbc8 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor @@ -0,0 +1,14 @@ + + @ChildContent + + +@code +{ + [Parameter] + public RenderFragment? ChildContent { get; set; } + + public void Handle(Exception ex) + { + + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor index 9fcbcac..11208ab 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor @@ -1,6 +1,10 @@ @page "/" +@using System.Net +@using BlazorWebAssemblyVisaApiClient.Components.Auth @using VisaApiClient @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants +@using BlazorWebAssemblyVisaApiClient.Components +@inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase Authentication @@ -13,30 +17,17 @@ or Register -

@loginResult

+ @code { private AuthData loginData = new(); - private string loginResult = string.Empty; - - [Inject] private Client Client { get; set; } = null!; + private AuthComponent auth = null!; private async Task TryLogin() { - loginResult = "Wait..."; - StateHasChanged(); - try - { - var token = await Client.LoginAsync(loginData.Email, loginData.Password); - Client.SetAuthToken(token); - loginResult = "Logged in successfully."; - } - catch (ApiException e) - { - loginResult = e.Result.Detail!; - } + await auth.TryAuthorize(loginData); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor index 454bac2..c195c19 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -9,6 +9,8 @@ @using global::FluentValidation @using Newtonsoft.Json @using Newtonsoft.Json.Linq +@using BlazorWebAssemblyVisaApiClient.Components +@inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase Registration @@ -122,17 +124,14 @@
-

@((MarkupString)requestResult)

+ @code { private RegisterApplicantRequestModel requestModel = new(); - private string requestResult = string.Empty; - private string requestResultClass = string.Empty; - - [Inject] public Client Client { get; set; } = null!; + private Status status = null!; [Inject] IValidator RegisterApplicantRequestValidator { get; set; } = null!; @@ -145,27 +144,6 @@ requestModel.BirthDate = DateTime.Now; } - private void SetRequestResultMessage(string message) - { - requestResult = message; - requestResultClass = string.Empty; - StateHasChanged(); - } - - private void SetRequestResultSuccess(string message) - { - requestResult = message; - requestResultClass = "text-success"; - StateHasChanged(); - } - - private void SetRequestResultError(string message) - { - requestResult = message; - requestResultClass = "validation-message"; - StateHasChanged(); - } - private string ErrorsToString(IEnumerable errors) { var stringBuilder = new StringBuilder(); @@ -183,18 +161,18 @@ if (!validationResult.IsValid) { var errorsString = ErrorsToString(validationResult.Errors.Select(e => e.ErrorMessage)); - SetRequestResultError(errorsString); + status.SetError(errorsString); return; } - SetRequestResultMessage("Wait..."); + status.SetMessage("Wait..."); var request = Mapper.Map(requestModel); try { await Client.RegisterAsync(request); - SetRequestResultSuccess("Register successful. Now log in."); + status.SetSucces("Register successful. Now log in."); } catch (ApiException e) { @@ -204,15 +182,21 @@ var errorsList = ((JArray)errors).ToObject>(); if (errorsList is null) { - throw new JsonException(); + ErrorHandler.Handle(new JsonException("Can't convert validation errors to list")); + + return; } - SetRequestResultError(ErrorsToString(errorsList)); + status.SetError(ErrorsToString(errorsList)); } else { - SetRequestResultError(e.Result.Detail!); + ErrorHandler.Handle(e); } } + catch (Exception e) + { + ErrorHandler.Handle(e); + } } } From 1e07392e2eeba7e106bd6f824424a3fff1b89081 Mon Sep 17 00:00:00 2001 From: prtsie Date: Tue, 3 Sep 2024 21:44:03 +0300 Subject: [PATCH 12/30] Removed unused usings --- .../Components/Auth/Exceptions/NotLoggedInException.cs | 1 - SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor | 1 - 2 files changed, 2 deletions(-) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs index 4346983..ef88958 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs @@ -1,5 +1,4 @@ using BlazorWebAssemblyVisaApiClient.Common; -using VisaApiClient; namespace BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor index 11208ab..08c388e 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Auth.razor @@ -1,5 +1,4 @@ @page "/" -@using System.Net @using BlazorWebAssemblyVisaApiClient.Components.Auth @using VisaApiClient @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants From 02d34a66c2b565cbc19feabe4612c81cd1233efa Mon Sep 17 00:00:00 2001 From: prtsie Date: Tue, 3 Sep 2024 22:23:20 +0300 Subject: [PATCH 13/30] added todo --- .../VisaApplications/Requests/VisaApplicationCreateRequest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs index c9f29c1..a617022 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs @@ -32,6 +32,7 @@ public class VisaApplicationCreateRequest [Required] public PastVisaModel[] PastVisas { get; set; } = null!; + //todo remove attribute [Required] public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } From d09b1b24d91d29f1ea3670460446318379e37765 Mon Sep 17 00:00:00 2001 From: prtsie Date: Tue, 3 Sep 2024 22:28:54 +0300 Subject: [PATCH 14/30] Client generator configuration --- .../VisaApiClient/clientGeneratorConfig.nswag | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag new file mode 100644 index 0000000..108db59 --- /dev/null +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -0,0 +1,101 @@ +{ + "runtime": "Net80", + "defaultVariables": null, + "documentGenerator": { + "fromDocument": { + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"cityOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenship\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenshipByBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"permissionToDestCountry\",\r\n \"reentryPermit\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "url": "https://localhost:44370/swagger/v1/swagger.json", + "output": null, + "newLineBehavior": "Auto" + } + }, + "codeGenerators": { + "openApiToCSharpClient": { + "clientBaseClass": "ClientBase", + "configurationClass": null, + "generateClientClasses": true, + "suppressClientClassesOutput": false, + "generateClientInterfaces": false, + "suppressClientInterfacesOutput": false, + "clientBaseInterface": null, + "injectHttpClient": true, + "disposeHttpClient": true, + "protectedMethods": [], + "generateExceptionClasses": true, + "exceptionClass": "ApiException", + "wrapDtoExceptions": true, + "useHttpClientCreationMethod": false, + "httpClientType": "System.Net.Http.HttpClient", + "useHttpRequestMessageCreationMethod": true, + "useBaseUrl": true, + "generateBaseUrlProperty": true, + "generateSyncMethods": false, + "generatePrepareRequestAndProcessResponseAsAsyncMethods": true, + "exposeJsonSerializerSettings": false, + "clientClassAccessModifier": "public", + "typeAccessModifier": "public", + "propertySetterAccessModifier": "", + "generateNativeRecords": false, + "generateContractsOutput": false, + "contractsNamespace": null, + "contractsOutputFilePath": null, + "parameterDateTimeFormat": "s", + "parameterDateFormat": "yyyy-MM-dd", + "generateUpdateJsonSerializerSettingsMethod": true, + "useRequestAndResponseSerializationSettings": false, + "serializeTypeInformation": false, + "queryNullValue": "", + "className": "{controller}Client", + "operationGenerationMode": "MultipleClientsFromOperationId", + "additionalNamespaceUsages": [], + "additionalContractNamespaceUsages": [], + "generateOptionalParameters": false, + "generateJsonMethods": false, + "enforceFlagEnums": false, + "parameterArrayType": "System.Collections.Generic.IEnumerable", + "parameterDictionaryType": "System.Collections.Generic.IDictionary", + "responseArrayType": "System.Collections.Generic.ICollection", + "responseDictionaryType": "System.Collections.Generic.IDictionary", + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "namespace": "VisaApiClient", + "requiredPropertiesMustBeDefined": true, + "dateType": "System.DateTimeOffset", + "jsonConverters": null, + "anyType": "object", + "dateTimeType": "System.DateTimeOffset", + "timeType": "System.TimeSpan", + "timeSpanType": "System.TimeSpan", + "arrayType": "System.Collections.Generic.ICollection", + "arrayInstanceType": "System.Collections.ObjectModel.Collection", + "dictionaryType": "System.Collections.Generic.IDictionary", + "dictionaryInstanceType": "System.Collections.Generic.Dictionary", + "arrayBaseType": "System.Collections.ObjectModel.Collection", + "dictionaryBaseType": "System.Collections.Generic.Dictionary", + "classStyle": "Poco", + "jsonLibrary": "NewtonsoftJson", + "generateDefaultValues": true, + "generateDataAnnotations": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateImmutableArrayProperties": false, + "generateImmutableDictionaryProperties": false, + "jsonSerializerSettingsTransformationMethod": null, + "inlineNamedArrays": false, + "inlineNamedDictionaries": false, + "inlineNamedTuples": true, + "inlineNamedAny": false, + "generateDtoTypes": true, + "generateOptionalPropertiesAsNullable": false, + "generateNullableReferenceTypes": true, + "templateDirectory": null, + "serviceHost": null, + "serviceSchemes": null, + "output": null, + "newLineBehavior": "Auto" + } + } +} \ No newline at end of file From 24881ae1db6a180ba8a4d1be6929bb304f53376d Mon Sep 17 00:00:00 2001 From: prtsie Date: Wed, 4 Sep 2024 15:59:36 +0300 Subject: [PATCH 15/30] Fixed errors and wrong model --- .../VisaApplicationRequestsHandler.cs | 6 +++- .../VisaApplicationCreateRequestValidator.cs | 11 +++--- .../Requests/VisaApplicationCreateRequest.cs | 2 -- .../Controllers/UsersController.cs | 2 -- .../Controllers/VisaApplicationController.cs | 1 + SchengenVisaApi/VisaApiClient/Client.cs | 35 +++++++------------ 6 files changed, 24 insertions(+), 33 deletions(-) diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs index 23d93b6..4ece238 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs @@ -53,6 +53,10 @@ public class VisaApplicationRequestsHandler( { var applicantId = await applicants.GetApplicantIdByUserId(userIdProvider.GetUserId(), cancellationToken); var application = await applications.GetByApplicantAndApplicationIdAsync(applicantId, applicationId, cancellationToken); + if (application.Status is ApplicationStatus.Approved or ApplicationStatus.Rejected) + { + throw new ApplicationAlreadyProcessedException(); + } application.Status = ApplicationStatus.Closed; await applications.UpdateAsync(application, cancellationToken); @@ -95,4 +99,4 @@ public class VisaApplicationRequestsHandler( return model; } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs index 84e8bc6..c0cb9d0 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs @@ -17,6 +17,12 @@ public class VisaApplicationCreateRequestValidator : AbstractValidator r.PermissionToDestCountry) + .NotEmpty() + .WithMessage("For transit you must provide permission to destination country") + .SetValidator(permissionToDestCountryModelValidator) + .When(r => r.VisaCategory is VisaCategory.Transit); + RuleFor(r => r.ReentryPermit) .NotEmpty() .WithMessage("Non-residents must provide re-entry permission") @@ -43,11 +49,6 @@ public class VisaApplicationCreateRequestValidator : AbstractValidator r.PastVisas) .SetValidator(pastVisaModelValidator); - When(r => r.VisaCategory == VisaCategory.Transit, - () => - RuleFor(r => r.PermissionToDestCountry) - .SetValidator(permissionToDestCountryModelValidator)); - RuleForEach(r => r.PastVisits) .SetValidator(pastVisitModelValidator); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs index a617022..16be84b 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs @@ -32,8 +32,6 @@ public class VisaApplicationCreateRequest [Required] public PastVisaModel[] PastVisas { get; set; } = null!; - //todo remove attribute - [Required] public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } [Required] diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs index 4522cfc..aca41d0 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs @@ -26,7 +26,6 @@ public class UsersController( /// Adds applicant with user account [HttpPost("register")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status409Conflict)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task Register(RegisterApplicantRequest request, CancellationToken cancellationToken) { @@ -40,7 +39,6 @@ public class UsersController( /// Accessible only for admins [HttpPost("authorities")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status409Conflict)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status400BadRequest)] diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index cb4b164..2f98b40 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -66,6 +66,7 @@ public class VisaApplicationController( [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] public async Task CloseApplication(Guid applicationId, CancellationToken cancellationToken) { diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index c65b9de..7cbe2e8 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -131,16 +131,6 @@ namespace VisaApiClient return; } else - if (status_ == 409) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 400) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -239,16 +229,6 @@ namespace VisaApiClient return; } else - if (status_ == 409) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 403) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1220,6 +1200,16 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1938,9 +1928,8 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required] public System.Collections.Generic.ICollection PastVisas { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - public PermissionToDestCountryModel PermissionToDestCountry { get; set; } = new PermissionToDestCountryModel(); + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountryModel PermissionToDestCountry { get; set; } = default!; [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] From 7dc1f85d6eaa7806246ea5618d7efd063297d179 Mon Sep 17 00:00:00 2001 From: prtsie Date: Wed, 4 Sep 2024 15:59:36 +0300 Subject: [PATCH 16/30] Fixed errors and wrong model --- .../VisaApplicationRequestsHandler.cs | 6 +++- .../VisaApplicationCreateRequestValidator.cs | 11 +++--- .../Requests/VisaApplicationCreateRequest.cs | 4 --- .../Controllers/UsersController.cs | 2 -- .../Controllers/VisaApplicationController.cs | 1 + SchengenVisaApi/VisaApiClient/Client.cs | 35 +++++++------------ 6 files changed, 24 insertions(+), 35 deletions(-) diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs index 23d93b6..4ece238 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs @@ -53,6 +53,10 @@ public class VisaApplicationRequestsHandler( { var applicantId = await applicants.GetApplicantIdByUserId(userIdProvider.GetUserId(), cancellationToken); var application = await applications.GetByApplicantAndApplicationIdAsync(applicantId, applicationId, cancellationToken); + if (application.Status is ApplicationStatus.Approved or ApplicationStatus.Rejected) + { + throw new ApplicationAlreadyProcessedException(); + } application.Status = ApplicationStatus.Closed; await applications.UpdateAsync(application, cancellationToken); @@ -95,4 +99,4 @@ public class VisaApplicationRequestsHandler( return model; } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs index 84e8bc6..c0cb9d0 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/Validation/VisaApplicationCreateRequestValidator.cs @@ -17,6 +17,12 @@ public class VisaApplicationCreateRequestValidator : AbstractValidator r.PermissionToDestCountry) + .NotEmpty() + .WithMessage("For transit you must provide permission to destination country") + .SetValidator(permissionToDestCountryModelValidator) + .When(r => r.VisaCategory is VisaCategory.Transit); + RuleFor(r => r.ReentryPermit) .NotEmpty() .WithMessage("Non-residents must provide re-entry permission") @@ -43,11 +49,6 @@ public class VisaApplicationCreateRequestValidator : AbstractValidator r.PastVisas) .SetValidator(pastVisaModelValidator); - When(r => r.VisaCategory == VisaCategory.Transit, - () => - RuleFor(r => r.PermissionToDestCountry) - .SetValidator(permissionToDestCountryModelValidator)); - RuleForEach(r => r.PastVisits) .SetValidator(pastVisitModelValidator); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs index a617022..92df8d9 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs @@ -8,8 +8,6 @@ namespace ApplicationLayer.Services.VisaApplications.Requests; /// Model of visa request from user public class VisaApplicationCreateRequest { - - [Required] public ReentryPermitModel? ReentryPermit { get; set; } [Required] @@ -32,8 +30,6 @@ public class VisaApplicationCreateRequest [Required] public PastVisaModel[] PastVisas { get; set; } = null!; - //todo remove attribute - [Required] public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } [Required] diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs index 4522cfc..aca41d0 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs @@ -26,7 +26,6 @@ public class UsersController( /// Adds applicant with user account [HttpPost("register")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status409Conflict)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task Register(RegisterApplicantRequest request, CancellationToken cancellationToken) { @@ -40,7 +39,6 @@ public class UsersController( /// Accessible only for admins [HttpPost("authorities")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status409Conflict)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status400BadRequest)] diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index cb4b164..2f98b40 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -66,6 +66,7 @@ public class VisaApplicationController( [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] public async Task CloseApplication(Guid applicationId, CancellationToken cancellationToken) { diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index c65b9de..7cbe2e8 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -131,16 +131,6 @@ namespace VisaApiClient return; } else - if (status_ == 409) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 400) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -239,16 +229,6 @@ namespace VisaApiClient return; } else - if (status_ == 409) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 403) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1220,6 +1200,16 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1938,9 +1928,8 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required] public System.Collections.Generic.ICollection PastVisas { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - public PermissionToDestCountryModel PermissionToDestCountry { get; set; } = new PermissionToDestCountryModel(); + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountryModel PermissionToDestCountry { get; set; } = default!; [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] From 80e15e88f5a0b2870143b0718b1d1144f5eae3e3 Mon Sep 17 00:00:00 2001 From: prtsie Date: Thu, 5 Sep 2024 22:31:13 +0300 Subject: [PATCH 17/30] started applications page --- .../BlazorWebAssemblyVisaApiClient.csproj | 1 + .../Components/Auth/AuthComponent.razor | 9 +++ .../Applicants/EnumInputList.razor | 12 +--- .../Applicants/PassportInput.razor | 1 + .../Validators/PassportModelValidator.cs | 1 + .../RegisterApplicantRequestValidator.cs | 1 + .../Infrastructure/Helpers/EnumExtensions.cs | 18 ++++++ .../DateTimeProvider.cs | 2 +- .../IDateTimeProvider.cs | 2 +- .../Pages/Applications.razor | 56 +++++++++++++++++++ .../Pages/Register.razor | 1 + 11 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/EnumExtensions.cs rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/{ => DateTimeProvider}/DateTimeProvider.cs (89%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/{ => DateTimeProvider}/IDateTimeProvider.cs (87%) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj index 4798785..24bb67e 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj @@ -13,6 +13,7 @@ + diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor index 79947a1..f531914 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor @@ -1,11 +1,16 @@ @using System.Net +@using System.IdentityModel.Tokens.Jwt +@using System.Security.Claims @using BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions @using BlazorWebAssemblyVisaApiClient.ErrorHandling @using VisaApiClient @code { public static bool LoggedIn; + public static ApplicantModel? CurrentApplicant; //todo api action + public static string? CurrentRole; private static AuthData savedData = null!; + private static readonly JwtSecurityTokenHandler TokenHandler = new(); [CascadingParameter] private GlobalErrorHandler ErrorHandler { get; set; } = null!; @@ -24,6 +29,10 @@ { var token = await Client.LoginAsync(authData.Email, authData.Password); Client.SetAuthToken(token); + CurrentRole = TokenHandler.ReadJwtToken(token.Token) + .Claims + .FirstOrDefault(claim => claim.Type == ClaimTypes.Role)? + .Value; savedData = authData; Status?.SetSucces("Logged in successfully."); diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor index 0895b65..3980d03 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor @@ -1,6 +1,6 @@ -@using System.ComponentModel.DataAnnotations -@using System.Linq.Expressions +@using System.Linq.Expressions @using System.Reflection +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @typeparam TItem where TItem : class @typeparam TMember where TMember : struct, Enum @@ -22,18 +22,12 @@ protected override void OnInitialized() { - var enumMembers = typeof(TMember).GetMembers(); var modelMemberName = ((MemberExpression)EnumProperty.Body).Member.Name; modelMemberInfo = typeof(TItem).GetProperty(modelMemberName)!; foreach (var value in Enum.GetValues()) { - var member = enumMembers.First(info => info.Name == value.ToString()); - var displayAttribute = (DisplayAttribute?)member - .GetCustomAttributes(typeof(DisplayAttribute), false) - .FirstOrDefault(); - var displayName = displayAttribute?.Name ?? value.ToString(); - enumValues.Add(value, displayName); + enumValues.Add(value, value.GetDisplayName()); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor index ec52b6c..8e6401b 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor @@ -1,4 +1,5 @@ @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider @using VisaApiClient
diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PassportModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PassportModelValidator.cs index 289b8c4..a8d0fbe 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PassportModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PassportModelValidator.cs @@ -1,4 +1,5 @@ using BlazorWebAssemblyVisaApiClient.Infrastructure.Services; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; using FluentValidation; using VisaApiClient; diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/RegisterApplicantRequestValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/RegisterApplicantRequestValidator.cs index d7c626d..907e159 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/RegisterApplicantRequestValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/RegisterApplicantRequestValidator.cs @@ -1,5 +1,6 @@ using BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models; using BlazorWebAssemblyVisaApiClient.Infrastructure.Services; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; using FluentValidation; using VisaApiClient; using PlaceOfWorkModel = BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models.PlaceOfWorkModel; diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/EnumExtensions.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/EnumExtensions.cs new file mode 100644 index 0000000..d49ba1b --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/EnumExtensions.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; + +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers +{ + public static class EnumExtensions + { + public static string GetDisplayName(this Enum value) + { + var enumMembers = value.GetType().GetMembers(); + var member = enumMembers.First(info => info.Name == value.ToString()); + var displayAttribute = (DisplayAttribute?)member + .GetCustomAttributes(typeof(DisplayAttribute), false) + .FirstOrDefault(); + var displayName = displayAttribute?.Name ?? value.ToString(); + return displayName; + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider/DateTimeProvider.cs similarity index 89% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider/DateTimeProvider.cs index 35e9e91..340eb09 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider/DateTimeProvider.cs @@ -1,4 +1,4 @@ -namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider { public class DateTimeProvider : IDateTimeProvider { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/IDateTimeProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider/IDateTimeProvider.cs similarity index 87% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/IDateTimeProvider.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider/IDateTimeProvider.cs index d0f7596..4dc42ba 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/IDateTimeProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/DateTimeProvider/IDateTimeProvider.cs @@ -1,4 +1,4 @@ -namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider { public interface IDateTimeProvider { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor new file mode 100644 index 0000000..06dab63 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -0,0 +1,56 @@ +@page "/applications" +@using System.Net +@using System.Text +@using BlazorWebAssemblyVisaApiClient.Components +@using BlazorWebAssemblyVisaApiClient.Components.Auth +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers +@using VisaApiClient +@inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase + +@(AuthComponent.CurrentRole ?? "bruh") + +@((MarkupString)htmlMarkup) + +@code { + private string htmlMarkup = "bruh"; + + protected override async Task OnInitializedAsync() + { + var stringBuilder = new StringBuilder(); + + try + { + switch (AuthComponent.CurrentRole) + { + case "Applicant": + var applications = await Client.GetForApplicantAsync(); + + stringBuilder.AppendLine(""); + foreach (var application in applications) + { + stringBuilder.AppendLine($""); + } + + stringBuilder.AppendLine("
Destination CountryVisa CategoryRequest dateDays requestedStatus
{application.DestinationCountry}{application.VisaCategory.GetDisplayName()}{application.RequestDate.ToString("d")}{application.ValidDaysRequested}{application.Status.GetDisplayName()}
"); + htmlMarkup = stringBuilder.ToString(); + break; + default: + htmlMarkup = AuthComponent.CurrentRole; + break; + } + } + catch (Exception e) + { + if (e is ApiException { Result.Status: (int)HttpStatusCode.Unauthorized } problemDetailsException) + { + htmlMarkup = problemDetailsException.Result.Detail!; + } + else + { + //ErrorHandler.Handle(e); + throw; + } + } + } + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor index c195c19..cfdf329 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -10,6 +10,7 @@ @using Newtonsoft.Json @using Newtonsoft.Json.Linq @using BlazorWebAssemblyVisaApiClient.Components +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase Registration From 53d5758527d722e71a1f7133ecda1b6de429c4d2 Mon Sep 17 00:00:00 2001 From: prtsie Date: Fri, 6 Sep 2024 10:05:59 +0300 Subject: [PATCH 18/30] Started CreateApplication.razor --- .../Models/PermissionToDestCountryModel.cs | 4 +- .../Models/ReentryPermitModel.cs | 4 +- .../Applicants/EnumInputList.razor | 13 +++- .../Applicants/PassportInput.razor | 10 +-- .../Applicants/PlaceOfWorkInput.razor | 3 +- .../Validation/CustomValidation.razor | 46 ----------- .../PermissionToDestCountryInput.razor | 33 ++++++++ .../Components/Status.razor | 2 +- .../RegisterApplicantRequestProfile.cs | 5 +- .../DateTimeProvider/DateTimeProvider.cs | 2 + .../DateTimeProvider/IDateTimeProvider.cs | 2 + .../Pages/Applications.razor | 1 - .../Pages/CreateApplication.razor | 78 +++++++++++++++++++ .../Pages/Register.razor | 5 +- .../BlazorWebAssemblyVisaApiClient/Program.cs | 2 +- .../Applicants/Models/PlaceOfWorkModel.cs | 2 +- .../Models/RegisterApplicantRequestModel.cs | 2 +- .../Applicants/Models/RegisterRequestModel.cs | 2 +- .../Validators/NameModelValidator.cs | 2 +- .../Validators/PassportModelValidator.cs | 5 +- .../Validators/PlaceOfWorkModelValidator.cs | 4 +- .../RegisterApplicantRequestValidator.cs | 9 +-- .../Common/AuthDataValidator.cs | 2 +- .../Common/RegisterRequestModelValidator.cs | 4 +- .../ConfigurationConstraints.cs | 2 +- .../VisaApplicationCreateRequestModel.cs | 40 ++++++++++ SchengenVisaApi/VisaApiClient/Client.cs | 25 +++--- .../VisaApiClient/clientGeneratorConfig.nswag | 4 +- 28 files changed, 208 insertions(+), 105 deletions(-) delete mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Validation/CustomValidation.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Applicants/Models/PlaceOfWorkModel.cs (90%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Applicants/Models/RegisterApplicantRequestModel.cs (96%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Applicants/Models/RegisterRequestModel.cs (80%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Applicants/Validators/NameModelValidator.cs (91%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Applicants/Validators/PassportModelValidator.cs (85%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Applicants/Validators/PlaceOfWorkModelValidator.cs (93%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Applicants/Validators/RegisterApplicantRequestValidator.cs (87%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Common/AuthDataValidator.cs (92%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/Common/RegisterRequestModelValidator.cs (68%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/{FluentValidation => Validation}/ConfigurationConstraints.cs (93%) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs index d83c987..cfd6f40 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs @@ -7,11 +7,9 @@ namespace ApplicationLayer.Services.VisaApplications.Models; public class PermissionToDestCountryModel { /// Date when permission to destination country expires - [Required] public DateTime ExpirationDate { get; set; } /// Issuing authority - [Required] [MaxLength(ConfigurationConstraints.IssuerNameLength)] public string Issuer { get; set; } = null!; -} \ No newline at end of file +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs index 1d81969..86a5542 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs @@ -7,11 +7,9 @@ namespace ApplicationLayer.Services.VisaApplications.Models; public class ReentryPermitModel { /// Number of re-entry permit - [Required] [MaxLength(ConfigurationConstraints.ReentryPermitNumberLength)] public string Number { get; set; } = null!; /// Date when re-entry permit expires - [Required] public DateTime ExpirationDate { get; set; } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor index 3980d03..764ac1b 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/EnumInputList.razor @@ -2,9 +2,9 @@ @using System.Reflection @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @typeparam TItem where TItem : class - @typeparam TMember where TMember : struct, Enum +@typeparam TMember where TMember : struct, Enum - + @foreach (var value in enumValues) { @@ -16,6 +16,8 @@ [Parameter, EditorRequired] public Expression> EnumProperty { get; set; } = null!; + [Parameter] public Action? OnChanged { get; set; } + private Dictionary enumValues = new(); private PropertyInfo modelMemberInfo = null!; private TMember selected; @@ -33,12 +35,17 @@ protected override void OnAfterRender(bool firstRender) { - OnValueChanged(); + var current = (TMember)modelMemberInfo.GetValue(Model)!; + if (!current.Equals(selected)) + { + OnValueChanged(); + } } private void OnValueChanged() { modelMemberInfo.SetValue(Model, selected); + OnChanged?.Invoke(); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor index 8e6401b..859ba39 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PassportInput.razor @@ -1,5 +1,4 @@ -@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services -@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider @using VisaApiClient
@@ -22,7 +21,7 @@


@@ -30,14 +29,14 @@

@code { - private string now = DateTime.Now.ToString("yyyy-MM-dd"); + private string formattedDate = null!; [Parameter, EditorRequired] public PassportModel Passport { get; set; } = null!; @@ -47,6 +46,7 @@ { Passport.IssueDate = DateTime.Now; Passport.ExpirationDate = DateTime.Now; + formattedDate = DateTimeProvider.FormattedNow(); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PlaceOfWorkInput.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PlaceOfWorkInput.razor index 988c47f..12bf632 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PlaceOfWorkInput.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/PlaceOfWorkInput.razor @@ -1,5 +1,4 @@ -@using BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models - +@using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models
diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs index 7b2d39c..2b4cb76 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs @@ -1,5 +1,5 @@ using System.Reflection; -using BlazorWebAssemblyVisaApiClient.Infrastructure.Services; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; using FluentValidation; using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/PlaceOfWorkModel.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/PlaceOfWorkModel.cs similarity index 90% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/PlaceOfWorkModel.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/PlaceOfWorkModel.cs index dc7ec95..cd6d703 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/PlaceOfWorkModel.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/PlaceOfWorkModel.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models +namespace BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models { /// Model of place of work with attributes required for validation to work public class PlaceOfWorkModel diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/RegisterApplicantRequestModel.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/RegisterApplicantRequestModel.cs similarity index 96% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/RegisterApplicantRequestModel.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/RegisterApplicantRequestModel.cs index d87f12d..d544d66 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/RegisterApplicantRequestModel.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/RegisterApplicantRequestModel.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models +namespace BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models { /// Model of request with attributes required for validation to work public class RegisterApplicantRequestModel diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/RegisterRequestModel.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/RegisterRequestModel.cs similarity index 80% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/RegisterRequestModel.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/RegisterRequestModel.cs index 682dd7a..a53b582 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Models/RegisterRequestModel.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Models/RegisterRequestModel.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models +namespace BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models { /// Model of request with attributes required for validation to work public class RegisterRequestModel diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/NameModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/NameModelValidator.cs similarity index 91% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/NameModelValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/NameModelValidator.cs index 14c334b..e75ac21 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/NameModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/NameModelValidator.cs @@ -1,7 +1,7 @@ using FluentValidation; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Validators; +namespace BlazorWebAssemblyVisaApiClient.Validation.Applicants.Validators; public class NameModelValidator : AbstractValidator { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PassportModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PassportModelValidator.cs similarity index 85% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PassportModelValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PassportModelValidator.cs index a8d0fbe..a4b5355 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PassportModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PassportModelValidator.cs @@ -1,9 +1,8 @@ -using BlazorWebAssemblyVisaApiClient.Infrastructure.Services; -using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; using FluentValidation; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Validators; +namespace BlazorWebAssemblyVisaApiClient.Validation.Applicants.Validators; public class PassportModelValidator : AbstractValidator { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PlaceOfWorkModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PlaceOfWorkModelValidator.cs similarity index 93% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PlaceOfWorkModelValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PlaceOfWorkModelValidator.cs index 2974164..ded903e 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/PlaceOfWorkModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PlaceOfWorkModelValidator.cs @@ -1,7 +1,7 @@ -using BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models; +using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models; using FluentValidation; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Validators; +namespace BlazorWebAssemblyVisaApiClient.Validation.Applicants.Validators; public class PlaceOfWorkModelValidator : AbstractValidator { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/RegisterApplicantRequestValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/RegisterApplicantRequestValidator.cs similarity index 87% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/RegisterApplicantRequestValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/RegisterApplicantRequestValidator.cs index 907e159..a726873 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Applicants/Validators/RegisterApplicantRequestValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/RegisterApplicantRequestValidator.cs @@ -1,11 +1,10 @@ -using BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models; -using BlazorWebAssemblyVisaApiClient.Infrastructure.Services; -using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models; using FluentValidation; using VisaApiClient; -using PlaceOfWorkModel = BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models.PlaceOfWorkModel; +using PlaceOfWorkModel = BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models.PlaceOfWorkModel; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Validators; +namespace BlazorWebAssemblyVisaApiClient.Validation.Applicants.Validators; public class RegisterApplicantRequestValidator : AbstractValidator { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Common/AuthDataValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs similarity index 92% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Common/AuthDataValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs index b9ce6de..560d88c 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Common/AuthDataValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs @@ -1,7 +1,7 @@ using FluentValidation; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Common; +namespace BlazorWebAssemblyVisaApiClient.Validation.Common; public class AuthDataValidator : AbstractValidator { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Common/RegisterRequestModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestModelValidator.cs similarity index 68% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Common/RegisterRequestModelValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestModelValidator.cs index 0111b9f..e223bbb 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/Common/RegisterRequestModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestModelValidator.cs @@ -1,8 +1,8 @@ -using BlazorWebAssemblyVisaApiClient.FluentValidation.Applicants.Models; +using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models; using FluentValidation; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.FluentValidation.Common; +namespace BlazorWebAssemblyVisaApiClient.Validation.Common; public class RegisterRequestModelValidator : AbstractValidator { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/ConfigurationConstraints.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/ConfigurationConstraints.cs similarity index 93% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/ConfigurationConstraints.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/ConfigurationConstraints.cs index 02bf65a..e1b3ccc 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/FluentValidation/ConfigurationConstraints.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/ConfigurationConstraints.cs @@ -1,4 +1,4 @@ -namespace BlazorWebAssemblyVisaApiClient.FluentValidation; +namespace BlazorWebAssemblyVisaApiClient.Validation; public static class ConfigurationConstraints { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs new file mode 100644 index 0000000..0e8e252 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs @@ -0,0 +1,40 @@ +using System.ComponentModel.DataAnnotations; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models +{ + /// Model for request for data annotations validation to work + public class VisaApplicationCreateRequestModel + { + [ValidateComplexType] + public ReentryPermitModel? ReentryPermit { get; set; } = new(); + + [Required] + [MaxLength(ConfigurationConstraints.CountryNameLength)] + public string DestinationCountry { get; set; } = default!; + + [Required] + public VisaCategory VisaCategory { get; set; } + + [Required] + public bool IsForGroup { get; set; } + + [Required] + public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } + + [Required] + [Range(0, ConfigurationConstraints.MaxValidDays)] + public int ValidDaysRequested { get; set; } + + [Required] + [ValidateComplexType] + public PastVisaModel[] PastVisas { get; set; } = default!; + + [ValidateComplexType] + public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = new(); + + [Required] + [ValidateComplexType] + public PastVisitModel[] PastVisits { get; set; } = default!; + } +} diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index 7cbe2e8..b084c8c 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -1713,14 +1713,12 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class PermissionToDestCountryModel { - [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.DateTimeOffset ExpirationDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - [System.ComponentModel.DataAnnotations.StringLength(200, MinimumLength = 1)] - public string Issuer { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.StringLength(200)] + public string? Issuer { get; set; } = default!; } @@ -1775,13 +1773,11 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class ReentryPermitModel { - [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - [System.ComponentModel.DataAnnotations.StringLength(25, MinimumLength = 1)] - public string Number { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.StringLength(25)] + public string? Number { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.DateTimeOffset ExpirationDate { get; set; } = default!; } @@ -1898,9 +1894,8 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class VisaApplicationCreateRequest { - [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - public ReentryPermitModel ReentryPermit { get; set; } = new ReentryPermitModel(); + [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ReentryPermitModel ReentryPermit { get; set; } = default!; [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index 108db59..d7f5a18 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"cityOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenship\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenshipByBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"permissionToDestCountry\",\r\n \"reentryPermit\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"cityOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenship\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenshipByBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" @@ -98,4 +98,4 @@ "newLineBehavior": "Auto" } } -} \ No newline at end of file +} From f90a0e7e822d80b75955b5f9c59b20aaccbd61b7 Mon Sep 17 00:00:00 2001 From: prtsie Date: Fri, 6 Sep 2024 21:37:16 +0300 Subject: [PATCH 19/30] Applications.razor for applicants --- .../Services/AuthServices/Common/AuthToken.cs | 9 +- .../VisaApplicationModelForApplicant.cs | 13 +- .../VisaApplicationModelForAuthority.cs | 14 +- .../Components/Auth/AuthComponent.razor | 40 ++--- .../UserDataProvider/IUserDataProvider.cs | 12 ++ .../UserDataProvider/UserDataProvider.cs | 30 ++++ .../Layout/NavMenu.razor | 7 + .../Pages/Applications.razor | 64 +++++--- .../BlazorWebAssemblyVisaApiClient/Program.cs | 2 + .../Infrastructure/Auth/TokenGenerator.cs | 2 +- SchengenVisaApi/VisaApiClient/Client.cs | 146 ++++++++++-------- SchengenVisaApi/VisaApiClient/ClientBase.cs | 7 +- .../VisaApiClient/clientGeneratorConfig.nswag | 6 +- 13 files changed, 227 insertions(+), 125 deletions(-) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Common/AuthToken.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Common/AuthToken.cs index 14ed58f..7c152ad 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Common/AuthToken.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Common/AuthToken.cs @@ -1,4 +1,9 @@ -namespace ApplicationLayer.Services.AuthServices.Common +using System.ComponentModel.DataAnnotations; + +namespace ApplicationLayer.Services.AuthServices.Common { - public record AuthToken(string Token); + public class AuthToken + { + [Required] public string Token { get; set; } = null!; + } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs index d12499b..d7898a9 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs @@ -1,4 +1,5 @@ -using Domains.VisaApplicationDomain; +using System.ComponentModel.DataAnnotations; +using Domains.VisaApplicationDomain; namespace ApplicationLayer.Services.VisaApplications.Models; @@ -6,38 +7,48 @@ namespace ApplicationLayer.Services.VisaApplications.Models; public class VisaApplicationModelForApplicant { /// + [Required] public Guid Id { get; set; } /// + [Required] public ApplicationStatus Status { get; set; } /// public ReentryPermitModel? ReentryPermit { get; set; } /// + [Required] public string DestinationCountry { get; set; } = null!; /// + [Required] public List PastVisas { get; set; } = null!; /// public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } /// + [Required] public List PastVisits { get; set; } = null!; /// + [Required] public VisaCategory VisaCategory { get; set; } /// + [Required] public bool ForGroup { get; set; } /// + [Required] public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } /// + [Required] public DateTime RequestDate { get; set; } /// + [Required] public int ValidDaysRequested { get; set; } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs index 6142168..3feb233 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs @@ -1,4 +1,5 @@ -using ApplicationLayer.Services.Applicants.Models; +using System.ComponentModel.DataAnnotations; +using ApplicationLayer.Services.Applicants.Models; using Domains.VisaApplicationDomain; namespace ApplicationLayer.Services.VisaApplications.Models; @@ -7,40 +8,51 @@ namespace ApplicationLayer.Services.VisaApplications.Models; public class VisaApplicationModelForAuthority { /// + [Required] public Guid Id { get; set; } /// Applicant of application + [Required] public ApplicantModel Applicant { get; set; } = null!; /// + [Required] public ApplicationStatus Status { get; set; } /// public ReentryPermitModel? ReentryPermit { get; set; } /// + [Required] public string DestinationCountry { get; set; } = null!; /// + [Required] public List PastVisas { get; set; } = null!; /// public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } + [Required] public List PastVisits { get; set; } = null!; /// + [Required] public VisaCategory VisaCategory { get; set; } /// + [Required] public bool ForGroup { get; set; } /// + [Required] public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } /// + [Required] public DateTime RequestDate { get; set; } /// + [Required] public int ValidDaysRequested { get; set; } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor index f531914..2883b7e 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor @@ -1,16 +1,10 @@ @using System.Net -@using System.IdentityModel.Tokens.Jwt -@using System.Security.Claims -@using BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions @using BlazorWebAssemblyVisaApiClient.ErrorHandling +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider @using VisaApiClient @code { - public static bool LoggedIn; - public static ApplicantModel? CurrentApplicant; //todo api action - public static string? CurrentRole; - private static AuthData savedData = null!; - private static readonly JwtSecurityTokenHandler TokenHandler = new(); + public static AuthData? AuthData; [CascadingParameter] private GlobalErrorHandler ErrorHandler { get; set; } = null!; @@ -20,6 +14,8 @@ [Inject] private NavigationManager Nav { get; set; } = null!; + [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; + ///Authorize with email and password /// Message to user public async Task TryAuthorize(AuthData authData) @@ -28,12 +24,8 @@ try { var token = await Client.LoginAsync(authData.Email, authData.Password); - Client.SetAuthToken(token); - CurrentRole = TokenHandler.ReadJwtToken(token.Token) - .Claims - .FirstOrDefault(claim => claim.Type == ClaimTypes.Role)? - .Value; - savedData = authData; + Client.AuthToken = token; + AuthData = authData; Status?.SetSucces("Logged in successfully."); } @@ -57,20 +49,18 @@ } ///Re-auth if token expired or something - public async Task ReAuthenticate(bool redirectOnFailure = true) + public async Task ReAuthenticate() { - if (!LoggedIn) + if (AuthData is not null) { - if (redirectOnFailure) - { - Nav.NavigateTo("/"); - return; - } - - throw new NotLoggedInException(); + await TryAuthorize(AuthData); + } + else + { + Client.AuthToken = null; + AuthData = null; + Nav.NavigateTo("/"); } - - await TryAuthorize(savedData); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs new file mode 100644 index 0000000..5c16af3 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs @@ -0,0 +1,12 @@ +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +{ + public interface IUserDataProvider + { + + public ApplicantModel? GetApplicant(); + + public string? GetCurrentRole(); + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs new file mode 100644 index 0000000..891d37b --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs @@ -0,0 +1,30 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +{ + public class UserDataProvider(Client client) : IUserDataProvider + { + private static readonly JwtSecurityTokenHandler tokenHandler = new (); + + public ApplicantModel? GetApplicant() + { + //todo api action + return null; + } + + public string? GetCurrentRole() + { + if (client.AuthToken is null) + { + return null; + } + + var token = tokenHandler.ReadJwtToken(client.AuthToken.Token); + var role = token.Claims.FirstOrDefault(claim => claim.Type == ClaimTypes.Role)?.Value; + + return role; + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor index 0a20ac1..5c3d358 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor @@ -15,6 +15,13 @@
+
@code { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index 6915e8b..8d4ac47 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -1,17 +1,30 @@ @page "/applications" @using System.Net @using System.Text -@using BlazorWebAssemblyVisaApiClient.Components.Auth @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider @using VisaApiClient @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase -@(AuthComponent.CurrentRole ?? "bruh") +Applications -@((MarkupString)htmlMarkup) + + + @((MarkupString)htmlHead) + + + @((MarkupString)htmlBody) + +
@code { - private string htmlMarkup = "bruh"; + private string htmlBody = null!; + + private string htmlHead = null!; + + [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; + + [Inject] private NavigationManager Nav { get; set; } = null!; protected override async Task OnInitializedAsync() { @@ -19,35 +32,42 @@ try { - switch (AuthComponent.CurrentRole) - { - case "Applicant": - var applications = await Client.GetForApplicantAsync(); + switch (UserDataProvider.GetCurrentRole()) + { + case "Applicant": + htmlHead = "Destination CountryVisa CategoryRequest dateDays requestedStatus"; + var applications = await Client.GetForApplicantAsync(); - stringBuilder.AppendLine(""); - foreach (var application in applications) - { - stringBuilder.AppendLine($""); - } + foreach (var application in applications) + { + var rowClass = application.Status switch + { + ApplicationStatus.Pending => "", + ApplicationStatus.Approved => "table-success", + ApplicationStatus.Rejected => "table-danger", + ApplicationStatus.Closed => "table-danger", + _ => throw new ArgumentOutOfRangeException() + }; - stringBuilder.AppendLine("
Destination CountryVisa CategoryRequest dateDays requestedStatus
{application.DestinationCountry}{application.VisaCategory.GetDisplayName()}{application.RequestDate.ToString("d")}{application.ValidDaysRequested}{application.Status.GetDisplayName()}
"); - htmlMarkup = stringBuilder.ToString(); - break; + stringBuilder.AppendLine($"{application.DestinationCountry}{application.VisaCategory.GetDisplayName()}{application.RequestDate.ToString("d")}{application.ValidDaysRequested}{application.Status.GetDisplayName()}"); + } + + htmlBody = stringBuilder.ToString(); + break; default: - htmlMarkup = AuthComponent.CurrentRole; - break; - } + Nav.NavigateTo("/"); //todo feedback + break; + } } catch (Exception e) { if (e is ApiException { Result.Status: (int)HttpStatusCode.Unauthorized } problemDetailsException) { - htmlMarkup = problemDetailsException.Result.Detail!; + htmlBody = $"

{problemDetailsException.Result.Detail!}

"; } else { - //ErrorHandler.Handle(e); - throw; + ErrorHandler.Handle(e); } } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs index 2b4cb76..e011331 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs @@ -1,5 +1,6 @@ using System.Reflection; using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider; using FluentValidation; using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; @@ -23,6 +24,7 @@ public class Program builder.Services.AddScoped(sp => new Client(baseAddress, sp.GetRequiredService())); builder.Services.AddSingleton(); + builder.Services.AddScoped(); builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly()); builder.Services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly()); diff --git a/SchengenVisaApi/Infrastructure/Auth/TokenGenerator.cs b/SchengenVisaApi/Infrastructure/Auth/TokenGenerator.cs index dd012f6..e40a76c 100644 --- a/SchengenVisaApi/Infrastructure/Auth/TokenGenerator.cs +++ b/SchengenVisaApi/Infrastructure/Auth/TokenGenerator.cs @@ -29,6 +29,6 @@ public class TokenGenerator(TokenGeneratorOptions options, JwtSecurityTokenHandl signingCredentials: options.Credentials, claims: claims); - return new AuthToken(tokenHandler.WriteToken(token)); + return new AuthToken { Token = tokenHandler.WriteToken(token) }; } } diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index b084c8c..6a7e5d5 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -1494,14 +1494,14 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class ApplicantModel { - [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public NameModel Name { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public NameModel? Name { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PassportModel Passport { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PassportModel? Passport { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.DateTimeOffset BirthDate { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? BirthDate { get; set; } = default!; [Newtonsoft.Json.JsonProperty("countryOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string? CountryOfBirth { get; set; } = default!; @@ -1515,28 +1515,28 @@ namespace VisaApiClient [Newtonsoft.Json.JsonProperty("citizenshipByBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string? CitizenshipByBirth { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public Gender Gender { get; set; } = default!; + public Gender? Gender { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public MaritalStatus MaritalStatus { get; set; } = default!; + public MaritalStatus? MaritalStatus { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public NameModel FatherName { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public NameModel? FatherName { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public NameModel MotherName { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public NameModel? MotherName { get; set; } = default!; [Newtonsoft.Json.JsonProperty("jobTitle", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string? JobTitle { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PlaceOfWorkModel PlaceOfWork { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PlaceOfWorkModel? PlaceOfWork { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool IsNonResident { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? IsNonResident { get; set; } = default!; } @@ -1576,8 +1576,9 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class AuthToken { - [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? Token { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Token { get; set; } = default!; } @@ -1713,8 +1714,8 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class PermissionToDestCountryModel { - [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.DateTimeOffset ExpirationDate { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? ExpirationDate { get; set; } = default!; [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] [System.ComponentModel.DataAnnotations.StringLength(200)] @@ -1777,8 +1778,8 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.StringLength(25)] public string? Number { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.DateTimeOffset ExpirationDate { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? ExpirationDate { get; set; } = default!; } @@ -1894,8 +1895,8 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class VisaApplicationCreateRequest { - [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public ReentryPermitModel ReentryPermit { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ReentryPermitModel? ReentryPermit { get; set; } = default!; [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] @@ -1923,8 +1924,8 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required] public System.Collections.Generic.ICollection PastVisas { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PermissionToDestCountryModel PermissionToDestCountry { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = default!; [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] @@ -1935,43 +1936,51 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class VisaApplicationModelForApplicant { - [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public ApplicationStatus Status { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public ReentryPermitModel ReentryPermit { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ReentryPermitModel? ReentryPermit { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? DestinationCountry { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string DestinationCountry { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection? PastVisas { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Collections.Generic.ICollection PastVisas { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PermissionToDestCountryModel PermissionToDestCountry { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection? PastVisits { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Collections.Generic.ICollection PastVisits { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public VisaCategory VisaCategory { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("forGroup", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("forGroup", Required = Newtonsoft.Json.Required.Always)] public bool ForGroup { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("requestDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("requestDate", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset RequestDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("validDaysRequested", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("validDaysRequested", Required = Newtonsoft.Json.Required.Always)] public int ValidDaysRequested { get; set; } = default!; } @@ -1979,46 +1988,55 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class VisaApplicationModelForAuthority { - [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("applicant", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public ApplicantModel Applicant { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("applicant", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public ApplicantModel Applicant { get; set; } = new ApplicantModel(); - [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public ApplicationStatus Status { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public ReentryPermitModel ReentryPermit { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ReentryPermitModel? ReentryPermit { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? DestinationCountry { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string DestinationCountry { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection? PastVisas { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Collections.Generic.ICollection PastVisas { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PermissionToDestCountryModel PermissionToDestCountry { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection? PastVisits { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Collections.Generic.ICollection PastVisits { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public VisaCategory VisaCategory { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("forGroup", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("forGroup", Required = Newtonsoft.Json.Required.Always)] public bool ForGroup { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("requestDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("requestDate", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset RequestDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("validDaysRequested", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("validDaysRequested", Required = Newtonsoft.Json.Required.Always)] public int ValidDaysRequested { get; set; } = default!; } diff --git a/SchengenVisaApi/VisaApiClient/ClientBase.cs b/SchengenVisaApi/VisaApiClient/ClientBase.cs index 5fcdbe5..b4150b8 100644 --- a/SchengenVisaApi/VisaApiClient/ClientBase.cs +++ b/SchengenVisaApi/VisaApiClient/ClientBase.cs @@ -4,12 +4,7 @@ namespace VisaApiClient { public class ClientBase { - protected AuthToken? AuthToken { get; private set; } - - public void SetAuthToken(AuthToken token) - { - AuthToken = token; - } + public AuthToken? AuthToken { get; set; } protected Task CreateHttpRequestMessageAsync(CancellationToken cancellationToken) { diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index d7f5a18..7c81e8b 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"cityOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenship\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenshipByBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n },\r\n \"nullable\": true\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"cityOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenship\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenshipByBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" @@ -89,7 +89,7 @@ "inlineNamedTuples": true, "inlineNamedAny": false, "generateDtoTypes": true, - "generateOptionalPropertiesAsNullable": false, + "generateOptionalPropertiesAsNullable": true, "generateNullableReferenceTypes": true, "templateDirectory": null, "serviceHost": null, @@ -98,4 +98,4 @@ "newLineBehavior": "Auto" } } -} +} \ No newline at end of file From c197a45f8379a523b3ecd28812a5292d17c58a09 Mon Sep 17 00:00:00 2001 From: prtsie Date: Fri, 6 Sep 2024 23:31:07 +0300 Subject: [PATCH 20/30] Application creating but without past visas and visits --- .../Applicants/Models/ApplicantModel.cs | 17 +- .../Services/Users/IUsersService.cs | 7 +- .../Services/Users/UsersService.cs | 16 +- .../Models/PermissionToDestCountryModel.cs | 2 + .../Models/ReentryPermitModel.cs | 2 + .../PermissionToDestCountryInput.razor | 2 +- .../VisaApplications/ReentryPermitInput.razor | 34 +++ .../ErrorHandling/GlobalErrorHandler.razor | 11 +- .../VisaApplicationCreateRequestProfile.cs | 14 ++ .../Helpers/ValidationResultExtensions.cs | 22 ++ .../UserDataProvider/IUserDataProvider.cs | 2 +- .../UserDataProvider/UserDataProvider.cs | 5 +- .../Layout/NavMenu.razor | 7 + .../Pages/Applications.razor | 8 - .../Pages/CreateApplication.razor | 97 +++++++-- .../Pages/Register.razor | 18 +- .../VisaApplicationCreateRequestModel.cs | 2 - .../Validators/PastVisaModelValidator.cs | 27 +++ .../Validators/PastVisitModelValidator.cs | 29 +++ .../PermissionToDestCountryModelValidator.cs | 23 ++ ...aApplicationCreateRequestModelValidator.cs | 42 ++++ .../Controllers/UsersController.cs | 16 +- SchengenVisaApi/VisaApiClient/Client.cs | 197 ++++++++++++++---- .../VisaApiClient/clientGeneratorConfig.nswag | 2 +- 24 files changed, 516 insertions(+), 86 deletions(-) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/ReentryPermitInput.razor create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/AutoMapper/Profiles/VisaApplicationCreateRequestProfile.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/ValidationResultExtensions.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestModelValidator.cs diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/ApplicantModel.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/ApplicantModel.cs index eecdd6d..1697dbf 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/ApplicantModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/ApplicantModel.cs @@ -1,4 +1,5 @@ -using Domains.ApplicantDomain; +using System.ComponentModel.DataAnnotations; +using Domains.ApplicantDomain; namespace ApplicationLayer.Services.Applicants.Models; @@ -6,44 +7,58 @@ namespace ApplicationLayer.Services.Applicants.Models; public class ApplicantModel { /// + [Required] public NameModel Name { get; set; } = null!; /// + [Required] public PassportModel Passport { get; set; } = null!; /// + [Required] public DateTime BirthDate { get; set; } /// + [Required] public string CountryOfBirth { get; set; } = null!; /// + [Required] public string CityOfBirth { get; set; } = null!; /// + [Required] public string Citizenship { get; set; } = null!; /// + [Required] public string CitizenshipByBirth { get; set; } = null!; /// + [Required] public Gender Gender { get; set; } /// + [Required] public MaritalStatus MaritalStatus { get; set; } /// + [Required] public NameModel FatherName { get; set; } = null!; /// + [Required] public NameModel MotherName { get; set; } = null!; /// + [Required] public string JobTitle { get; set; } = null!; /// + [Required] public PlaceOfWorkModel PlaceOfWork { get; set; } = null!; /// + [Required] public bool IsNonResident { get; set; } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/Users/IUsersService.cs b/SchengenVisaApi/ApplicationLayer/Services/Users/IUsersService.cs index a0a1840..a243394 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Users/IUsersService.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Users/IUsersService.cs @@ -1,4 +1,5 @@ -using ApplicationLayer.Services.Users.Models; +using ApplicationLayer.Services.Applicants.Models; +using ApplicationLayer.Services.Users.Models; using ApplicationLayer.Services.Users.Requests; namespace ApplicationLayer.Services.Users; @@ -19,4 +20,8 @@ public interface IUsersService /// Identifier of account /// Cancellation token Task RemoveAuthorityAccount(Guid userId, CancellationToken cancellationToken); + + /// Get applicant that made request + /// cancellation token + Task GetAuthenticatedApplicant(CancellationToken cancellationToken); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/Users/UsersService.cs b/SchengenVisaApi/ApplicationLayer/Services/Users/UsersService.cs index 529090a..0855cb5 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Users/UsersService.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Users/UsersService.cs @@ -1,4 +1,6 @@ using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.Applicants.Models; +using ApplicationLayer.Services.Applicants.NeededServices; using ApplicationLayer.Services.AuthServices.Common; using ApplicationLayer.Services.AuthServices.NeededServices; using ApplicationLayer.Services.Users.Exceptions; @@ -9,7 +11,12 @@ using Domains.Users; namespace ApplicationLayer.Services.Users; -public class UsersService(IMapper mapper, IUsersRepository users, IUnitOfWork unitOfWork) : IUsersService +public class UsersService( + IMapper mapper, + IUserIdProvider userIdProvider, + IUsersRepository users, + IApplicantsRepository applicants, + IUnitOfWork unitOfWork) : IUsersService { async Task> IUsersService.GetAuthoritiesAccountsAsync(CancellationToken cancellationToken) { @@ -35,6 +42,13 @@ public class UsersService(IMapper mapper, IUsersRepository users, IUnitOfWork un await RemoveUserAccount(user, cancellationToken); } + async Task IUsersService.GetAuthenticatedApplicant(CancellationToken cancellationToken) + { + var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken); + + return mapper.Map(applicant); + } + /// Updates user account auth data /// User to remove /// New auth data diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs index cfd6f40..64d8155 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs @@ -7,9 +7,11 @@ namespace ApplicationLayer.Services.VisaApplications.Models; public class PermissionToDestCountryModel { /// Date when permission to destination country expires + [Required] public DateTime ExpirationDate { get; set; } /// Issuing authority [MaxLength(ConfigurationConstraints.IssuerNameLength)] + [Required] public string Issuer { get; set; } = null!; } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs index 86a5542..d0f37ec 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/ReentryPermitModel.cs @@ -8,8 +8,10 @@ public class ReentryPermitModel { /// Number of re-entry permit [MaxLength(ConfigurationConstraints.ReentryPermitNumberLength)] + [Required] public string Number { get; set; } = null!; /// Date when re-entry permit expires + [Required] public DateTime ExpirationDate { get; set; } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor index 538711a..2a2c2af 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor @@ -13,7 +13,7 @@ Expiration date:
+ min="@formattedDate"/>
diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/ReentryPermitInput.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/ReentryPermitInput.razor new file mode 100644 index 0000000..40f842c --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/ReentryPermitInput.razor @@ -0,0 +1,34 @@ +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider +@using VisaApiClient + +
+
+
+ +
+ +
+ +@code { + private string formattedDate = null!; + + [Parameter, EditorRequired] public ReentryPermitModel ReentryPermit { get; set; } = null!; + + [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; + + protected override void OnInitialized() + { + formattedDate = DateTimeProvider.FormattedNow(); + ReentryPermit.ExpirationDate = DateTimeProvider.Now(); + } + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor index cd8bbc8..91bcd9a 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor @@ -1,4 +1,6 @@ - +@using System.Net +@using VisaApiClient + @ChildContent @@ -7,8 +9,13 @@ [Parameter] public RenderFragment? ChildContent { get; set; } + [Inject] private NavigationManager Nav { get; set; } = null!; + public void Handle(Exception ex) { - + if (ex is ApiException { StatusCode: (int)HttpStatusCode.Unauthorized or (int)HttpStatusCode.Forbidden }) + { + Nav.NavigateTo("/"); + } } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/AutoMapper/Profiles/VisaApplicationCreateRequestProfile.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/AutoMapper/Profiles/VisaApplicationCreateRequestProfile.cs new file mode 100644 index 0000000..2bf617e --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/AutoMapper/Profiles/VisaApplicationCreateRequestProfile.cs @@ -0,0 +1,14 @@ +using AutoMapper; +using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.AutoMapper.Profiles +{ + public class VisaApplicationCreateRequestProfile : Profile + { + public VisaApplicationCreateRequestProfile() + { + CreateMap(MemberList.Destination); + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/ValidationResultExtensions.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/ValidationResultExtensions.cs new file mode 100644 index 0000000..d77c8a5 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Helpers/ValidationResultExtensions.cs @@ -0,0 +1,22 @@ +using System.Text; +using FluentValidation.Results; + +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers +{ + public static class ValidationResultExtensions + { + public static string ToErrorsString(this ValidationResult validationResult) + => ErrorsToString(validationResult.Errors.Select(e => e.ErrorMessage)); + + private static string ErrorsToString(IEnumerable errors) + { + var stringBuilder = new StringBuilder(); + foreach (var error in errors) + { + stringBuilder.Append($"{error}
"); + } + + return stringBuilder.ToString(); + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs index 5c16af3..d6b22d2 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs @@ -5,7 +5,7 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide public interface IUserDataProvider { - public ApplicantModel? GetApplicant(); + public Task GetApplicant(); public string? GetCurrentRole(); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs index 891d37b..1c32a4b 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs @@ -8,10 +8,9 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide { private static readonly JwtSecurityTokenHandler tokenHandler = new (); - public ApplicantModel? GetApplicant() + public async Task GetApplicant() { - //todo api action - return null; + return await client.GetApplicantAsync(); } public string? GetCurrentRole() diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor index 5c3d358..86b80d9 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor @@ -22,6 +22,13 @@ + @code { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index 8d4ac47..d205367 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -1,5 +1,4 @@ @page "/applications" -@using System.Net @using System.Text @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider @@ -61,14 +60,7 @@ } catch (Exception e) { - if (e is ApiException { Result.Status: (int)HttpStatusCode.Unauthorized } problemDetailsException) - { - htmlBody = $"

{problemDetailsException.Result.Detail!}

"; - } - else - { ErrorHandler.Handle(e); - } } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor index ba34be5..232311d 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor @@ -1,10 +1,17 @@ -@page "/visaApplications/new" +@page "/applications/new" +@using System.Net +@using AutoMapper @using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants @using VisaApiClient @using BlazorWebAssemblyVisaApiClient.Components @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.VisaApplications +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +@using FluentValidation +@using Newtonsoft.Json +@using Newtonsoft.Json.Linq @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase New Application @@ -23,9 +30,10 @@


@@ -46,33 +54,98 @@
-
-
+ @if (requestModel.VisaCategory is VisaCategory.Transit) + { +
Permission to destination Country
- -
-

+ + + } + + @if (isNonResident) + { +
+
Re-entry permission
+ +
+
+ } + - +//todo past visas and visits @code { private VisaApplicationCreateRequestModel requestModel = new(); private Status status = null!; + private bool isNonResident; [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; - protected override void OnInitialized() + [Inject] IUserDataProvider UserDataProvider { get; set; } = null!; + + [Inject] IValidator VisaApplicationCreateRequestValidator { get; set; } = null!; + + [Inject] IMapper Mapper { get; set; } = null!; + + protected override async Task OnInitializedAsync() { + try + { + isNonResident = (await UserDataProvider.GetApplicant()).IsNonResident; + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + requestModel.PermissionToDestCountry!.ExpirationDate = DateTimeProvider.Now(); } - private static void TryCreate() + private async Task TryCreate() { + var validationResult = await VisaApplicationCreateRequestValidator.ValidateAsync(requestModel); + if (!validationResult.IsValid) + { + var errorsString = validationResult.ToErrorsString(); + status.SetError(errorsString); + } + status.SetMessage("Wait..."); + + var request = Mapper.Map(requestModel); + try + { + await Client.CreateApplicationAsync(request); + status.SetSucces("Application created successfully."); + } + catch (ApiException e) + { + if (e.StatusCode == (int)HttpStatusCode.BadRequest + && e.Result.AdditionalProperties.TryGetValue("errors", out var errors)) + { + var errorsList = ((JArray)errors).ToObject>(); + if (errorsList is null) + { + ErrorHandler.Handle(new JsonException("Can't convert validation errors to list")); + + return; + } + + status.SetError(string.Join("
", errorsList)); + } + else + { + ErrorHandler.Handle(e); + } + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor index b1fa043..170d927 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -1,6 +1,5 @@ @page "/register" @using System.Net -@using System.Text @using AutoMapper @using VisaApiClient @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants @@ -8,6 +7,7 @@ @using Newtonsoft.Json @using Newtonsoft.Json.Linq @using BlazorWebAssemblyVisaApiClient.Components +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider @using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase @@ -144,23 +144,12 @@ requestModel.BirthDate = DateTime.Now; } - private string ErrorsToString(IEnumerable errors) - { - var stringBuilder = new StringBuilder(); - foreach (var error in errors) - { - stringBuilder.Append($"{error}
"); - } - - return stringBuilder.ToString(); - } - private async void TryRegisterApplicant() { var validationResult = await RegisterApplicantRequestValidator.ValidateAsync(requestModel); if (!validationResult.IsValid) { - var errorsString = ErrorsToString(validationResult.Errors.Select(e => e.ErrorMessage)); + var errorsString = validationResult.ToErrorsString(); status.SetError(errorsString); return; @@ -187,7 +176,7 @@ return; } - status.SetError(ErrorsToString(errorsList)); + status.SetError(string.Join("
", errorsList)); } else { @@ -196,6 +185,7 @@ } catch (Exception e) { + status.SetError("Error occured"); ErrorHandler.Handle(e); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs index 0e8e252..ce979c9 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs @@ -26,14 +26,12 @@ namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models [Range(0, ConfigurationConstraints.MaxValidDays)] public int ValidDaysRequested { get; set; } - [Required] [ValidateComplexType] public PastVisaModel[] PastVisas { get; set; } = default!; [ValidateComplexType] public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = new(); - [Required] [ValidateComplexType] public PastVisitModel[] PastVisits { get; set; } = default!; } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs new file mode 100644 index 0000000..6a3f870 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs @@ -0,0 +1,27 @@ +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using FluentValidation; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; + +public class PastVisaModelValidator : AbstractValidator +{ + public PastVisaModelValidator(IDateTimeProvider dateTimeProvider) + { + RuleFor(v => v.ExpirationDate) + .NotEmpty() + .WithMessage("Expiration date of past visa can not be empty") + .GreaterThan(v => v.IssueDate) + .WithMessage("Past visa expiration date can not be earlier than issue date"); + + RuleFor(v => v.IssueDate) + .NotEmpty() + .WithMessage("Issue date of past visa can not be empty") + .LessThan(dateTimeProvider.Now()) + .WithMessage("Issue date of past visa must be in past"); + + RuleFor(v => v.Name) + .NotEmpty() + .WithMessage("Name of past visa can not be empty"); + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs new file mode 100644 index 0000000..bb19981 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs @@ -0,0 +1,29 @@ +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using FluentValidation; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; + +public class PastVisitModelValidator : AbstractValidator +{ + public PastVisitModelValidator(IDateTimeProvider dateTimeProvider) + { + RuleFor(v => v.StartDate) + .NotEmpty() + .WithMessage("Start date of past visit can not be empty") + .LessThan(v => v.EndDate) + .WithMessage("Start date of past visit must be earlier than end date") + .LessThan(dateTimeProvider.Now()) + .WithMessage("Start date of past visit must be in past"); + + RuleFor(v => v.EndDate) + .NotEmpty() + .WithMessage("End date of past visit can not be empty"); + + RuleFor(v => v.DestinationCountry) + .NotEmpty() + .WithMessage("Destination Country of past visit can not be null") + .MaximumLength(ConfigurationConstraints.CountryNameLength) + .WithMessage($"Destination Country of past visit length must be less than {ConfigurationConstraints.CountryNameLength}"); + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs new file mode 100644 index 0000000..8ed1c00 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs @@ -0,0 +1,23 @@ +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using FluentValidation; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; + +public class PermissionToDestCountryModelValidator : AbstractValidator +{ + public PermissionToDestCountryModelValidator(IDateTimeProvider dateTimeProvider) + { + RuleFor(p => p!.ExpirationDate) + .NotEmpty() + .WithMessage("Expiration date of permission to destination Country can not be empty") + .GreaterThan(dateTimeProvider.Now()) + .WithMessage("Permission to destination Country must not be expired"); + + RuleFor(p => p!.Issuer) + .NotEmpty() + .WithMessage("Issuer of permission for destination Country can not be empty") + .MaximumLength(ConfigurationConstraints.IssuerNameLength) + .WithMessage($"Issuer of permission to destination Country length must be less than {ConfigurationConstraints.IssuerNameLength}"); + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestModelValidator.cs new file mode 100644 index 0000000..04f5fc5 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestModelValidator.cs @@ -0,0 +1,42 @@ +using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models; +using FluentValidation; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; + +public class VisaApplicationCreateRequestModelValidator : AbstractValidator +{ + public VisaApplicationCreateRequestModelValidator( + IValidator pastVisaModelValidator, + IValidator permissionToDestCountryModelValidator, + IValidator pastVisitModelValidator) + { + RuleFor(r => r.PermissionToDestCountry) + .NotEmpty() + .WithMessage("For transit you must provide permission to destination country") + .SetValidator(permissionToDestCountryModelValidator) + .When(r => r.VisaCategory is VisaCategory.Transit); + + RuleFor(r => r.DestinationCountry) + .NotEmpty() + .WithMessage("Destination country can not be empty"); + + RuleFor(r => r.VisaCategory) + .IsInEnum(); + + RuleFor(r => r.RequestedNumberOfEntries) + .IsInEnum(); + + RuleFor(r => r.ValidDaysRequested) + .GreaterThan(0) + .WithMessage($"Valid days requested should be positive number and less than {ConfigurationConstraints.MaxValidDays}") + .LessThanOrEqualTo(ConfigurationConstraints.MaxValidDays) + .WithMessage($"Valid days requested must be less than or equal to {ConfigurationConstraints.MaxValidDays}"); + + RuleForEach(r => r.PastVisas) + .SetValidator(pastVisaModelValidator); + + RuleForEach(r => r.PastVisits) + .SetValidator(pastVisitModelValidator); + } +} diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs index aca41d0..031cf14 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs @@ -1,4 +1,5 @@ -using ApplicationLayer.Services.AuthServices.Common; +using ApplicationLayer.Services.Applicants.Models; +using ApplicationLayer.Services.AuthServices.Common; using ApplicationLayer.Services.AuthServices.LoginService; using ApplicationLayer.Services.AuthServices.RegisterService; using ApplicationLayer.Services.AuthServices.Requests; @@ -109,4 +110,17 @@ public class UsersController( await usersService.RemoveAuthorityAccount(authorityAccountId, cancellationToken); return Ok(); } + + /// Returns applicant info + [HttpGet("applicant")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [Authorize(policy: PolicyConstants.ApplicantPolicy)] + public async Task GetApplicant(CancellationToken cancellationToken) + { + + var result = await usersService.GetAuthenticatedApplicant(cancellationToken); + return Ok(result); + } } diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index 6a7e5d5..f81a0f3 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -742,6 +742,110 @@ namespace VisaApiClient } } + /// + /// Returns applicant info + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetApplicantAsync() + { + return GetApplicantAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Returns applicant info + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetApplicantAsync(System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/applicant" + urlBuilder_.Append("users/applicant"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + /// /// Returns pending applications /// @@ -1494,49 +1598,62 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class ApplicantModel { - [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public NameModel? Name { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public NameModel Name { get; set; } = new NameModel(); - [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PassportModel? Passport { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public PassportModel Passport { get; set; } = new PassportModel(); - [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.DateTimeOffset? BirthDate { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.DateTimeOffset BirthDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("countryOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? CountryOfBirth { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("countryOfBirth", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string CountryOfBirth { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("cityOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? CityOfBirth { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("cityOfBirth", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string CityOfBirth { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("citizenship", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? Citizenship { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("citizenship", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Citizenship { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("citizenshipByBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? CitizenshipByBirth { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("citizenshipByBirth", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string CitizenshipByBirth { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public Gender? Gender { get; set; } = default!; + public Gender Gender { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public MaritalStatus? MaritalStatus { get; set; } = default!; + public MaritalStatus MaritalStatus { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public NameModel? FatherName { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public NameModel FatherName { get; set; } = new NameModel(); - [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public NameModel? MotherName { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public NameModel MotherName { get; set; } = new NameModel(); - [Newtonsoft.Json.JsonProperty("jobTitle", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string? JobTitle { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("jobTitle", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string JobTitle { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PlaceOfWorkModel? PlaceOfWork { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public PlaceOfWorkModel PlaceOfWork { get; set; } = new PlaceOfWorkModel(); - [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? IsNonResident { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.Always)] + public bool IsNonResident { get; set; } = default!; } @@ -1714,12 +1831,14 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class PermissionToDestCountryModel { - [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.DateTimeOffset? ExpirationDate { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.DateTimeOffset ExpirationDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - [System.ComponentModel.DataAnnotations.StringLength(200)] - public string? Issuer { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(200, MinimumLength = 1)] + public string Issuer { get; set; } = default!; } @@ -1774,12 +1893,14 @@ namespace VisaApiClient [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public partial class ReentryPermitModel { - [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - [System.ComponentModel.DataAnnotations.StringLength(25)] - public string? Number { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(25, MinimumLength = 1)] + public string Number { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.DateTimeOffset? ExpirationDate { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.DateTimeOffset ExpirationDate { get; set; } = default!; } diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index 7c81e8b..dc3bcb6 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"cityOfBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenship\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"citizenshipByBirth\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" From 142148368f8092b96fd18420b6bfd5af2ef3edc5 Mon Sep 17 00:00:00 2001 From: prtsie Date: Sun, 8 Sep 2024 00:12:29 +0300 Subject: [PATCH 21/30] past visas --- .../VisaApplications/Models/PastVisaModel.cs | 3 +- .../VisaApplications/Models/PastVisitModel.cs | 3 +- .../Models/PermissionToDestCountryModel.cs | 1 - .../PermissionToDestCountryInput.razor | 2 +- .../Pages/CreateApplication.razor | 147 ++++++++++++++++-- .../Validation/ConfigurationConstraints.cs | 2 + .../VisaApplicationCreateRequestModel.cs | 6 +- SchengenVisaApi/VisaApiClient/Client.cs | 21 ++- .../VisaApiClient/clientGeneratorConfig.nswag | 2 +- 9 files changed, 154 insertions(+), 33 deletions(-) diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs index 8092a52..0aa0b02 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs @@ -11,11 +11,10 @@ public class PastVisaModel public DateTime IssueDate { get; set; } /// Name of visa - [Required] [MaxLength(ConfigurationConstraints.VisaNameLength)] public string Name { get; set; } = null!; /// Date when visa expires [Required] public DateTime ExpirationDate { get; set; } -} \ No newline at end of file +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs index f4dd901..16df158 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs @@ -15,7 +15,6 @@ public class PastVisitModel public DateTime EndDate { get; set; } /// Destination country of past visit - [Required] [MaxLength(ConfigurationConstraints.CountryNameLength)] public string DestinationCountry { get; set; } = null!; -} \ No newline at end of file +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs index 64d8155..cd1f59c 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs @@ -12,6 +12,5 @@ public class PermissionToDestCountryModel /// Issuing authority [MaxLength(ConfigurationConstraints.IssuerNameLength)] - [Required] public string Issuer { get; set; } = null!; } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor index 2a2c2af..5e9ac0f 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/VisaApplications/PermissionToDestCountryInput.razor @@ -3,7 +3,7 @@

diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor index 232311d..e7502c3 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor @@ -9,8 +9,8 @@ @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +@using BlazorWebAssemblyVisaApiClient.Validation @using FluentValidation -@using Newtonsoft.Json @using Newtonsoft.Json.Linq @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase @@ -54,6 +54,62 @@
+
+
Past visas
+ @if (currentPastVisa > 0) + { + + + + + + + + @for (var i = 0; i < currentPastVisa; i++) + { + var visa = requestModel.PastVisas[i]; + + + + + + + } + +
NameIssue dateExpiration date
@visa.Name@visa.IssueDate.ToString("d.MM.yyyy")@visa.ExpirationDate.ToString("d.MM.yyyy") + +
+ } +
+
+ +
+
+ +
+
+ + + +
+ @if (requestModel.VisaCategory is VisaCategory.Transit) {
@@ -61,12 +117,16 @@
} + else + { + requestModel.PermissionToDestCountry = null; + } @if (isNonResident) {
Re-entry permission
- +

} @@ -76,12 +136,17 @@ -//todo past visas and visits @code { + +//todo past visas and visits private VisaApplicationCreateRequestModel requestModel = new(); private Status status = null!; + private Status pastVisaStatus = null!; private bool isNonResident; + private int currentPastVisa; + private int currentPastVisit; + private string formattedNow = null!; [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; @@ -89,10 +154,22 @@ [Inject] IValidator VisaApplicationCreateRequestValidator { get; set; } = null!; + [Inject] IValidator PastVisaModelValidator { get; set; } = null!; + [Inject] IMapper Mapper { get; set; } = null!; protected override async Task OnInitializedAsync() { + requestModel.PastVisas = new PastVisaModel[ConfigurationConstraints.MaxPastVisas]; + for (var i = 0; i < requestModel.PastVisas.Length; i++) + { + requestModel.PastVisas[i] = new() + { + IssueDate = DateTimeProvider.Now(), + ExpirationDate = DateTimeProvider.Now() + }; + } + try { isNonResident = (await UserDataProvider.GetApplicant()).IsNonResident; @@ -102,11 +179,15 @@ ErrorHandler.Handle(e); } + formattedNow = DateTimeProvider.FormattedNow(); requestModel.PermissionToDestCountry!.ExpirationDate = DateTimeProvider.Now(); } private async Task TryCreate() { + requestModel.PastVisas = currentPastVisa == 0 ? [] : requestModel.PastVisas[..currentPastVisa]; + requestModel.PastVisits = currentPastVisit == 0 ? [] : requestModel.PastVisits[..currentPastVisit]; + var validationResult = await VisaApplicationCreateRequestValidator.ValidateAsync(requestModel); if (!validationResult.IsValid) { @@ -127,15 +208,16 @@ if (e.StatusCode == (int)HttpStatusCode.BadRequest && e.Result.AdditionalProperties.TryGetValue("errors", out var errors)) { - var errorsList = ((JArray)errors).ToObject>(); - if (errorsList is null) + try { - ErrorHandler.Handle(new JsonException("Can't convert validation errors to list")); - - return; + var errorsList = ((JArray)errors).ToObject>(); + status.SetError(string.Join("
", errorsList!)); + } + catch (Exception inner) + { + ErrorHandler.Handle(inner); + status.SetError("Error occured"); } - - status.SetError(string.Join("
", errorsList)); } else { @@ -148,4 +230,49 @@ } } + private void AddPastVisa() + { + var validationResult = PastVisaModelValidator.Validate(requestModel.PastVisas[currentPastVisa]); + if (!validationResult.IsValid) + { + pastVisaStatus.SetError(validationResult.ToErrorsString()); + return; + } + + if (currentPastVisa < requestModel.PastVisas.Length - 1) + { + currentPastVisa++; + pastVisaStatus.SetSucces("Added"); + } + else + { + pastVisaStatus.SetError($"{requestModel.PastVisas.Length} past visas is maximum"); + } + } + + private void RemovePastVisa(PastVisaModel visa) + { + currentPastVisa--; + var found = false; + + if (requestModel.PastVisas[^1] == visa) + { + requestModel.PastVisas[^1] = new(); + return; + } + + for (var i = 0; i < requestModel.PastVisas.Length - 1; i++) + { + if (requestModel.PastVisas[i] == visa) + { + found = true; + } + + if (found) + { + requestModel.PastVisas[i] = requestModel.PastVisas[i + 1]; + } + } + } + } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/ConfigurationConstraints.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/ConfigurationConstraints.cs index e1b3ccc..8cfc16a 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/ConfigurationConstraints.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/ConfigurationConstraints.cs @@ -20,4 +20,6 @@ public static class ConfigurationConstraints public const int ApplicantMinAge = 14; public const int JobTitleLength = 50; public const int MaxValidDays = 90; + public const int MaxPastVisas = 10; + public const int MaxPastVisits = 10; } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs index ce979c9..573e1dc 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs @@ -26,13 +26,11 @@ namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models [Range(0, ConfigurationConstraints.MaxValidDays)] public int ValidDaysRequested { get; set; } - [ValidateComplexType] - public PastVisaModel[] PastVisas { get; set; } = default!; + [ValidateComplexType] public PastVisaModel[] PastVisas { get; set; } = default!; [ValidateComplexType] public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = new(); - [ValidateComplexType] - public PastVisitModel[] PastVisits { get; set; } = default!; + [ValidateComplexType] public PastVisitModel[] PastVisits { get; set; } = default!; } } diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index f81a0f3..1f6069f 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -1799,10 +1799,9 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset IssueDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - [System.ComponentModel.DataAnnotations.StringLength(70, MinimumLength = 1)] - public string Name { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.StringLength(70)] + public string? Name { get; set; } = default!; [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] @@ -1821,10 +1820,9 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset EndDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - [System.ComponentModel.DataAnnotations.StringLength(70, MinimumLength = 1)] - public string DestinationCountry { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.StringLength(70)] + public string? DestinationCountry { get; set; } = default!; } @@ -1835,10 +1833,9 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset ExpirationDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - [System.ComponentModel.DataAnnotations.StringLength(200, MinimumLength = 1)] - public string Issuer { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.StringLength(200)] + public string? Issuer { get; set; } = default!; } diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index dc3bcb6..a840463 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" From c128349f3bb9780dc948272a9050b40657a6b79b Mon Sep 17 00:00:00 2001 From: prtsie Date: Sun, 8 Sep 2024 14:13:08 +0300 Subject: [PATCH 22/30] Validation fixes, finished application creation, added required char (*) for required fields --- SchengenVisaApi/ApplicationLayer/Constants.cs | 13 ++ .../Models/Validation/NameModelValidator.cs | 6 + .../Validation/PassportModelValidator.cs | 4 + .../Validation/PlaceOfWorkModelValidator.cs | 16 ++ .../Requests/Validation/AuthDataValidator.cs | 2 + .../RegisterApplicantRequestValidator.cs | 22 +- .../Validation/RegisterRequestValidator.cs | 1 + .../VisaApplications/Models/PastVisaModel.cs | 1 + .../VisaApplications/Models/PastVisitModel.cs | 1 + .../Models/PermissionToDestCountryModel.cs | 1 + .../Validation/PastVisaModelValidator.cs | 7 +- .../Validation/PastVisitModelValidator.cs | 2 + .../PermissionToDestCountryModelValidator.cs | 2 + .../Validation/ReentryPermitModelValidator.cs | 2 + .../Components/Auth/AuthComponent.razor | 2 +- .../FormComponents/Applicants/NameInput.razor | 4 +- .../Components/Status.razor | 2 +- .../Constants.cs | 16 ++ .../Pages/CreateApplication.razor | 202 +++++++++++++----- .../Pages/Register.razor | 21 +- .../Validators/NameModelValidator.cs | 6 + .../Validators/PassportModelValidator.cs | 4 + .../Validators/PlaceOfWorkModelValidator.cs | 16 ++ .../RegisterApplicantRequestValidator.cs | 26 ++- .../Validation/Common/AuthDataValidator.cs | 2 + ...lidator.cs => RegisterRequestValidator.cs} | 5 +- .../VisaApplicationCreateRequestModel.cs | 10 +- .../Validators/PastVisaModelValidator.cs | 6 +- .../Validators/PastVisitModelValidator.cs | 2 + .../PermissionToDestCountryModelValidator.cs | 2 + .../Validators/ReentryPermitModelValidator.cs | 25 +++ ... VisaApplicationCreateRequestValidator.cs} | 18 +- SchengenVisaApi/VisaApiClient/Client.cs | 21 +- .../VisaApiClient/clientGeneratorConfig.nswag | 2 +- 34 files changed, 372 insertions(+), 100 deletions(-) create mode 100644 SchengenVisaApi/ApplicationLayer/Constants.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/{RegisterRequestModelValidator.cs => RegisterRequestValidator.cs} (60%) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/ReentryPermitModelValidator.cs rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/{VisaApplicationCreateRequestModelValidator.cs => VisaApplicationCreateRequestValidator.cs} (64%) diff --git a/SchengenVisaApi/ApplicationLayer/Constants.cs b/SchengenVisaApi/ApplicationLayer/Constants.cs new file mode 100644 index 0000000..2cf42e8 --- /dev/null +++ b/SchengenVisaApi/ApplicationLayer/Constants.cs @@ -0,0 +1,13 @@ +using System.Text.RegularExpressions; + +namespace ApplicationLayer +{ + public static class Constants + { + public readonly static Regex EnglishWordRegex = new("^[a-zA-Z]*$"); + + public readonly static Regex EnglishPhraseRegex = new(@"^[a-zA-Z№0-9?><;,{}[\]\-_+=!@#$%\^&*|']*$"); + + public readonly static Regex PhoneNumRegex = new(@"^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$"); + } +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/NameModelValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/NameModelValidator.cs index 2ac282d..4bb629c 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/NameModelValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/NameModelValidator.cs @@ -10,16 +10,22 @@ public class NameModelValidator : AbstractValidator RuleFor(m => m.FirstName) .NotEmpty() .WithMessage("First Name can not be empty") + .Matches(Constants.EnglishWordRegex) + .WithMessage("First name must be in english characters") .MaximumLength(ConfigurationConstraints.NameLength) .WithMessage($"First Name length must be less than {ConfigurationConstraints.NameLength}"); RuleFor(m => m.Surname) .NotEmpty() .WithMessage("Surname can not be empty") + .Matches(Constants.EnglishWordRegex) + .WithMessage("Surname must be in english characters") .MaximumLength(ConfigurationConstraints.NameLength) .WithMessage($"Surname length must be less than {ConfigurationConstraints.NameLength}"); RuleFor(m => m.Patronymic) + .Matches(Constants.EnglishWordRegex) + .WithMessage("Patronymic must be in english characters") .MaximumLength(ConfigurationConstraints.NameLength) .WithMessage($"Patronymic length must be less than {ConfigurationConstraints.NameLength}"); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PassportModelValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PassportModelValidator.cs index 0671e7e..93eae59 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PassportModelValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PassportModelValidator.cs @@ -11,12 +11,16 @@ public class PassportModelValidator : AbstractValidator RuleFor(r => r.Issuer) .NotEmpty() .WithMessage("Passport issuer can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Passport issuer field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.IssuerNameLength) .WithMessage($"Passport issuer length must be less than {ConfigurationConstraints.IssuerNameLength}"); RuleFor(r => r.Number) .NotEmpty() .WithMessage("Passport number can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Passport number field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.PassportNumberLength) .WithMessage($"Passport number length must be less than {ConfigurationConstraints.PassportNumberLength}"); diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PlaceOfWorkModelValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PlaceOfWorkModelValidator.cs index 4008831..dc5449b 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PlaceOfWorkModelValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/Validation/PlaceOfWorkModelValidator.cs @@ -10,12 +10,16 @@ public class PlaceOfWorkModelValidator : AbstractValidator RuleFor(p => p.Name) .NotEmpty() .WithMessage("Place of work name can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work name field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.PlaceOfWorkNameLength) .WithMessage($"Place of work name length must be less than {ConfigurationConstraints.PlaceOfWorkNameLength}"); RuleFor(p => p.PhoneNum) .NotEmpty() .WithMessage("Place of work phone number can not be empty") + .Matches(Constants.PhoneNumRegex) + .WithMessage("Place of work phone number field must be valid") .MaximumLength(ConfigurationConstraints.PhoneNumberLength) .WithMessage( $"Phone number length must be in range from {ConfigurationConstraints.PhoneNumberMinLength} to {ConfigurationConstraints.PhoneNumberLength}") @@ -23,27 +27,39 @@ public class PlaceOfWorkModelValidator : AbstractValidator .WithMessage( $"Phone number length must be in range from {ConfigurationConstraints.PhoneNumberMinLength} to {ConfigurationConstraints.PhoneNumberLength}"); + RuleFor(p => p.Address) + .NotEmpty() + .WithMessage("Place of work address can not be empty"); + RuleFor(p => p.Address.Country) .NotEmpty() .WithMessage("Country name of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work Country field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Country name of place of work length must be less than {ConfigurationConstraints.CountryNameLength}"); RuleFor(p => p.Address.City) .NotEmpty() .WithMessage("City name of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work City field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CityNameLength) .WithMessage($"City name of place of work length must be less than {ConfigurationConstraints.CityNameLength}"); RuleFor(p => p.Address.Street) .NotEmpty() .WithMessage("Street name of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work Street field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.StreetNameLength) .WithMessage($"Street name of place of work length must be less than {ConfigurationConstraints.StreetNameLength}"); RuleFor(p => p.Address.Building) .NotEmpty() .WithMessage("Building of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work building field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Building of place of work length must be less than {ConfigurationConstraints.BuildingNumberLength}"); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/AuthDataValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/AuthDataValidator.cs index b8e1c55..273a3c7 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/AuthDataValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/AuthDataValidator.cs @@ -19,6 +19,8 @@ public class AuthDataValidator : AbstractValidator RuleFor(d => d.Password) .NotEmpty() .WithMessage("Password can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Password can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.PasswordLength) .WithMessage($"Password length must be less than {ConfigurationConstraints.PasswordLength}"); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterApplicantRequestValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterApplicantRequestValidator.cs index 0a8b159..8cf69e2 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterApplicantRequestValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterApplicantRequestValidator.cs @@ -15,18 +15,23 @@ public class RegisterApplicantRequestValidator : AbstractValidator placeOfWorkModelValidator) { RuleFor(r => r.RegisterRequest) + .NotEmpty() .SetValidator(registerRequestValidator); RuleFor(r => r.ApplicantName) + .NotEmpty() .SetValidator(nameValidator); RuleFor(r => r.FatherName) + .NotEmpty() .SetValidator(nameValidator); RuleFor(r => r.MotherName) + .NotEmpty() .SetValidator(nameValidator); RuleFor(r => r.Passport) + .NotEmpty() .SetValidator(passportValidator); RuleFor(r => r.BirthDate) @@ -38,38 +43,51 @@ public class RegisterApplicantRequestValidator : AbstractValidator r.CountryOfBirth) .NotEmpty() .WithMessage("Country of birth can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Country of birth field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Country of birth name length must be less than {ConfigurationConstraints.CountryNameLength}"); RuleFor(r => r.CityOfBirth) .NotEmpty() .WithMessage("City of birth can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("City of birth field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CityNameLength) .WithMessage($"City of birth name length must be less than {ConfigurationConstraints.CityNameLength}"); RuleFor(r => r.Citizenship) .NotEmpty() .WithMessage("Citizenship can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Citizenship field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CitizenshipLength) .WithMessage($"Citizenship length must be less than {ConfigurationConstraints.CitizenshipLength}"); RuleFor(r => r.CitizenshipByBirth) .NotEmpty() .WithMessage("Citizenship by birth can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Citizenship by birth field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CitizenshipLength) .WithMessage($"Citizenship by birth length must be less than {ConfigurationConstraints.CitizenshipLength}"); - RuleFor(r => r.Gender).IsInEnum(); + RuleFor(r => r.Gender) + .IsInEnum(); - RuleFor(r => r.MaritalStatus).IsInEnum(); + RuleFor(r => r.MaritalStatus) + .IsInEnum(); RuleFor(r => r.JobTitle) .NotEmpty() .WithMessage("Title of job can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Title of job field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.JobTitleLength) .WithMessage($"Title of job length must be less than {ConfigurationConstraints.JobTitleLength}"); RuleFor(r => r.PlaceOfWork) + .NotEmpty() .SetValidator(placeOfWorkModelValidator); } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterRequestValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterRequestValidator.cs index 87f342f..295cfce 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterRequestValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/Validation/RegisterRequestValidator.cs @@ -9,6 +9,7 @@ public class RegisterRequestValidator : AbstractValidator public RegisterRequestValidator(IUsersRepository users, IValidator authDataValidator) { RuleFor(r => r.AuthData) + .NotEmpty() .SetValidator(authDataValidator) .MustAsync(async (authData, ct) => await users.FindByEmailAsync(authData.Email, ct) is null) .WithMessage("Email already exists"); diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs index 0aa0b02..a421dbb 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisaModel.cs @@ -12,6 +12,7 @@ public class PastVisaModel /// Name of visa [MaxLength(ConfigurationConstraints.VisaNameLength)] + [Required] public string Name { get; set; } = null!; /// Date when visa expires diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs index 16df158..ae8f4a8 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs @@ -16,5 +16,6 @@ public class PastVisitModel /// Destination country of past visit [MaxLength(ConfigurationConstraints.CountryNameLength)] + [Required] public string DestinationCountry { get; set; } = null!; } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs index cd1f59c..64d8155 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PermissionToDestCountryModel.cs @@ -12,5 +12,6 @@ public class PermissionToDestCountryModel /// Issuing authority [MaxLength(ConfigurationConstraints.IssuerNameLength)] + [Required] public string Issuer { get; set; } = null!; } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisaModelValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisaModelValidator.cs index db09e36..ca6e0c4 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisaModelValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisaModelValidator.cs @@ -1,4 +1,5 @@ using ApplicationLayer.InfrastructureServicesInterfaces; +using Domains; using FluentValidation; namespace ApplicationLayer.Services.VisaApplications.Models.Validation; @@ -21,6 +22,10 @@ public class PastVisaModelValidator : AbstractValidator RuleFor(v => v.Name) .NotEmpty() - .WithMessage("Name of past visa can not be empty"); + .WithMessage("Name of past visa can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Name of past visa can contain only english letters, digits and special symbols") + .MaximumLength(ConfigurationConstraints.VisaNameLength) + .WithMessage($"Past visa name length must be less than {ConfigurationConstraints.VisaNameLength}"); } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisitModelValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisitModelValidator.cs index 19b4da3..bd08a96 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisitModelValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PastVisitModelValidator.cs @@ -23,6 +23,8 @@ public class PastVisitModelValidator : AbstractValidator RuleFor(v => v.DestinationCountry) .NotEmpty() .WithMessage("Destination Country of past visit can not be null") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Destination Country of past visit can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Destination Country of past visit length must be less than {ConfigurationConstraints.CountryNameLength}"); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PermissionToDestCountryModelValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PermissionToDestCountryModelValidator.cs index be267f7..e7618a6 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PermissionToDestCountryModelValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/PermissionToDestCountryModelValidator.cs @@ -17,6 +17,8 @@ public class PermissionToDestCountryModelValidator : AbstractValidator p!.Issuer) .NotEmpty() .WithMessage("Issuer of permission for destination Country can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Issuer of permission for destination Country can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.IssuerNameLength) .WithMessage($"Issuer of permission to destination Country length must be less than {ConfigurationConstraints.IssuerNameLength}"); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/ReentryPermitModelValidator.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/ReentryPermitModelValidator.cs index 4dfb291..35a0fcf 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/ReentryPermitModelValidator.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/Validation/ReentryPermitModelValidator.cs @@ -11,6 +11,8 @@ public class ReentryPermitModelValidator : AbstractValidator p!.Number) .NotEmpty() .WithMessage("Re-entry permit number can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Re-entry permit number can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.ReentryPermitNumberLength) .WithMessage($"Re-entry permit number length must be less than {ConfigurationConstraints.ReentryPermitNumberLength}"); diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor index 2883b7e..16d21bb 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor @@ -27,7 +27,7 @@ Client.AuthToken = token; AuthData = authData; - Status?.SetSucces("Logged in successfully."); + Status?.SetSuccess("Logged in successfully."); } catch (ApiException e) { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/NameInput.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/NameInput.razor index ad0de6c..4c6b2d8 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/NameInput.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/FormComponents/Applicants/NameInput.razor @@ -3,7 +3,7 @@

@@ -11,7 +11,7 @@

diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor index 44a5470..307de44 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Status.razor @@ -25,7 +25,7 @@ StateHasChanged(); } - public void SetSucces(string message) + public void SetSuccess(string message) { statusClass = "text-success"; StatusText = message; diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs new file mode 100644 index 0000000..3ae4656 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs @@ -0,0 +1,16 @@ +using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Components; + +namespace BlazorWebAssemblyVisaApiClient +{ + public static class Constants + { + public readonly static Regex EnglishWordRegex = new("^[a-zA-Z]*$"); + + public readonly static Regex EnglishPhraseRegex = new(@"^[a-zA-Z№0-9?><;,{}[\]\-_+=!@#$%\^&*|']*$"); + + public readonly static Regex PhoneNumRegex = new(@"^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$"); + + public readonly static MarkupString RequiredFieldMarkup = (MarkupString)"*"; + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor index e7502c3..1a108aa 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor @@ -22,7 +22,7 @@
-
Visa
+
Visa@(Constants.RequiredFieldMarkup)
-
Your passport
+
Your passport@(Constants.RequiredFieldMarkup)
-
Birth data
+
Birth data@(Constants.RequiredFieldMarkup)
-
Citizenship
+
Citizenship@(Constants.RequiredFieldMarkup)
-
Address of your place of work
+
Address of your place of work@(Constants.RequiredFieldMarkup)
-
Place of work data
+
Place of work data@(Constants.RequiredFieldMarkup)

@@ -132,6 +133,7 @@ { private RegisterApplicantRequestModel requestModel = new(); private Status status = null!; + private string formattedMaxBirthdayDate = null!; [Inject] IValidator RegisterApplicantRequestValidator { get; set; } = null!; @@ -141,7 +143,8 @@ protected override void OnInitialized() { - requestModel.BirthDate = DateTime.Now; + requestModel.BirthDate = DateTime.Now.AddYears(-ConfigurationConstraints.ApplicantMinAge); + formattedMaxBirthdayDate = requestModel.BirthDate.ToString("yyyy-MM-dd"); } private async void TryRegisterApplicant() @@ -161,7 +164,7 @@ try { await Client.RegisterAsync(request); - status.SetSucces("Register successful. Now log in."); + status.SetSuccess("Register successful. Now log in."); } catch (ApiException e) { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/NameModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/NameModelValidator.cs index e75ac21..d9a705a 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/NameModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/NameModelValidator.cs @@ -10,16 +10,22 @@ public class NameModelValidator : AbstractValidator RuleFor(m => m.FirstName) .NotEmpty() .WithMessage("First Name can not be empty") + .Matches(Constants.EnglishWordRegex) + .WithMessage("First name must be in english characters") .MaximumLength(ConfigurationConstraints.NameLength) .WithMessage($"First Name length must be less than {ConfigurationConstraints.NameLength}"); RuleFor(m => m.Surname) .NotEmpty() .WithMessage("Surname can not be empty") + .Matches(Constants.EnglishWordRegex) + .WithMessage("Surname must be in english characters") .MaximumLength(ConfigurationConstraints.NameLength) .WithMessage($"Surname length must be less than {ConfigurationConstraints.NameLength}"); RuleFor(m => m.Patronymic) + .Matches(Constants.EnglishWordRegex) + .WithMessage("Patronymic must be in english characters") .MaximumLength(ConfigurationConstraints.NameLength) .WithMessage($"Patronymic length must be less than {ConfigurationConstraints.NameLength}"); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PassportModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PassportModelValidator.cs index a4b5355..0849030 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PassportModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PassportModelValidator.cs @@ -11,12 +11,16 @@ public class PassportModelValidator : AbstractValidator RuleFor(r => r.Issuer) .NotEmpty() .WithMessage("Passport issuer can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Passport issuer field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.IssuerNameLength) .WithMessage($"Passport issuer length must be less than {ConfigurationConstraints.IssuerNameLength}"); RuleFor(r => r.Number) .NotEmpty() .WithMessage("Passport number can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Passport number field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.PassportNumberLength) .WithMessage($"Passport number length must be less than {ConfigurationConstraints.PassportNumberLength}"); diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PlaceOfWorkModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PlaceOfWorkModelValidator.cs index ded903e..e209364 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PlaceOfWorkModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/PlaceOfWorkModelValidator.cs @@ -10,12 +10,16 @@ public class PlaceOfWorkModelValidator : AbstractValidator RuleFor(p => p.Name) .NotEmpty() .WithMessage("Place of work name can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work name field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.PlaceOfWorkNameLength) .WithMessage($"Place of work name length must be less than {ConfigurationConstraints.PlaceOfWorkNameLength}"); RuleFor(p => p.PhoneNum) .NotEmpty() .WithMessage("Place of work phone number can not be empty") + .Matches(Constants.PhoneNumRegex) + .WithMessage("Place of work phone number field must be valid") .MaximumLength(ConfigurationConstraints.PhoneNumberLength) .WithMessage( $"Phone number length must be in range from {ConfigurationConstraints.PhoneNumberMinLength} to {ConfigurationConstraints.PhoneNumberLength}") @@ -23,27 +27,39 @@ public class PlaceOfWorkModelValidator : AbstractValidator .WithMessage( $"Phone number length must be in range from {ConfigurationConstraints.PhoneNumberMinLength} to {ConfigurationConstraints.PhoneNumberLength}"); + RuleFor(p => p.Address) + .NotEmpty() + .WithMessage("Place of work address can not be empty"); + RuleFor(p => p.Address.Country) .NotEmpty() .WithMessage("Country name of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work Country field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Country name of place of work length must be less than {ConfigurationConstraints.CountryNameLength}"); RuleFor(p => p.Address.City) .NotEmpty() .WithMessage("City name of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work City field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CityNameLength) .WithMessage($"City name of place of work length must be less than {ConfigurationConstraints.CityNameLength}"); RuleFor(p => p.Address.Street) .NotEmpty() .WithMessage("Street name of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work Street field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.StreetNameLength) .WithMessage($"Street name of place of work length must be less than {ConfigurationConstraints.StreetNameLength}"); RuleFor(p => p.Address.Building) .NotEmpty() .WithMessage("Building of place of work can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Place of work building field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Building of place of work length must be less than {ConfigurationConstraints.BuildingNumberLength}"); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/RegisterApplicantRequestValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/RegisterApplicantRequestValidator.cs index a726873..af813a0 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/RegisterApplicantRequestValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Applicants/Validators/RegisterApplicantRequestValidator.cs @@ -11,23 +11,28 @@ public class RegisterApplicantRequestValidator : AbstractValidator nameValidator, - IValidator registerRequestModelValidator, + IValidator registerRequestValidator, IValidator passportValidator, IValidator placeOfWorkModelValidator) { RuleFor(r => r.RegisterRequest) - .SetValidator(registerRequestModelValidator); + .NotEmpty() + .SetValidator(registerRequestValidator); RuleFor(r => r.ApplicantName) + .NotEmpty() .SetValidator(nameValidator); RuleFor(r => r.FatherName) + .NotEmpty() .SetValidator(nameValidator); RuleFor(r => r.MotherName) + .NotEmpty() .SetValidator(nameValidator); RuleFor(r => r.Passport) + .NotEmpty() .SetValidator(passportValidator); RuleFor(r => r.BirthDate) @@ -39,38 +44,51 @@ public class RegisterApplicantRequestValidator : AbstractValidator r.CountryOfBirth) .NotEmpty() .WithMessage("Country of birth can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Country of birth field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Country of birth name length must be less than {ConfigurationConstraints.CountryNameLength}"); RuleFor(r => r.CityOfBirth) .NotEmpty() .WithMessage("City of birth can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("City of birth field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CityNameLength) .WithMessage($"City of birth name length must be less than {ConfigurationConstraints.CityNameLength}"); RuleFor(r => r.Citizenship) .NotEmpty() .WithMessage("Citizenship can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Citizenship field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CitizenshipLength) .WithMessage($"Citizenship length must be less than {ConfigurationConstraints.CitizenshipLength}"); RuleFor(r => r.CitizenshipByBirth) .NotEmpty() .WithMessage("Citizenship by birth can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Citizenship by birth field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CitizenshipLength) .WithMessage($"Citizenship by birth length must be less than {ConfigurationConstraints.CitizenshipLength}"); - RuleFor(r => r.Gender).IsInEnum(); + RuleFor(r => r.Gender) + .IsInEnum(); - RuleFor(r => r.MaritalStatus).IsInEnum(); + RuleFor(r => r.MaritalStatus) + .IsInEnum(); RuleFor(r => r.JobTitle) .NotEmpty() .WithMessage("Title of job can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Title of job field can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.JobTitleLength) .WithMessage($"Title of job length must be less than {ConfigurationConstraints.JobTitleLength}"); RuleFor(r => r.PlaceOfWork) + .NotEmpty() .SetValidator(placeOfWorkModelValidator); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs index 560d88c..13f31d3 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs @@ -18,6 +18,8 @@ public class AuthDataValidator : AbstractValidator RuleFor(d => d.Password) .NotEmpty() .WithMessage("Password can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Password can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.PasswordLength) .WithMessage($"Password length must be less than {ConfigurationConstraints.PasswordLength}"); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestValidator.cs similarity index 60% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestModelValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestValidator.cs index e223bbb..d45c426 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestValidator.cs @@ -4,11 +4,12 @@ using VisaApiClient; namespace BlazorWebAssemblyVisaApiClient.Validation.Common; -public class RegisterRequestModelValidator : AbstractValidator +public class RegisterRequestValidator : AbstractValidator { - public RegisterRequestModelValidator(IValidator authDataValidator) + public RegisterRequestValidator(IValidator authDataValidator) { RuleFor(r => r.AuthData) + .NotEmpty() .SetValidator(authDataValidator); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs index 573e1dc..a15a453 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Models/VisaApplicationCreateRequestModel.cs @@ -7,7 +7,7 @@ namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models public class VisaApplicationCreateRequestModel { [ValidateComplexType] - public ReentryPermitModel? ReentryPermit { get; set; } = new(); + public ReentryPermitModel? ReentryPermit { get; set; } = default!; [Required] [MaxLength(ConfigurationConstraints.CountryNameLength)] @@ -26,11 +26,13 @@ namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models [Range(0, ConfigurationConstraints.MaxValidDays)] public int ValidDaysRequested { get; set; } - [ValidateComplexType] public PastVisaModel[] PastVisas { get; set; } = default!; + [ValidateComplexType] + public List PastVisas { get; set; } = []; [ValidateComplexType] - public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = new(); + public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = default!; - [ValidateComplexType] public PastVisitModel[] PastVisits { get; set; } = default!; + [ValidateComplexType] + public List PastVisits { get; set; } = []; } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs index 6a3f870..3eb0f65 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisaModelValidator.cs @@ -22,6 +22,10 @@ public class PastVisaModelValidator : AbstractValidator RuleFor(v => v.Name) .NotEmpty() - .WithMessage("Name of past visa can not be empty"); + .WithMessage("Name of past visa can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Name of past visa can contain only english letters, digits and special symbols") + .MaximumLength(ConfigurationConstraints.VisaNameLength) + .WithMessage($"Past visa name length must be less than {ConfigurationConstraints.VisaNameLength}"); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs index bb19981..8c0715a 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PastVisitModelValidator.cs @@ -23,6 +23,8 @@ public class PastVisitModelValidator : AbstractValidator RuleFor(v => v.DestinationCountry) .NotEmpty() .WithMessage("Destination Country of past visit can not be null") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Destination Country of past visit can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.CountryNameLength) .WithMessage($"Destination Country of past visit length must be less than {ConfigurationConstraints.CountryNameLength}"); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs index 8ed1c00..fc841e4 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/PermissionToDestCountryModelValidator.cs @@ -17,6 +17,8 @@ public class PermissionToDestCountryModelValidator : AbstractValidator p!.Issuer) .NotEmpty() .WithMessage("Issuer of permission for destination Country can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Issuer of permission for destination Country can contain only english letters, digits and special symbols") .MaximumLength(ConfigurationConstraints.IssuerNameLength) .WithMessage($"Issuer of permission to destination Country length must be less than {ConfigurationConstraints.IssuerNameLength}"); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/ReentryPermitModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/ReentryPermitModelValidator.cs new file mode 100644 index 0000000..fa8f19a --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/ReentryPermitModelValidator.cs @@ -0,0 +1,25 @@ +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; +using FluentValidation; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; + +public class ReentryPermitModelValidator : AbstractValidator +{ + public ReentryPermitModelValidator(IDateTimeProvider dateTimeProvider) + { + RuleFor(p => p!.Number) + .NotEmpty() + .WithMessage("Re-entry permit number can not be empty") + .Matches(Constants.EnglishPhraseRegex) + .WithMessage("Re-entry permit number can contain only english letters, digits and special symbols") + .MaximumLength(ConfigurationConstraints.ReentryPermitNumberLength) + .WithMessage($"Re-entry permit number length must be less than {ConfigurationConstraints.ReentryPermitNumberLength}"); + + RuleFor(p => p!.ExpirationDate) + .NotEmpty() + .WithMessage("Re-entry permit expiration date can not be empty") + .GreaterThan(dateTimeProvider.Now()) + .WithMessage("Re-entry permit must not be expired"); + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestModelValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestValidator.cs similarity index 64% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestModelValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestValidator.cs index 04f5fc5..d39edf1 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestModelValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/VisaApplications/Validators/VisaApplicationCreateRequestValidator.cs @@ -1,15 +1,18 @@ -using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider; +using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models; using FluentValidation; using VisaApiClient; namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; -public class VisaApplicationCreateRequestModelValidator : AbstractValidator +public class VisaApplicationCreateRequestValidator : AbstractValidator { - public VisaApplicationCreateRequestModelValidator( + public VisaApplicationCreateRequestValidator( + IValidator reentryPermitModelValidator, IValidator pastVisaModelValidator, IValidator permissionToDestCountryModelValidator, - IValidator pastVisitModelValidator) + IValidator pastVisitModelValidator, + IUserDataProvider userDataProvider) { RuleFor(r => r.PermissionToDestCountry) .NotEmpty() @@ -17,6 +20,13 @@ public class VisaApplicationCreateRequestModelValidator : AbstractValidator r.VisaCategory is VisaCategory.Transit); + RuleFor(r => r.ReentryPermit) + .NotEmpty() + .WithMessage("Non-residents must provide re-entry permission") + .SetValidator(reentryPermitModelValidator) + .WhenAsync(async (_, _) => + (await userDataProvider.GetApplicant()).IsNonResident); + RuleFor(r => r.DestinationCountry) .NotEmpty() .WithMessage("Destination country can not be empty"); diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index 1f6069f..f81a0f3 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -1799,9 +1799,10 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset IssueDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - [System.ComponentModel.DataAnnotations.StringLength(70)] - public string? Name { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(70, MinimumLength = 1)] + public string Name { get; set; } = default!; [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] @@ -1820,9 +1821,10 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset EndDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - [System.ComponentModel.DataAnnotations.StringLength(70)] - public string? DestinationCountry { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(70, MinimumLength = 1)] + public string DestinationCountry { get; set; } = default!; } @@ -1833,9 +1835,10 @@ namespace VisaApiClient [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset ExpirationDate { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - [System.ComponentModel.DataAnnotations.StringLength(200)] - public string? Issuer { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(200, MinimumLength = 1)] + public string Issuer { get; set; } = default!; } diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index a840463..dc3bcb6 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" From 11b28359ddd89da5d7b22dd9ddc9de86258aff20 Mon Sep 17 00:00:00 2001 From: prtsie Date: Sun, 8 Sep 2024 15:14:07 +0300 Subject: [PATCH 23/30] Closing applications --- .../Auth/Exceptions/NotLoggedInException.cs | 6 - .../Exceptions/UnknownRoleException.cs | 6 + .../UserDataProvider/UserDataProvider.cs | 9 +- .../Pages/Applications.razor | 130 +++++++++++++----- .../Pages/Register.razor | 3 - .../UnknownApplicationTypeException.cs | 6 + 6 files changed, 113 insertions(+), 47 deletions(-) delete mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs deleted file mode 100644 index ef88958..0000000 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs +++ /dev/null @@ -1,6 +0,0 @@ -using BlazorWebAssemblyVisaApiClient.Common; - -namespace BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions -{ - public class NotLoggedInException() : BlazorClientException("User is not logged in"); -} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs new file mode 100644 index 0000000..57e46a8 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs @@ -0,0 +1,6 @@ +using BlazorWebAssemblyVisaApiClient.Common; + +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider.Exceptions +{ + public class UnknownRoleException() : BlazorClientException("Unknown user role"); +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs index 1c32a4b..cb1d763 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs @@ -1,12 +1,14 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider.Exceptions; using VisaApiClient; namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider { public class UserDataProvider(Client client) : IUserDataProvider { - private static readonly JwtSecurityTokenHandler tokenHandler = new (); + private readonly static JwtSecurityTokenHandler tokenHandler = new (); + private readonly static string[] knownRoles = ["Applicant", "ApprovingAuthority", "Admin"]; public async Task GetApplicant() { @@ -23,6 +25,11 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide var token = tokenHandler.ReadJwtToken(client.AuthToken.Token); var role = token.Claims.FirstOrDefault(claim => claim.Type == ClaimTypes.Role)?.Value; + if (!knownRoles.Contains(role)) + { + throw new UnknownRoleException(); + } + return role; } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index d205367..63a5509 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -1,25 +1,63 @@ @page "/applications" -@using System.Text +@using System.Reflection @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +@using BlazorWebAssemblyVisaApiClient.PagesExceptions.Applications @using VisaApiClient @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase Applications - - @((MarkupString)htmlHead) - - - @((MarkupString)htmlBody) - + @switch (currentRole) + { + case "Applicant": + + + + + + + + + + + + + @foreach (var application in applications.Cast()) + { + var rowClass = application.Status switch + { + ApplicationStatus.Pending => "", + ApplicationStatus.Approved => "table-success", + ApplicationStatus.Rejected => "table-danger", + ApplicationStatus.Closed => "table-danger", + _ => throw new ArgumentOutOfRangeException() + }; + + + + + + + + + + } + + + break; + default: + Nav.NavigateTo("/"); //todo feedback + break; + }
Destination CountryVisa CategoryRequest dateDays requestedStatus
@application.DestinationCountry@application.VisaCategory.GetDisplayName()@application.RequestDate.ToString("d")@application.ValidDaysRequested@application.Status.GetDisplayName() + +
@code { - private string htmlBody = null!; - - private string htmlHead = null!; + private string currentRole = null!; + private IEnumerable applications = []; [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; @@ -27,41 +65,59 @@ protected override async Task OnInitializedAsync() { - var stringBuilder = new StringBuilder(); + currentRole = UserDataProvider.GetCurrentRole()!; + await Fetch(); + } + private async Task Fetch() + { try { - switch (UserDataProvider.GetCurrentRole()) + applications = currentRole switch { - case "Applicant": - htmlHead = "Destination CountryVisa CategoryRequest dateDays requestedStatus"; - var applications = await Client.GetForApplicantAsync(); - - foreach (var application in applications) - { - var rowClass = application.Status switch - { - ApplicationStatus.Pending => "", - ApplicationStatus.Approved => "table-success", - ApplicationStatus.Rejected => "table-danger", - ApplicationStatus.Closed => "table-danger", - _ => throw new ArgumentOutOfRangeException() - }; - - stringBuilder.AppendLine($"{application.DestinationCountry}{application.VisaCategory.GetDisplayName()}{application.RequestDate.ToString("d")}{application.ValidDaysRequested}{application.Status.GetDisplayName()}"); - } - - htmlBody = stringBuilder.ToString(); - break; - default: - Nav.NavigateTo("/"); //todo feedback - break; - } + "Applicant" => (await Client.GetForApplicantAsync()).OrderByDescending(a => a.RequestDate), + _ => throw new ArgumentOutOfRangeException() + }; } catch (Exception e) { - ErrorHandler.Handle(e); + ErrorHandler.Handle(e); } } + private async Task CloseApplication(object application) + { + try + { + PropertyInfo idProp; + PropertyInfo statusProp; + try + { + var type = applications.First().GetType(); + idProp = type.GetProperty("Id")!; + statusProp = type.GetProperty("Status")!; + if (idProp.PropertyType != typeof(Guid) + || statusProp.PropertyType != typeof(ApplicationStatus)) + { + throw new(); + } + } + catch (Exception) + { + throw new UnknownApplicationTypeException(); + } + + var id = (Guid)idProp.GetValue(application)!; + await Client.CloseApplicationAsync(id); + + statusProp.SetValue(application, ApplicationStatus.Closed); + StateHasChanged(); + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + + } + } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor index c286833..5052650 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -8,7 +8,6 @@ @using Newtonsoft.Json.Linq @using BlazorWebAssemblyVisaApiClient.Components @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers -@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider @using BlazorWebAssemblyVisaApiClient.Validation @using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase @@ -139,8 +138,6 @@ [Inject] IMapper Mapper { get; set; } = null!; - [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; - protected override void OnInitialized() { requestModel.BirthDate = DateTime.Now.AddYears(-ConfigurationConstraints.ApplicantMinAge); diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs new file mode 100644 index 0000000..2fc4c3e --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs @@ -0,0 +1,6 @@ +using BlazorWebAssemblyVisaApiClient.Common; + +namespace BlazorWebAssemblyVisaApiClient.PagesExceptions.Applications +{ + public class UnknownApplicationTypeException() : BlazorClientException("Application type is unknown"); +} From 3ef09cb478fb058f267810d6e04b6436405e1ad0 Mon Sep 17 00:00:00 2001 From: prtsie Date: Sun, 8 Sep 2024 22:19:14 +0300 Subject: [PATCH 24/30] Page for seeing full application --- .../IVisaApplicationRequestsHandler.cs | 10 +- .../VisaApplicationRequestsHandler.cs | 43 +-- ...orAuthority.cs => VisaApplicationModel.cs} | 2 +- ...Applicant.cs => VisaApplicationPreview.cs} | 24 +- .../{ => Exceptions}/BlazorClientException.cs | 2 +- .../Common/Exceptions/NotLoggedInException.cs | 4 + .../Constants.cs | 4 + .../Exceptions/UnknownRoleException.cs | 2 +- .../UserDataProvider/UserDataProvider.cs | 10 +- .../Pages/Application.razor | 213 +++++++++++++ .../Pages/Applications.razor | 116 +++---- .../Pages/CreateApplication.razor | 24 +- .../UnknownApplicationTypeException.cs | 6 - .../Profiles/VisaApplicationProfile.cs | 4 +- .../Controllers/VisaApplicationController.cs | 32 +- SchengenVisaApi/VisaApiClient/Client.cs | 294 ++++++++++++++++-- .../VisaApiClient/clientGeneratorConfig.nswag | 2 +- 17 files changed, 613 insertions(+), 179 deletions(-) rename SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/{VisaApplicationModelForAuthority.cs => VisaApplicationModel.cs} (97%) rename SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/{VisaApplicationModelForApplicant.cs => VisaApplicationPreview.cs} (51%) rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/{ => Exceptions}/BlazorClientException.cs (56%) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/Exceptions/NotLoggedInException.cs create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor delete mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs index 80cce41..154c2c6 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs @@ -6,10 +6,16 @@ namespace ApplicationLayer.Services.VisaApplications.Handlers; public interface IVisaApplicationRequestsHandler { /// Returns all applications for approving authorities - Task> GetPendingAsync(CancellationToken cancellationToken); + Task> GetPendingAsync(CancellationToken cancellationToken); /// Returns all applications of one applicant - Task> GetForApplicantAsync(CancellationToken cancellationToken); + Task> GetForApplicantAsync(CancellationToken cancellationToken); + + /// Returns one application with specific id + Task GetApplicationForApplicantAsync(Guid id, CancellationToken cancellationToken); + + /// Returns one application with specific id + Task GetApplicationForAuthorityAsync(Guid id, CancellationToken cancellationToken); /// Creates application for applicant with specific user identifier Task HandleCreateRequestAsync(VisaApplicationCreateRequest request, CancellationToken cancellationToken); diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs index 4ece238..9c8771b 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs @@ -19,24 +19,41 @@ public class VisaApplicationRequestsHandler( IDateTimeProvider dateTimeProvider, IUserIdProvider userIdProvider) : IVisaApplicationRequestsHandler { - async Task> IVisaApplicationRequestsHandler.GetPendingAsync(CancellationToken cancellationToken) + async Task> IVisaApplicationRequestsHandler.GetPendingAsync(CancellationToken cancellationToken) { var applicationsList = await applications.GetPendingApplicationsAsync(cancellationToken); - var applicationModels = applicationsList - .Select(a => MapVisaApplicationToModelForAuthorities(a, cancellationToken).Result) - .ToList(); + var applicationModels = mapper.Map>(applicationsList); return applicationModels; } - public async Task> GetForApplicantAsync(CancellationToken cancellationToken) + async Task> IVisaApplicationRequestsHandler.GetForApplicantAsync(CancellationToken cancellationToken) { var applicantId = await applicants.GetApplicantIdByUserId(userIdProvider.GetUserId(), cancellationToken); var visaApplications = await applications.GetOfApplicantAsync(applicantId, cancellationToken); - return mapper.Map>(visaApplications); + return mapper.Map>(visaApplications); } - public async Task HandleCreateRequestAsync(VisaApplicationCreateRequest request, CancellationToken cancellationToken) + async Task IVisaApplicationRequestsHandler.GetApplicationForApplicantAsync(Guid id, CancellationToken cancellationToken) + { + var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken); + var application = await applications.GetByApplicantAndApplicationIdAsync(applicant.Id, id, cancellationToken); + var mapped = mapper.Map(application); + mapped.Applicant = mapper.Map(applicant); + return mapped; + } + + async Task IVisaApplicationRequestsHandler.GetApplicationForAuthorityAsync(Guid id, CancellationToken cancellationToken) + { + var pending = await applications.GetPendingApplicationsAsync(cancellationToken); + var application = pending.SingleOrDefault(a => a.Id == id) ?? throw new ApplicationAlreadyProcessedException(); + var mapped = mapper.Map(application); + var applicant = await applicants.GetByIdAsync(application.ApplicantId, cancellationToken); + mapped.Applicant = mapper.Map(applicant); + return mapped; + } + + async Task IVisaApplicationRequestsHandler.HandleCreateRequestAsync(VisaApplicationCreateRequest request, CancellationToken cancellationToken) { var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken); @@ -87,16 +104,4 @@ public class VisaApplicationRequestsHandler( await unitOfWork.SaveAsync(cancellationToken); } - - private async Task MapVisaApplicationToModelForAuthorities(VisaApplication visaApplication, - CancellationToken cancellationToken) - { - var applicant = await applicants.GetByIdAsync(visaApplication.ApplicantId, cancellationToken); - var applicantModel = mapper.Map(applicant); - - var model = mapper.Map(visaApplication); - model.Applicant = applicantModel; - - return model; - } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModel.cs similarity index 97% rename from SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs rename to SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModel.cs index 3feb233..1e6e36a 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModel.cs @@ -5,7 +5,7 @@ using Domains.VisaApplicationDomain; namespace ApplicationLayer.Services.VisaApplications.Models; /// Model of with applicant property -public class VisaApplicationModelForAuthority +public class VisaApplicationModel { /// [Required] diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationPreview.cs similarity index 51% rename from SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs rename to SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationPreview.cs index d7898a9..94c8467 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationPreview.cs @@ -4,7 +4,7 @@ using Domains.VisaApplicationDomain; namespace ApplicationLayer.Services.VisaApplications.Models; /// Model of -public class VisaApplicationModelForApplicant +public class VisaApplicationPreview { /// [Required] @@ -14,36 +14,14 @@ public class VisaApplicationModelForApplicant [Required] public ApplicationStatus Status { get; set; } - /// - public ReentryPermitModel? ReentryPermit { get; set; } - /// [Required] public string DestinationCountry { get; set; } = null!; - /// - [Required] - public List PastVisas { get; set; } = null!; - - /// - public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } - - /// - [Required] - public List PastVisits { get; set; } = null!; - /// [Required] public VisaCategory VisaCategory { get; set; } - /// - [Required] - public bool ForGroup { get; set; } - - /// - [Required] - public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } - /// [Required] public DateTime RequestDate { get; set; } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/BlazorClientException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/Exceptions/BlazorClientException.cs similarity index 56% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/BlazorClientException.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/Exceptions/BlazorClientException.cs index 94264ad..7603cb9 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/BlazorClientException.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/Exceptions/BlazorClientException.cs @@ -1,4 +1,4 @@ -namespace BlazorWebAssemblyVisaApiClient.Common +namespace BlazorWebAssemblyVisaApiClient.Common.Exceptions { public class BlazorClientException(string message) : Exception(message); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/Exceptions/NotLoggedInException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/Exceptions/NotLoggedInException.cs new file mode 100644 index 0000000..130a6ec --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Common/Exceptions/NotLoggedInException.cs @@ -0,0 +1,4 @@ +namespace BlazorWebAssemblyVisaApiClient.Common.Exceptions +{ + public class NotLoggedInException() : BlazorClientException("User is not logged in."); +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs index 3ae4656..9131708 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Constants.cs @@ -12,5 +12,9 @@ namespace BlazorWebAssemblyVisaApiClient public readonly static Regex PhoneNumRegex = new(@"^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$"); public readonly static MarkupString RequiredFieldMarkup = (MarkupString)"*"; + + public const string ApplicantRole = "Applicant"; + public const string ApprovingAuthorityRole = "ApprovingAuthority"; + public const string AdminRole = "Admin"; } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs index 57e46a8..7ece731 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs @@ -1,4 +1,4 @@ -using BlazorWebAssemblyVisaApiClient.Common; +using BlazorWebAssemblyVisaApiClient.Common.Exceptions; namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider.Exceptions { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs index cb1d763..9119d94 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs @@ -7,8 +7,7 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide { public class UserDataProvider(Client client) : IUserDataProvider { - private readonly static JwtSecurityTokenHandler tokenHandler = new (); - private readonly static string[] knownRoles = ["Applicant", "ApprovingAuthority", "Admin"]; + private readonly static JwtSecurityTokenHandler tokenHandler = new(); public async Task GetApplicant() { @@ -25,9 +24,12 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide var token = tokenHandler.ReadJwtToken(client.AuthToken.Token); var role = token.Claims.FirstOrDefault(claim => claim.Type == ClaimTypes.Role)?.Value; - if (!knownRoles.Contains(role)) + switch (role) { - throw new UnknownRoleException(); + case Constants.ApplicantRole: break; + case Constants.ApprovingAuthorityRole: break; + case Constants.AdminRole: break; + default: throw new UnknownRoleException(); } return role; diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor new file mode 100644 index 0000000..023e17a --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor @@ -0,0 +1,213 @@ +@page "/applications/{ApplicationId}" +@using BlazorWebAssemblyVisaApiClient.Common.Exceptions +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +@using VisaApiClient +@inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase + +Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Applicant's fullname:
+ @NameToString(application.Applicant.Name) +
+ Date of birth:
+ @application.Applicant.BirthDate.ToString("d") +
+ Country and city of birth:
+ @application.Applicant.Passport.Number +
+ Citizenship:
+ @application.Applicant.Citizenship +
+ Citizenship by birth:
+ @application.Applicant.CitizenshipByBirth +
+ Gender:
+ @application.Applicant.Gender.GetDisplayName() +
+ Marital status:
+ @application.Applicant.MaritalStatus.GetDisplayName() +
+ Father's fullname:
+ @NameToString(application.Applicant.FatherName) +
+ Mother's fullname:
+ @NameToString(application.Applicant.MotherName) +
+ Passport number:
+ @application.Applicant.Passport.Number +
+ Issue date:
+ @application.Applicant.Passport.IssueDate.ToString("d") +
+ Expiration date:
+ @application.Applicant.Passport.ExpirationDate.ToString("d") +
+ Passport issuer:
+ @application.Applicant.Passport.Issuer +
+ Re-entry permission (for non-residents):
+ @if (application.Applicant.IsNonResident) + { + @(application.ReentryPermit is null ? "None" : $"{application.ReentryPermit.Number}, expires at {application.ReentryPermit.ExpirationDate:d}") + } + else + { + Not non-resident + } +
+ Job title:
+ @application.Applicant.JobTitle +
+ Place of work, address, hirer's phone number:
+ + @((MarkupString)$"{application.Applicant.PlaceOfWork.Name}
Address: {AddressToString(application.Applicant.PlaceOfWork.Address)}
Phone num: {application.Applicant.PlaceOfWork.PhoneNum}") +
+
+ Destination Country:
+ @application.DestinationCountry +
+ Visa category:
+ @application.VisaCategory +
+ Visa:
+ @(application.ForGroup ? "For group" : "Individual") +
+ Requested number of entries:
+ @application.RequestedNumberOfEntries.GetDisplayName() +
+ Valid for:
+ @($"{application.ValidDaysRequested} days") +
+ Past visas:
+ @if (application.PastVisas.Any()) + { + foreach (var visa in application.PastVisas) + { + @($"{visa.Name} issued at {visa.IssueDate:d} and was valid until {visa.ExpirationDate:d}") +
+ } + } + else + { + None + } +
+ Permission to destination Country, if transit:
+ @if (application.VisaCategory is VisaCategory.Transit) + { + @(application.PermissionToDestCountry is null ? "None" : $"Expires at {application.PermissionToDestCountry.ExpirationDate}, issued by: {application.PermissionToDestCountry.Issuer}") + } + else + { + Non-transit + } +
+ Past visits:
+ @if (application.PastVisas.Any()) + { + foreach (var visit in application.PastVisits) + { + @($"Visit to {visit.DestinationCountry}, entered at {visit.StartDate:d} and lasts until {visit.EndDate:d}") +
+ } + } + else + { + None + } +
+ +@code { + private VisaApplicationModel application = new(); + private string currentRole = null!; + + [Parameter] public string ApplicationId { get; set; } = null!; + + [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; + + protected override async Task OnInitializedAsync() + { + try + { + var applicationId = Guid.Parse(ApplicationId); + currentRole = UserDataProvider.GetCurrentRole() ?? throw new NotLoggedInException(); + + application = currentRole switch + { + Constants.ApplicantRole => await Client.GetApplicationForApplicantAsync(applicationId), + Constants.ApprovingAuthorityRole => await Client.GetApplicationForAuthorityAsync(applicationId), + _ => throw new NotLoggedInException() + }; + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + } + + private static string NameToString(NameModel name) + => $"{name.FirstName} {name.Surname} {name.Patronymic}".TrimEnd(); + + private static string AddressToString(AddressModel address) + => $"{address.Country}, {address.City}, {address.Street} {address.Building}"; + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index 63a5509..29eb31d 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -1,68 +1,62 @@ @page "/applications" -@using System.Reflection @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider -@using BlazorWebAssemblyVisaApiClient.PagesExceptions.Applications @using VisaApiClient @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase Applications - - @switch (currentRole) +
+ + + + + + + + + + + + + @foreach (var application in applications) { - case "Applicant": - - - - - - - - - - + var rowClass = application.Status switch + { + ApplicationStatus.Pending => "", + ApplicationStatus.Approved => "table-success", + ApplicationStatus.Rejected => "table-danger", + ApplicationStatus.Closed => "table-danger", + _ => throw new ArgumentOutOfRangeException() + }; - - @foreach (var application in applications.Cast()) - { - var rowClass = application.Status switch + + + + + + + - - - - - - - - } - - - break; - default: - Nav.NavigateTo("/"); //todo feedback - break; + | + + } + + } +
Destination CountryVisa CategoryRequest dateDays requestedStatus
Destination CountryVisa CategoryRequest dateDays requestedStatus
@application.DestinationCountry@application.VisaCategory.GetDisplayName()@application.RequestDate.ToString("d")@application.ValidDaysRequested@application.Status.GetDisplayName() + + + + @if (currentRole == Constants.ApplicantRole && application.Status is not ApplicationStatus.Closed) { - ApplicationStatus.Pending => "", - ApplicationStatus.Approved => "table-success", - ApplicationStatus.Rejected => "table-danger", - ApplicationStatus.Closed => "table-danger", - _ => throw new ArgumentOutOfRangeException() - }; - -
@application.DestinationCountry@application.VisaCategory.GetDisplayName()@application.RequestDate.ToString("d")@application.ValidDaysRequested@application.Status.GetDisplayName() - -
@code { private string currentRole = null!; - private IEnumerable applications = []; + private List applications = []; [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; - [Inject] private NavigationManager Nav { get; set; } = null!; - protected override async Task OnInitializedAsync() { currentRole = UserDataProvider.GetCurrentRole()!; @@ -75,7 +69,8 @@ { applications = currentRole switch { - "Applicant" => (await Client.GetForApplicantAsync()).OrderByDescending(a => a.RequestDate), + Constants.ApplicantRole => (await Client.GetForApplicantAsync()).OrderByDescending(a => a.RequestDate).ToList(), + Constants.ApprovingAuthorityRole => (await Client.GetPendingAsync()).OrderByDescending(a => a.RequestDate).ToList(), _ => throw new ArgumentOutOfRangeException() }; } @@ -85,39 +80,18 @@ } } - private async Task CloseApplication(object application) + private async Task CloseApplication(VisaApplicationPreview application) { try { - PropertyInfo idProp; - PropertyInfo statusProp; - try - { - var type = applications.First().GetType(); - idProp = type.GetProperty("Id")!; - statusProp = type.GetProperty("Status")!; - if (idProp.PropertyType != typeof(Guid) - || statusProp.PropertyType != typeof(ApplicationStatus)) - { - throw new(); - } - } - catch (Exception) - { - throw new UnknownApplicationTypeException(); - } - - var id = (Guid)idProp.GetValue(application)!; - await Client.CloseApplicationAsync(id); - - statusProp.SetValue(application, ApplicationStatus.Closed); + await Client.CloseApplicationAsync(application.Id); + application.Status = ApplicationStatus.Closed; StateHasChanged(); } catch (Exception e) { ErrorHandler.Handle(e); } - } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor index 1a108aa..6f4d28d 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor @@ -58,7 +58,7 @@
Past visas
@if (requestModel.PastVisas.Count > 0) { - +
@@ -68,12 +68,12 @@ @foreach (var visa in requestModel.PastVisas) { - - - - + + + } @@ -112,7 +112,7 @@
Past visits
@if (requestModel.PastVisits.Count > 0) { -
NameIssue dateExpiration date
@visa.Name@visa.IssueDate.ToString("d.MM.yyyy")@visa.ExpirationDate.ToString("d.MM.yyyy") + @visa.Name@visa.IssueDate.ToString("d.MM.yyyy")@visa.ExpirationDate.ToString("d.MM.yyyy") - +
+
@@ -122,12 +122,12 @@ @foreach (var visit in requestModel.PastVisits) { - - - - + + + } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs deleted file mode 100644 index 2fc4c3e..0000000 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs +++ /dev/null @@ -1,6 +0,0 @@ -using BlazorWebAssemblyVisaApiClient.Common; - -namespace BlazorWebAssemblyVisaApiClient.PagesExceptions.Applications -{ - public class UnknownApplicationTypeException() : BlazorClientException("Application type is unknown"); -} diff --git a/SchengenVisaApi/Infrastructure/Automapper/Profiles/VisaApplicationProfile.cs b/SchengenVisaApi/Infrastructure/Automapper/Profiles/VisaApplicationProfile.cs index 1393394..b014d08 100644 --- a/SchengenVisaApi/Infrastructure/Automapper/Profiles/VisaApplicationProfile.cs +++ b/SchengenVisaApi/Infrastructure/Automapper/Profiles/VisaApplicationProfile.cs @@ -9,9 +9,9 @@ public class VisaApplicationProfile : Profile { public VisaApplicationProfile() { - CreateMap(MemberList.Destination); + CreateMap(MemberList.Destination); - CreateMap(MemberList.Destination) + CreateMap(MemberList.Destination) .ForMember(model => model.Applicant, opts => opts.Ignore()); diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index 2f98b40..61ddb0c 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -18,7 +18,7 @@ public class VisaApplicationController( /// Returns pending applications /// Accessible only for approving authorities [HttpGet("pending")] - [ProducesResponseType>(StatusCodes.Status200OK)] + [ProducesResponseType>(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)] @@ -28,10 +28,38 @@ public class VisaApplicationController( return Ok(result); } + /// Returns application + /// Accessible only for approving authorities + [HttpGet("/forAuthority/{applicationId:guid}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)] + public async Task GetApplicationForAuthority(Guid applicationId, CancellationToken cancellationToken) + { + var result = await visaApplicationRequestsHandler.GetApplicationForAuthorityAsync(applicationId, cancellationToken); + return Ok(result); + } + + /// Returns application + /// Accessible only for applicant + [HttpGet("/forApplicant/{applicationId:guid}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [Authorize(policy: PolicyConstants.ApplicantPolicy)] + public async Task GetApplicationForApplicant(Guid applicationId, CancellationToken cancellationToken) + { + var result = await visaApplicationRequestsHandler.GetApplicationForApplicantAsync(applicationId, cancellationToken); + return Ok(result); + } + /// Returns all applications of one applicant /// Returns applications of authorized applicant [HttpGet("ofApplicant")] - [ProducesResponseType>(StatusCodes.Status200OK)] + [ProducesResponseType>(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index f81a0f3..1acdbb3 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -854,7 +854,7 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetPendingAsync() + public virtual System.Threading.Tasks.Task> GetPendingAsync() { return GetPendingAsync(System.Threading.CancellationToken.None); } @@ -868,7 +868,7 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetPendingAsync(System.Threading.CancellationToken cancellationToken) + public virtual async System.Threading.Tasks.Task> GetPendingAsync(System.Threading.CancellationToken cancellationToken) { var client_ = _httpClient; var disposeClient_ = false; @@ -909,7 +909,7 @@ namespace VisaApiClient var status_ = (int)response_.StatusCode; if (status_ == 200) { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); if (objectResponse_.Object == null) { throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); @@ -956,6 +956,254 @@ namespace VisaApiClient } } + /// + /// Returns application + /// + /// + /// Accessible only for approving authorities + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetApplicationForAuthorityAsync(System.Guid applicationId) + { + return GetApplicationForAuthorityAsync(applicationId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Returns application + /// + /// + /// Accessible only for approving authorities + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetApplicationForAuthorityAsync(System.Guid applicationId, System.Threading.CancellationToken cancellationToken) + { + if (applicationId == null) + throw new System.ArgumentNullException("applicationId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "forAuthority/{applicationId}" + urlBuilder_.Append("forAuthority/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(applicationId, System.Globalization.CultureInfo.InvariantCulture))); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Returns application + /// + /// + /// Accessible only for applicant + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetApplicationForApplicantAsync(System.Guid applicationId) + { + return GetApplicationForApplicantAsync(applicationId, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Returns application + /// + /// + /// Accessible only for applicant + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetApplicationForApplicantAsync(System.Guid applicationId, System.Threading.CancellationToken cancellationToken) + { + if (applicationId == null) + throw new System.ArgumentNullException("applicationId"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "forApplicant/{applicationId}" + urlBuilder_.Append("forApplicant/"); + urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(applicationId, System.Globalization.CultureInfo.InvariantCulture))); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + /// /// Returns all applications of one applicant /// @@ -964,7 +1212,7 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetForApplicantAsync() + public virtual System.Threading.Tasks.Task> GetForApplicantAsync() { return GetForApplicantAsync(System.Threading.CancellationToken.None); } @@ -978,7 +1226,7 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetForApplicantAsync(System.Threading.CancellationToken cancellationToken) + public virtual async System.Threading.Tasks.Task> GetForApplicantAsync(System.Threading.CancellationToken cancellationToken) { var client_ = _httpClient; var disposeClient_ = false; @@ -1019,7 +1267,7 @@ namespace VisaApiClient var status_ = (int)response_.StatusCode; if (status_ == 200) { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); if (objectResponse_.Object == null) { throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); @@ -2055,12 +2303,16 @@ namespace VisaApiClient } [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class VisaApplicationModelForApplicant + public partial class VisaApplicationModel { [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } = default!; + [Newtonsoft.Json.JsonProperty("applicant", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public ApplicantModel Applicant { get; set; } = new ApplicantModel(); + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] @@ -2107,52 +2359,26 @@ namespace VisaApiClient } [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class VisaApplicationModelForAuthority + public partial class VisaApplicationPreview { [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("applicant", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - public ApplicantModel Applicant { get; set; } = new ApplicantModel(); - [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public ApplicationStatus Status { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("reentryPermit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public ReentryPermitModel? ReentryPermit { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("destinationCountry", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public string DestinationCountry { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("pastVisas", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - public System.Collections.Generic.ICollection PastVisas { get; set; } = new System.Collections.ObjectModel.Collection(); - - [Newtonsoft.Json.JsonProperty("permissionToDestCountry", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = default!; - - [Newtonsoft.Json.JsonProperty("pastVisits", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required] - public System.Collections.Generic.ICollection PastVisits { get; set; } = new System.Collections.ObjectModel.Collection(); - [Newtonsoft.Json.JsonProperty("visaCategory", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public VisaCategory VisaCategory { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("forGroup", Required = Newtonsoft.Json.Required.Always)] - public bool ForGroup { get; set; } = default!; - - [Newtonsoft.Json.JsonProperty("requestedNumberOfEntries", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } = default!; - [Newtonsoft.Json.JsonProperty("requestDate", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTimeOffset RequestDate { get; set; } = default!; diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index dc3bcb6..f273bf6 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForAuthority\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModelForApplicant\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForApplicant\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModelForAuthority\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forAuthority/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetApplicationForAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forApplicant/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"GetApplicationForApplicant\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModel\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationPreview\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"id\",\r\n \"requestDate\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" From cb2bf433acc6706c88153cffce30df4a8b7924f7 Mon Sep 17 00:00:00 2001 From: prtsie Date: Sun, 8 Sep 2024 22:26:10 +0300 Subject: [PATCH 25/30] Redirect on NotLoggedInException --- .../ErrorHandling/GlobalErrorHandler.razor | 7 ++++++- .../Pages/Applications.razor | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor index 91bcd9a..4ab6a17 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor @@ -1,4 +1,5 @@ @using System.Net +@using BlazorWebAssemblyVisaApiClient.Common.Exceptions @using VisaApiClient @ChildContent @@ -13,7 +14,11 @@ public void Handle(Exception ex) { - if (ex is ApiException { StatusCode: (int)HttpStatusCode.Unauthorized or (int)HttpStatusCode.Forbidden }) + if (ex is ApiException + { + StatusCode: (int)HttpStatusCode.Unauthorized or (int)HttpStatusCode.Forbidden + } + or NotLoggedInException) { Nav.NavigateTo("/"); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index 29eb31d..07babb2 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -1,4 +1,5 @@ @page "/applications" +@using BlazorWebAssemblyVisaApiClient.Common.Exceptions @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider @using VisaApiClient @@ -71,7 +72,7 @@ { Constants.ApplicantRole => (await Client.GetForApplicantAsync()).OrderByDescending(a => a.RequestDate).ToList(), Constants.ApprovingAuthorityRole => (await Client.GetPendingAsync()).OrderByDescending(a => a.RequestDate).ToList(), - _ => throw new ArgumentOutOfRangeException() + _ => throw new NotLoggedInException() }; } catch (Exception e) From ceaade20b5202d3520f9500bea9c730a48d6e00b Mon Sep 17 00:00:00 2001 From: prtsie Date: Wed, 11 Sep 2024 20:35:34 +0300 Subject: [PATCH 26/30] Error handling and fixes --- .../BlazorWebAssemblyVisaApiClient.csproj | 3 + .../ErrorHandling/GlobalErrorHandler.razor | 40 ++++-- .../Pages/Application.razor | 52 +++++++- .../Pages/Applications.razor | 4 +- .../Pages/CreateApplication.razor | 2 +- .../Pages/Register.razor | 3 +- .../BlazorWebAssemblyVisaApiClient/Program.cs | 1 + .../_Imports.razor | 1 + .../wwwroot/index.html | 11 ++ .../Controllers/VisaApplicationController.cs | 20 +-- SchengenVisaApi/VisaApiClient/Client.cs | 114 ++++++++++-------- .../VisaApiClient/clientGeneratorConfig.nswag | 2 +- 12 files changed, 178 insertions(+), 75 deletions(-) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj index 24bb67e..af876cb 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj @@ -8,6 +8,7 @@ + @@ -22,6 +23,8 @@ <_ContentIncludedByDefault Remove="wwwroot\sample-data\weather.json" /> + <_ContentIncludedByDefault Remove="wwwroot\css\bootstrap\bootstrap.min.css" /> + <_ContentIncludedByDefault Remove="wwwroot\css\bootstrap\bootstrap.min.css.map" /> diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor index 4ab6a17..099ce4b 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor @@ -1,26 +1,52 @@ @using System.Net @using BlazorWebAssemblyVisaApiClient.Common.Exceptions @using VisaApiClient + + + + @errorDetails + + + + + @ChildContent @code { - [Parameter] - public RenderFragment? ChildContent { get; set; } + private Modal modal = null!; + private string errorDetails = null!; + + [Parameter] public RenderFragment? ChildContent { get; set; } [Inject] private NavigationManager Nav { get; set; } = null!; public void Handle(Exception ex) { - if (ex is ApiException + switch (ex) + { + case ApiException { StatusCode: (int)HttpStatusCode.Unauthorized or (int)HttpStatusCode.Forbidden - } - or NotLoggedInException) - { - Nav.NavigateTo("/"); + } or NotLoggedInException: + Nav.NavigateTo("/"); + modal.Title = "Authorization failed"; + errorDetails = "You are not authorized or your authorization is expired"; + break; + + case ApiException problemDetails: + modal.Title = problemDetails.Result.Title!; + errorDetails = problemDetails.Result.Detail!; + modal.ShowAsync(); + break; + + default: + modal.Title = "Something went wrong"; + errorDetails = "Please, text an email with your problem definition on nasrudin@mail.ru"; + modal.ShowAsync(); + break; } } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor index 023e17a..2b9725a 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor @@ -1,5 +1,6 @@ @page "/applications/{ApplicationId}" @using BlazorWebAssemblyVisaApiClient.Common.Exceptions +@using BlazorWebAssemblyVisaApiClient.Components @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider @using VisaApiClient @@ -175,15 +176,24 @@
Destination CountryStart dateEnd date
@visit.DestinationCountry@visit.StartDate.ToString("d.MM.yyyy")@visit.EndDate.ToString("d.MM.yyyy") + @visit.DestinationCountry@visit.StartDate.ToString("d.MM.yyyy")@visit.EndDate.ToString("d.MM.yyyy") - +
+@if (currentRole == Constants.ApprovingAuthorityRole) +{ + + + +} @code { private VisaApplicationModel application = new(); private string currentRole = null!; + private Status status = null!; [Parameter] public string ApplicationId { get; set; } = null!; [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; + [Inject] private NavigationManager Nav { get; set; } = null!; + protected override async Task OnInitializedAsync() { try @@ -191,12 +201,12 @@ var applicationId = Guid.Parse(ApplicationId); currentRole = UserDataProvider.GetCurrentRole() ?? throw new NotLoggedInException(); - application = currentRole switch - { - Constants.ApplicantRole => await Client.GetApplicationForApplicantAsync(applicationId), - Constants.ApprovingAuthorityRole => await Client.GetApplicationForAuthorityAsync(applicationId), - _ => throw new NotLoggedInException() - }; + application = currentRole switch + { + Constants.ApplicantRole => await Client.GetApplicationForApplicantAsync(applicationId), + Constants.ApprovingAuthorityRole => await Client.GetApplicationForAuthorityAsync(applicationId), + _ => throw new NotLoggedInException() + }; } catch (Exception e) { @@ -210,4 +220,34 @@ private static string AddressToString(AddressModel address) => $"{address.Country}, {address.City}, {address.Street} {address.Building}"; + private async void Approve() + { + try + { + status.SetMessage("Wait..."); + await Client.SetStatusFromAuthorityAsync(application.Id, AuthorityRequestStatuses.Approved); + Nav.NavigateTo("/applications"); + } + catch (Exception e) + { + status.SetError("Error occured."); + ErrorHandler.Handle(e); + } + } + + private async void Reject() + { + try + { + status.SetMessage("Wait..."); + await Client.SetStatusFromAuthorityAsync(application.Id, AuthorityRequestStatuses.Rejected); + Nav.NavigateTo("/applications"); + } + catch (Exception e) + { + status.SetError("Error occured."); + ErrorHandler.Handle(e); + } + } + } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index 07babb2..ac11d8c 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -41,7 +41,7 @@ - @if (currentRole == Constants.ApplicantRole && application.Status is not ApplicationStatus.Closed) + @if (currentRole == Constants.ApplicantRole && application.Status is ApplicationStatus.Pending) { | @@ -70,7 +70,7 @@ { applications = currentRole switch { - Constants.ApplicantRole => (await Client.GetForApplicantAsync()).OrderByDescending(a => a.RequestDate).ToList(), + Constants.ApplicantRole => (await Client.GetApplicationsForApplicantAsync()).OrderByDescending(a => a.RequestDate).ToList(), Constants.ApprovingAuthorityRole => (await Client.GetPendingAsync()).OrderByDescending(a => a.RequestDate).ToList(), _ => throw new NotLoggedInException() }; diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor index 6f4d28d..6723509 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor @@ -267,7 +267,7 @@ } else { - ErrorHandler.Handle(e); + throw; } } catch (Exception e) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor index 5052650..6478419 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -172,7 +172,6 @@ if (errorsList is null) { ErrorHandler.Handle(new JsonException("Can't convert validation errors to list")); - return; } @@ -180,7 +179,7 @@ } else { - ErrorHandler.Handle(e); + throw; } } catch (Exception e) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs index e011331..34a5dfd 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs @@ -21,6 +21,7 @@ public class Program //todo make pretty builder.Services.AddScoped(_ => new HttpClient { BaseAddress = new Uri(baseAddress) }); + builder.Services.AddBlazorBootstrap(); builder.Services.AddScoped(sp => new Client(baseAddress, sp.GetRequiredService())); builder.Services.AddSingleton(); diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor index 9a36077..7a917d0 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor @@ -8,3 +8,4 @@ @using Microsoft.JSInterop @using BlazorWebAssemblyVisaApiClient @using BlazorWebAssemblyVisaApiClient.Layout +@using BlazorBootstrap diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html index 07f85fe..679fa45 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html @@ -7,6 +7,9 @@ BlazorWebAssemblyVisaApiClient + + + @@ -27,6 +30,14 @@ 🗙 + + + + + + + + diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index 61ddb0c..c709e94 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -35,6 +35,7 @@ public class VisaApplicationController( [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status409Conflict)] [Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)] public async Task GetApplicationForAuthority(Guid applicationId, CancellationToken cancellationToken) { @@ -60,11 +61,11 @@ public class VisaApplicationController( /// Returns applications of authorized applicant [HttpGet("ofApplicant")] [ProducesResponseType>(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] - public async Task GetForApplicant(CancellationToken cancellationToken) + public async Task GetApplicationsForApplicant(CancellationToken cancellationToken) { var result = await visaApplicationRequestsHandler.GetForApplicantAsync(cancellationToken); return Ok(result); @@ -74,10 +75,10 @@ public class VisaApplicationController( /// Adds application for authorized applicant [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] public async Task CreateApplication(VisaApplicationCreateRequest request, CancellationToken cancellationToken) { @@ -91,10 +92,10 @@ public class VisaApplicationController( /// Accessible only for applicant [HttpPatch("{applicationId:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] public async Task CloseApplication(Guid applicationId, CancellationToken cancellationToken) { @@ -106,9 +107,10 @@ public class VisaApplicationController( /// Accessible only for authorities [HttpPatch("approving/{applicationId:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status409Conflict)] [Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)] public async Task SetStatusFromAuthority(Guid applicationId, AuthorityRequestStatuses status, diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index 1acdbb3..41ce4ec 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -1061,6 +1061,16 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 409) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1212,9 +1222,9 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetForApplicantAsync() + public virtual System.Threading.Tasks.Task> GetApplicationsForApplicantAsync() { - return GetForApplicantAsync(System.Threading.CancellationToken.None); + return GetApplicationsForApplicantAsync(System.Threading.CancellationToken.None); } /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. @@ -1226,7 +1236,7 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetForApplicantAsync(System.Threading.CancellationToken cancellationToken) + public virtual async System.Threading.Tasks.Task> GetApplicationsForApplicantAsync(System.Threading.CancellationToken cancellationToken) { var client_ = _httpClient; var disposeClient_ = false; @@ -1275,16 +1285,6 @@ namespace VisaApiClient return objectResponse_.Object; } else - if (status_ == 403) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 401) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1295,6 +1295,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1393,14 +1403,14 @@ namespace VisaApiClient return; } else - if (status_ == 403) + if (status_ == 400) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); if (objectResponse_.Object == null) { throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else if (status_ == 401) @@ -1413,6 +1423,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1423,16 +1443,6 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else - if (status_ == 400) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1522,14 +1532,14 @@ namespace VisaApiClient return; } else - if (status_ == 403) + if (status_ == 400) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); if (objectResponse_.Object == null) { throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else if (status_ == 401) @@ -1542,6 +1552,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1552,16 +1572,6 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else - if (status_ == 400) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1657,16 +1667,6 @@ namespace VisaApiClient return; } else - if (status_ == 403) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 401) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1677,6 +1677,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1687,6 +1697,16 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 409) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index f273bf6..4f91731 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forAuthority/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetApplicationForAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forApplicant/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"GetApplicationForApplicant\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModel\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationPreview\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"id\",\r\n \"requestDate\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forAuthority/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetApplicationForAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forApplicant/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"GetApplicationForApplicant\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetApplicationsForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModel\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationPreview\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"id\",\r\n \"requestDate\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" From e0cb2be804b3acc88b6d2594c4899c717a49389d Mon Sep 17 00:00:00 2001 From: prtsie Date: Wed, 11 Sep 2024 20:35:34 +0300 Subject: [PATCH 27/30] Error handling and fixes --- .../BlazorWebAssemblyVisaApiClient.csproj | 3 + .../ErrorHandling/GlobalErrorHandler.razor | 41 +++++-- .../Pages/Application.razor | 52 +++++++- .../Pages/Applications.razor | 4 +- .../Pages/CreateApplication.razor | 2 +- .../Pages/Register.razor | 3 +- .../BlazorWebAssemblyVisaApiClient/Program.cs | 1 + .../_Imports.razor | 1 + .../wwwroot/index.html | 11 ++ .../Controllers/VisaApplicationController.cs | 20 +-- SchengenVisaApi/VisaApiClient/Client.cs | 114 ++++++++++-------- .../VisaApiClient/clientGeneratorConfig.nswag | 2 +- 12 files changed, 179 insertions(+), 75 deletions(-) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj index 24bb67e..af876cb 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/BlazorWebAssemblyVisaApiClient.csproj @@ -8,6 +8,7 @@ + @@ -22,6 +23,8 @@ <_ContentIncludedByDefault Remove="wwwroot\sample-data\weather.json" /> + <_ContentIncludedByDefault Remove="wwwroot\css\bootstrap\bootstrap.min.css" /> + <_ContentIncludedByDefault Remove="wwwroot\css\bootstrap\bootstrap.min.css.map" /> diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor index 4ab6a17..dd59de5 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/ErrorHandling/GlobalErrorHandler.razor @@ -1,26 +1,53 @@ @using System.Net @using BlazorWebAssemblyVisaApiClient.Common.Exceptions @using VisaApiClient + + + + @errorDetails + + + + + @ChildContent @code { - [Parameter] - public RenderFragment? ChildContent { get; set; } + private Modal modal = null!; + private string errorDetails = null!; + + [Parameter] public RenderFragment? ChildContent { get; set; } [Inject] private NavigationManager Nav { get; set; } = null!; public void Handle(Exception ex) { - if (ex is ApiException + switch (ex) + { + case ApiException { StatusCode: (int)HttpStatusCode.Unauthorized or (int)HttpStatusCode.Forbidden - } - or NotLoggedInException) - { - Nav.NavigateTo("/"); + } or NotLoggedInException: + Nav.NavigateTo("/"); + modal.Title = "Authorization failed"; + errorDetails = "You are not authorized or your authorization is expired"; + modal.ShowAsync(); + break; + + case ApiException problemDetails: + modal.Title = problemDetails.Result.Title!; + errorDetails = problemDetails.Result.Detail!; + modal.ShowAsync(); + break; + + default: + modal.Title = "Something went wrong"; + errorDetails = "Please, text an email with your problem definition on nasrudin@mail.ru"; + modal.ShowAsync(); + break; } } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor index 023e17a..2b9725a 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor @@ -1,5 +1,6 @@ @page "/applications/{ApplicationId}" @using BlazorWebAssemblyVisaApiClient.Common.Exceptions +@using BlazorWebAssemblyVisaApiClient.Components @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider @using VisaApiClient @@ -175,15 +176,24 @@ +@if (currentRole == Constants.ApprovingAuthorityRole) +{ + + + +} @code { private VisaApplicationModel application = new(); private string currentRole = null!; + private Status status = null!; [Parameter] public string ApplicationId { get; set; } = null!; [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; + [Inject] private NavigationManager Nav { get; set; } = null!; + protected override async Task OnInitializedAsync() { try @@ -191,12 +201,12 @@ var applicationId = Guid.Parse(ApplicationId); currentRole = UserDataProvider.GetCurrentRole() ?? throw new NotLoggedInException(); - application = currentRole switch - { - Constants.ApplicantRole => await Client.GetApplicationForApplicantAsync(applicationId), - Constants.ApprovingAuthorityRole => await Client.GetApplicationForAuthorityAsync(applicationId), - _ => throw new NotLoggedInException() - }; + application = currentRole switch + { + Constants.ApplicantRole => await Client.GetApplicationForApplicantAsync(applicationId), + Constants.ApprovingAuthorityRole => await Client.GetApplicationForAuthorityAsync(applicationId), + _ => throw new NotLoggedInException() + }; } catch (Exception e) { @@ -210,4 +220,34 @@ private static string AddressToString(AddressModel address) => $"{address.Country}, {address.City}, {address.Street} {address.Building}"; + private async void Approve() + { + try + { + status.SetMessage("Wait..."); + await Client.SetStatusFromAuthorityAsync(application.Id, AuthorityRequestStatuses.Approved); + Nav.NavigateTo("/applications"); + } + catch (Exception e) + { + status.SetError("Error occured."); + ErrorHandler.Handle(e); + } + } + + private async void Reject() + { + try + { + status.SetMessage("Wait..."); + await Client.SetStatusFromAuthorityAsync(application.Id, AuthorityRequestStatuses.Rejected); + Nav.NavigateTo("/applications"); + } + catch (Exception e) + { + status.SetError("Error occured."); + ErrorHandler.Handle(e); + } + } + } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index 07babb2..ac11d8c 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -41,7 +41,7 @@ - @if (currentRole == Constants.ApplicantRole && application.Status is not ApplicationStatus.Closed) + @if (currentRole == Constants.ApplicantRole && application.Status is ApplicationStatus.Pending) { | @@ -70,7 +70,7 @@ { applications = currentRole switch { - Constants.ApplicantRole => (await Client.GetForApplicantAsync()).OrderByDescending(a => a.RequestDate).ToList(), + Constants.ApplicantRole => (await Client.GetApplicationsForApplicantAsync()).OrderByDescending(a => a.RequestDate).ToList(), Constants.ApprovingAuthorityRole => (await Client.GetPendingAsync()).OrderByDescending(a => a.RequestDate).ToList(), _ => throw new NotLoggedInException() }; diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor index 6f4d28d..6723509 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor @@ -267,7 +267,7 @@ } else { - ErrorHandler.Handle(e); + throw; } } catch (Exception e) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor index 5052650..6478419 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -172,7 +172,6 @@ if (errorsList is null) { ErrorHandler.Handle(new JsonException("Can't convert validation errors to list")); - return; } @@ -180,7 +179,7 @@ } else { - ErrorHandler.Handle(e); + throw; } } catch (Exception e) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs index e011331..34a5dfd 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Program.cs @@ -21,6 +21,7 @@ public class Program //todo make pretty builder.Services.AddScoped(_ => new HttpClient { BaseAddress = new Uri(baseAddress) }); + builder.Services.AddBlazorBootstrap(); builder.Services.AddScoped(sp => new Client(baseAddress, sp.GetRequiredService())); builder.Services.AddSingleton(); diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor index 9a36077..7a917d0 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/_Imports.razor @@ -8,3 +8,4 @@ @using Microsoft.JSInterop @using BlazorWebAssemblyVisaApiClient @using BlazorWebAssemblyVisaApiClient.Layout +@using BlazorBootstrap diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html index 07f85fe..679fa45 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/wwwroot/index.html @@ -7,6 +7,9 @@ BlazorWebAssemblyVisaApiClient + + + @@ -27,6 +30,14 @@ 🗙 + + + + + + + + diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index 61ddb0c..c709e94 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -35,6 +35,7 @@ public class VisaApplicationController( [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status409Conflict)] [Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)] public async Task GetApplicationForAuthority(Guid applicationId, CancellationToken cancellationToken) { @@ -60,11 +61,11 @@ public class VisaApplicationController( /// Returns applications of authorized applicant [HttpGet("ofApplicant")] [ProducesResponseType>(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] - public async Task GetForApplicant(CancellationToken cancellationToken) + public async Task GetApplicationsForApplicant(CancellationToken cancellationToken) { var result = await visaApplicationRequestsHandler.GetForApplicantAsync(cancellationToken); return Ok(result); @@ -74,10 +75,10 @@ public class VisaApplicationController( /// Adds application for authorized applicant [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] public async Task CreateApplication(VisaApplicationCreateRequest request, CancellationToken cancellationToken) { @@ -91,10 +92,10 @@ public class VisaApplicationController( /// Accessible only for applicant [HttpPatch("{applicationId:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(policy: PolicyConstants.ApplicantPolicy)] public async Task CloseApplication(Guid applicationId, CancellationToken cancellationToken) { @@ -106,9 +107,10 @@ public class VisaApplicationController( /// Accessible only for authorities [HttpPatch("approving/{applicationId:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status409Conflict)] [Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)] public async Task SetStatusFromAuthority(Guid applicationId, AuthorityRequestStatuses status, diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index 1acdbb3..41ce4ec 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -1061,6 +1061,16 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 409) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1212,9 +1222,9 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetForApplicantAsync() + public virtual System.Threading.Tasks.Task> GetApplicationsForApplicantAsync() { - return GetForApplicantAsync(System.Threading.CancellationToken.None); + return GetApplicationsForApplicantAsync(System.Threading.CancellationToken.None); } /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. @@ -1226,7 +1236,7 @@ namespace VisaApiClient /// /// Success /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetForApplicantAsync(System.Threading.CancellationToken cancellationToken) + public virtual async System.Threading.Tasks.Task> GetApplicationsForApplicantAsync(System.Threading.CancellationToken cancellationToken) { var client_ = _httpClient; var disposeClient_ = false; @@ -1275,16 +1285,6 @@ namespace VisaApiClient return objectResponse_.Object; } else - if (status_ == 403) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 401) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1295,6 +1295,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1393,14 +1403,14 @@ namespace VisaApiClient return; } else - if (status_ == 403) + if (status_ == 400) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); if (objectResponse_.Object == null) { throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else if (status_ == 401) @@ -1413,6 +1423,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1423,16 +1443,6 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else - if (status_ == 400) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1522,14 +1532,14 @@ namespace VisaApiClient return; } else - if (status_ == 403) + if (status_ == 400) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); if (objectResponse_.Object == null) { throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else if (status_ == 401) @@ -1542,6 +1552,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1552,16 +1572,6 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else - if (status_ == 400) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); @@ -1657,16 +1667,6 @@ namespace VisaApiClient return; } else - if (status_ == 403) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else if (status_ == 401) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1677,6 +1677,16 @@ namespace VisaApiClient throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else if (status_ == 404) { var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); @@ -1687,6 +1697,16 @@ namespace VisaApiClient throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); } else + if (status_ == 409) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Conflict", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index f273bf6..4f91731 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forAuthority/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetApplicationForAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forApplicant/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"GetApplicationForApplicant\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModel\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationPreview\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"id\",\r\n \"requestDate\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forAuthority/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetApplicationForAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forApplicant/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"GetApplicationForApplicant\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetApplicationsForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModel\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationPreview\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"id\",\r\n \"requestDate\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" From 18e02792ec372daf00703e42dfc268a3edaa21af Mon Sep 17 00:00:00 2001 From: prtsie Date: Thu, 12 Sep 2024 00:08:22 +0300 Subject: [PATCH 28/30] Navmenu related to current authorized user's role --- .../Components/Auth/AuthComponent.razor | 1 + .../UserDataProvider/IUserDataProvider.cs | 5 ++- .../UserDataProvider/UserDataProvider.cs | 15 +++++++-- .../Layout/NavMenu.razor | 31 ++++++++++++++----- .../Pages/Application.razor | 2 +- .../Pages/Applications.razor | 9 +++++- .../Pages/CreateApplication.razor | 2 +- 7 files changed, 50 insertions(+), 15 deletions(-) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor index 16d21bb..94e4841 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/AuthComponent.razor @@ -26,6 +26,7 @@ var token = await Client.LoginAsync(authData.Email, authData.Password); Client.AuthToken = token; AuthData = authData; + UserDataProvider.UpdateCurrentRole(); Status?.SetSuccess("Logged in successfully."); } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs index d6b22d2..f72ad20 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/IUserDataProvider.cs @@ -4,9 +4,12 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide { public interface IUserDataProvider { + public string? CurrentRole { get; } + + public Action? OnRoleChanged { get; set; } public Task GetApplicant(); - public string? GetCurrentRole(); + public void UpdateCurrentRole(); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs index 9119d94..56860ae 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs @@ -9,16 +9,21 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide { private readonly static JwtSecurityTokenHandler tokenHandler = new(); + public string? CurrentRole { get; private set; } + + public Action? OnRoleChanged { get; set; } + public async Task GetApplicant() { return await client.GetApplicantAsync(); } - public string? GetCurrentRole() + public void UpdateCurrentRole() { if (client.AuthToken is null) { - return null; + CurrentRole = null; + return; } var token = tokenHandler.ReadJwtToken(client.AuthToken.Token); @@ -32,7 +37,11 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide default: throw new UnknownRoleException(); } - return role; + if (CurrentRole != role) + { + CurrentRole = role; + OnRoleChanged?.Invoke(); + } } } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor index 86b80d9..589782a 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor @@ -1,4 +1,5 @@ - @code { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor index 2d7212c..aeb9ce7 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Application.razor @@ -1,4 +1,5 @@ @page "/applications/{ApplicationId}" +@using System.Net @using BlazorWebAssemblyVisaApiClient.Common.Exceptions @using BlazorWebAssemblyVisaApiClient.Components @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @@ -210,6 +211,11 @@ } catch (Exception e) { + + if (e is ApiException { Result.Status: (int)HttpStatusCode.Conflict }) + { + Nav.NavigateTo("/applications"); + } ErrorHandler.Handle(e); } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authorities.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authorities.razor new file mode 100644 index 0000000..776fca3 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authorities.razor @@ -0,0 +1,42 @@ +@page "/authorities" +@using VisaApiClient +@inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase + + + + + + + + + @foreach (var authority in authorities) + { + var path = $"authorities/{authority.Id}/{authority.Email}"; + + + + + } + +
Email
@authority.Email + + + +
+ +@code { + private IEnumerable authorities = []; + + protected override async Task OnInitializedAsync() + { + try + { + authorities = await Client.GetAuthorityAccountsAsync(); + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + } + +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authority.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authority.razor new file mode 100644 index 0000000..f60e1dc --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authority.razor @@ -0,0 +1,83 @@ +@page "/authorities/{authorityId}/{oldEmail}" +@inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase +@using BlazorWebAssemblyVisaApiClient.Common.Exceptions +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +@using VisaApiClient +@using BlazorWebAssemblyVisaApiClient.Components +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers +@using FluentValidation + + +
+

+ +

+ +
+ +

+
+ +@code +{ + private Status status = null!; + private ChangeAuthData model = new(); + + [Parameter] public string AuthorityId { get; set; } = null!; + + [Parameter] public string OldEmail { get; set; } = null!; + + [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; + + [Inject] private IValidator ChangeUserAuthDataRequestValidator { get; set; } = null!; + + protected override void OnInitialized() + { + try + { + if (UserDataProvider.CurrentRole is not Constants.AdminRole) + { + throw new NotLoggedInException(); + } + + model.Email = OldEmail; + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + } + + private async Task Save() + { + var request = new ChangeUserAuthDataRequest + { + UserId = Guid.Parse(AuthorityId), + NewAuthData = model + }; + + var validationResult = await ChangeUserAuthDataRequestValidator.ValidateAsync(request); + if (!validationResult.IsValid) + { + status.SetError(validationResult.ToErrorsString()); + return; + } + + try + { + status.SetMessage("Wait..."); + await Client.ChangeAuthorityAuthDataAsync(request); + status.SetSuccess("Success"); + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor index 43065e4..6ad2974 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/CreateApplication.razor @@ -102,7 +102,7 @@

- @@ -157,7 +157,7 @@

- @@ -185,7 +185,7 @@ } -
+
diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/AuthDataValidator.cs similarity index 93% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/AuthDataValidator.cs index 13f31d3..2c08563 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/AuthDataValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/AuthDataValidator.cs @@ -1,7 +1,7 @@ using FluentValidation; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.Validation.Common; +namespace BlazorWebAssemblyVisaApiClient.Validation.Auth; public class AuthDataValidator : AbstractValidator { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/ChangeUserAuthDataRequestValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/ChangeUserAuthDataRequestValidator.cs new file mode 100644 index 0000000..ffb45ae --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/ChangeUserAuthDataRequestValidator.cs @@ -0,0 +1,21 @@ +using FluentValidation; +using VisaApiClient; + +namespace BlazorWebAssemblyVisaApiClient.Validation.Auth +{ + public class ChangeUserAuthDataRequestValidator : AbstractValidator + { + public ChangeUserAuthDataRequestValidator() + { + RuleFor(r => r.NewAuthData) + .NotEmpty(); + + RuleFor(r => r.NewAuthData.Email) + .NotEmpty() + .EmailAddress() + .WithMessage("Email should be valid") + .MaximumLength(ConfigurationConstraints.EmailLength) + .WithMessage($"Email address length must be less than {ConfigurationConstraints.EmailLength}"); + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestValidator.cs similarity index 86% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestValidator.cs index d45c426..337adcf 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Common/RegisterRequestValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestValidator.cs @@ -2,7 +2,7 @@ using FluentValidation; using VisaApiClient; -namespace BlazorWebAssemblyVisaApiClient.Validation.Common; +namespace BlazorWebAssemblyVisaApiClient.Validation.Auth; public class RegisterRequestValidator : AbstractValidator { diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/Exceptions/ApplicantNotFoundByUserIdException.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/Exceptions/ApplicantNotFoundByUserIdException.cs index 52cb8f3..2c96cd9 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/Exceptions/ApplicantNotFoundByUserIdException.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/Exceptions/ApplicantNotFoundByUserIdException.cs @@ -1,4 +1,4 @@ -using ApplicationLayer.Services.GeneralExceptions; +using ApplicationLayer.GeneralExceptions; namespace Infrastructure.Database.Applicants.Repositories.Exceptions; diff --git a/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs b/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs index 04aee34..fc2792d 100644 --- a/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/Generic/GenericRepository.cs @@ -1,5 +1,5 @@ -using ApplicationLayer.InfrastructureServicesInterfaces; -using ApplicationLayer.Services.GeneralExceptions; +using ApplicationLayer.GeneralExceptions; +using ApplicationLayer.InfrastructureServicesInterfaces; using Domains; using Microsoft.EntityFrameworkCore; diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/Exceptions/ApplicationNotFoundByApplicantAndApplicationIdException.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/Exceptions/ApplicationNotFoundByApplicantAndApplicationIdException.cs index d148c8f..c950960 100644 --- a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/Exceptions/ApplicationNotFoundByApplicantAndApplicationIdException.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/Exceptions/ApplicationNotFoundByApplicantAndApplicationIdException.cs @@ -1,4 +1,4 @@ -using ApplicationLayer.Services.GeneralExceptions; +using ApplicationLayer.GeneralExceptions; namespace Infrastructure.Database.VisaApplications.Repositories.Exceptions; diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs index 031cf14..6729e5d 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs @@ -21,7 +21,7 @@ public class UsersController( ILoginService loginService, IUsersService usersService, IValidator registerApplicantRequestValidator, - IValidator authDataValidator, + IValidator changeUserAuthDataRequestValidator, IValidator registerRequestValidator) : ControllerBase { /// Adds applicant with user account @@ -60,7 +60,7 @@ public class UsersController( { var loginRequest = new LoginRequest { - AuthData = new AuthData { Email = email, Password = password } + AuthData = new() { Email = email, Password = password } }; var result = await loginService.LoginAsync(loginRequest, cancellationToken); @@ -82,18 +82,18 @@ public class UsersController( /// Changes authority's account authentication data /// Accessible only for admins - [HttpPut("authorities/{authorityAccountId:guid}")] + [HttpPut("authorities")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(policy: PolicyConstants.AdminPolicy)] - public async Task ChangeAuthorityAuthData(Guid authorityAccountId, AuthData authData, CancellationToken cancellationToken) + public async Task ChangeAuthorityAuthData(ChangeUserAuthDataRequest request, CancellationToken cancellationToken) { - await authDataValidator.ValidateAndThrowAsync(authData, cancellationToken); + await changeUserAuthDataRequestValidator.ValidateAndThrowAsync(request, cancellationToken); - await usersService.ChangeAuthorityAuthDataAsync(new ChangeUserAuthDataRequest(authorityAccountId, authData), cancellationToken); + await usersService.ChangeAuthorityAuthDataAsync(request, cancellationToken); return Ok(); } diff --git a/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs b/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs index 4cf9808..1fe118c 100644 --- a/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs +++ b/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs @@ -1,6 +1,5 @@ using ApplicationLayer.GeneralExceptions; using ApplicationLayer.Services.AuthServices.LoginService.Exceptions; -using ApplicationLayer.Services.GeneralExceptions; using ApplicationLayer.Services.VisaApplications.Exceptions; using FluentValidation; using Microsoft.AspNetCore.Mvc; diff --git a/SchengenVisaApi/VisaApiClient/Client.cs b/SchengenVisaApi/VisaApiClient/Client.cs index 41ce4ec..b99a8a9 100644 --- a/SchengenVisaApi/VisaApiClient/Client.cs +++ b/SchengenVisaApi/VisaApiClient/Client.cs @@ -388,6 +388,134 @@ namespace VisaApiClient } } + /// + /// Changes authority's account authentication data + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ChangeAuthorityAuthDataAsync(ChangeUserAuthDataRequest? body) + { + return ChangeAuthorityAuthDataAsync(body, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Changes authority's account authentication data + /// + /// + /// Accessible only for admins + /// + /// Success + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ChangeAuthorityAuthDataAsync(ChangeUserAuthDataRequest? body, System.Threading.CancellationToken cancellationToken) + { + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) + { + var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(body, JsonSerializerSettings); + var content_ = new System.Net.Http.StringContent(json_); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + + var urlBuilder_ = new System.Text.StringBuilder(); + if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); + // Operation Path: "users/authorities" + urlBuilder_.Append("users/authorities"); + + await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = new System.Collections.Generic.Dictionary>(); + foreach (var item_ in response_.Headers) + headers_[item_.Key] = item_.Value; + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 404) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 403) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 401) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + /// /// Returns JWT-token for authentication /// @@ -492,138 +620,6 @@ namespace VisaApiClient } } - /// - /// Changes authority's account authentication data - /// - /// - /// Accessible only for admins - /// - /// Success - /// A server side error occurred. - public virtual System.Threading.Tasks.Task ChangeAuthorityAuthDataAsync(System.Guid authorityAccountId, AuthData? body) - { - return ChangeAuthorityAuthDataAsync(authorityAccountId, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Changes authority's account authentication data - /// - /// - /// Accessible only for admins - /// - /// Success - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task ChangeAuthorityAuthDataAsync(System.Guid authorityAccountId, AuthData? body, System.Threading.CancellationToken cancellationToken) - { - if (authorityAccountId == null) - throw new System.ArgumentNullException("authorityAccountId"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) - { - var json_ = Newtonsoft.Json.JsonConvert.SerializeObject(body, JsonSerializerSettings); - var content_ = new System.Net.Http.StringContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("PUT"); - - var urlBuilder_ = new System.Text.StringBuilder(); - if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); - // Operation Path: "users/authorities/{authorityAccountId}" - urlBuilder_.Append("users/authorities/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(authorityAccountId, System.Globalization.CultureInfo.InvariantCulture))); - - await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - if (status_ == 404) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Not Found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else - if (status_ == 403) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else - if (status_ == 401) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else - if (status_ == 400) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - throw new ApiException("Bad Request", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - /// /// Removes authority's account /// @@ -1979,6 +1975,33 @@ namespace VisaApiClient } + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChangeAuthData + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(254, MinimumLength = 1)] + public string Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.StringLength(50)] + public string? Password { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChangeUserAuthDataRequest + { + [Newtonsoft.Json.JsonProperty("userId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.Guid UserId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("newAuthData", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public ChangeAuthData NewAuthData { get; set; } = new ChangeAuthData(); + + } + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] public enum Gender { diff --git a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag index 4f91731..2dff4fb 100644 --- a/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag +++ b/SchengenVisaApi/VisaApiClient/clientGeneratorConfig.nswag @@ -3,7 +3,7 @@ "defaultVariables": null, "documentGenerator": { "fromDocument": { - "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forAuthority/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetApplicationForAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forApplicant/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"GetApplicationForApplicant\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetApplicationsForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModel\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationPreview\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"id\",\r\n \"requestDate\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", + "json": "{\r\n \"openapi\": \"3.0.1\",\r\n \"info\": {\r\n \"title\": \"SchengenVisaApi\",\r\n \"version\": \"1.0\"\r\n },\r\n \"paths\": {\r\n \"/users/register\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds applicant with user account\",\r\n \"operationId\": \"Register\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterApplicantRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Adds approving authority with user account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RegisterAuthority\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns list of authority accounts\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"GetAuthorityAccounts\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserModel\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"put\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Changes authority's account authentication data\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"ChangeAuthorityAuthData\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ChangeUserAuthDataRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ChangeUserAuthDataRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ChangeUserAuthDataRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/login\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns JWT-token for authentication\",\r\n \"operationId\": \"Login\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"email\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthToken\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/authorities/{authorityAccountId}\": {\r\n \"delete\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Removes authority's account\",\r\n \"description\": \"Accessible only for admins\",\r\n \"operationId\": \"RemoveAuthorityAccount\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"authorityAccountId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/users/applicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"Users\"\r\n ],\r\n \"summary\": \"Returns applicant info\",\r\n \"operationId\": \"GetApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/pending\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns pending applications\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetPending\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forAuthority/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for approving authorities\",\r\n \"operationId\": \"GetApplicationForAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/forApplicant/{applicationId}\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns application\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"GetApplicationForApplicant\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationModel\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/ofApplicant\": {\r\n \"get\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Returns all applications of one applicant\",\r\n \"description\": \"Returns applications of authorized applicant\",\r\n \"operationId\": \"GetApplicationsForApplicant\",\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationPreview\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications\": {\r\n \"post\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Adds new application\",\r\n \"description\": \"Adds application for authorized applicant\",\r\n \"operationId\": \"CreateApplication\",\r\n \"requestBody\": {\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n },\r\n \"application/*+json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VisaApplicationCreateRequest\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Sets application status to closed\",\r\n \"description\": \"Accessible only for applicant\",\r\n \"operationId\": \"CloseApplication\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"400\": {\r\n \"description\": \"Bad Request\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"/visaApplications/approving/{applicationId}\": {\r\n \"patch\": {\r\n \"tags\": [\r\n \"VisaApplication\"\r\n ],\r\n \"summary\": \"Approve or reject applications\",\r\n \"description\": \"Accessible only for authorities\",\r\n \"operationId\": \"SetStatusFromAuthority\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"applicationId\",\r\n \"in\": \"path\",\r\n \"required\": true,\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AuthorityRequestStatuses\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Success\"\r\n },\r\n \"401\": {\r\n \"description\": \"Unauthorized\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"403\": {\r\n \"description\": \"Forbidden\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Not Found\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n },\r\n \"409\": {\r\n \"description\": \"Conflict\",\r\n \"content\": {\r\n \"text/plain\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n },\r\n \"text/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ProblemDetails\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"components\": {\r\n \"schemas\": {\r\n \"AddressModel\": {\r\n \"required\": [\r\n \"building\",\r\n \"city\",\r\n \"country\",\r\n \"street\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"country\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"city\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"street\": {\r\n \"maxLength\": 100,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"building\": {\r\n \"maxLength\": 10,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicantModel\": {\r\n \"required\": [\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"name\",\r\n \"passport\",\r\n \"placeOfWork\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"countryOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"cityOfBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ApplicationStatus\": {\r\n \"enum\": [\r\n \"Pending\",\r\n \"Approved\",\r\n \"Rejected\",\r\n \"Closed\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"AuthData\": {\r\n \"required\": [\r\n \"email\",\r\n \"password\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthToken\": {\r\n \"required\": [\r\n \"token\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"token\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"AuthorityRequestStatuses\": {\r\n \"enum\": [\r\n \"Approved\",\r\n \"Rejected\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"ChangeAuthData\": {\r\n \"required\": [\r\n \"email\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"password\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ChangeUserAuthDataRequest\": {\r\n \"required\": [\r\n \"newAuthData\",\r\n \"userId\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"userId\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"newAuthData\": {\r\n \"$ref\": \"#/components/schemas/ChangeAuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"Gender\": {\r\n \"enum\": [\r\n \"Unknown\",\r\n \"Male\",\r\n \"Female\",\r\n \"Turkish\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"MaritalStatus\": {\r\n \"enum\": [\r\n \"Other\",\r\n \"Married\",\r\n \"Unmarried\",\r\n \"Separated\",\r\n \"WidowOrWidower\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"NameModel\": {\r\n \"required\": [\r\n \"firstName\",\r\n \"surname\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"firstName\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"surname\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"patronymic\": {\r\n \"maxLength\": 50,\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PassportModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"issuer\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 20,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisaModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issueDate\",\r\n \"name\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"issueDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"name\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PastVisitModel\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"endDate\",\r\n \"startDate\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"startDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"endDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PermissionToDestCountryModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"issuer\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"issuer\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"PlaceOfWorkModel\": {\r\n \"required\": [\r\n \"address\",\r\n \"name\",\r\n \"phoneNum\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"maxLength\": 200,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"address\": {\r\n \"$ref\": \"#/components/schemas/AddressModel\"\r\n },\r\n \"phoneNum\": {\r\n \"maxLength\": 13,\r\n \"minLength\": 11,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"ProblemDetails\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"title\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"status\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\",\r\n \"nullable\": true\r\n },\r\n \"detail\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n },\r\n \"instance\": {\r\n \"type\": \"string\",\r\n \"nullable\": true\r\n }\r\n },\r\n \"additionalProperties\": {}\r\n },\r\n \"ReentryPermitModel\": {\r\n \"required\": [\r\n \"expirationDate\",\r\n \"number\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"number\": {\r\n \"maxLength\": 25,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"expirationDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterApplicantRequest\": {\r\n \"required\": [\r\n \"applicantName\",\r\n \"birthDate\",\r\n \"citizenship\",\r\n \"citizenshipByBirth\",\r\n \"cityOfBirth\",\r\n \"countryOfBirth\",\r\n \"fatherName\",\r\n \"gender\",\r\n \"isNonResident\",\r\n \"jobTitle\",\r\n \"maritalStatus\",\r\n \"motherName\",\r\n \"passport\",\r\n \"placeOfWork\",\r\n \"registerRequest\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"registerRequest\": {\r\n \"$ref\": \"#/components/schemas/RegisterRequest\"\r\n },\r\n \"applicantName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"passport\": {\r\n \"$ref\": \"#/components/schemas/PassportModel\"\r\n },\r\n \"birthDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"cityOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"countryOfBirth\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenship\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"citizenshipByBirth\": {\r\n \"maxLength\": 30,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"gender\": {\r\n \"$ref\": \"#/components/schemas/Gender\"\r\n },\r\n \"maritalStatus\": {\r\n \"$ref\": \"#/components/schemas/MaritalStatus\"\r\n },\r\n \"fatherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"motherName\": {\r\n \"$ref\": \"#/components/schemas/NameModel\"\r\n },\r\n \"jobTitle\": {\r\n \"maxLength\": 50,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"placeOfWork\": {\r\n \"$ref\": \"#/components/schemas/PlaceOfWorkModel\"\r\n },\r\n \"isNonResident\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RegisterRequest\": {\r\n \"required\": [\r\n \"authData\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"authData\": {\r\n \"$ref\": \"#/components/schemas/AuthData\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"RequestedNumberOfEntries\": {\r\n \"enum\": [\r\n \"Many\",\r\n \"One\",\r\n \"Two\"\r\n ],\r\n \"type\": \"string\"\r\n },\r\n \"UserModel\": {\r\n \"required\": [\r\n \"email\",\r\n \"id\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\",\r\n \"readOnly\": true\r\n },\r\n \"email\": {\r\n \"maxLength\": 254,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationCreateRequest\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"isForGroup\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestedNumberOfEntries\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"maxLength\": 70,\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"isForGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"validDaysRequested\": {\r\n \"maximum\": 90,\r\n \"minimum\": 0,\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationModel\": {\r\n \"required\": [\r\n \"applicant\",\r\n \"destinationCountry\",\r\n \"forGroup\",\r\n \"id\",\r\n \"pastVisas\",\r\n \"pastVisits\",\r\n \"requestDate\",\r\n \"requestedNumberOfEntries\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"applicant\": {\r\n \"$ref\": \"#/components/schemas/ApplicantModel\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"reentryPermit\": {\r\n \"$ref\": \"#/components/schemas/ReentryPermitModel\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"pastVisas\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisaModel\"\r\n }\r\n },\r\n \"permissionToDestCountry\": {\r\n \"$ref\": \"#/components/schemas/PermissionToDestCountryModel\"\r\n },\r\n \"pastVisits\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/PastVisitModel\"\r\n }\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"forGroup\": {\r\n \"type\": \"boolean\"\r\n },\r\n \"requestedNumberOfEntries\": {\r\n \"$ref\": \"#/components/schemas/RequestedNumberOfEntries\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaApplicationPreview\": {\r\n \"required\": [\r\n \"destinationCountry\",\r\n \"id\",\r\n \"requestDate\",\r\n \"status\",\r\n \"validDaysRequested\",\r\n \"visaCategory\"\r\n ],\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"format\": \"uuid\"\r\n },\r\n \"status\": {\r\n \"$ref\": \"#/components/schemas/ApplicationStatus\"\r\n },\r\n \"destinationCountry\": {\r\n \"minLength\": 1,\r\n \"type\": \"string\"\r\n },\r\n \"visaCategory\": {\r\n \"$ref\": \"#/components/schemas/VisaCategory\"\r\n },\r\n \"requestDate\": {\r\n \"type\": \"string\",\r\n \"format\": \"date-time\"\r\n },\r\n \"validDaysRequested\": {\r\n \"type\": \"integer\",\r\n \"format\": \"int32\"\r\n }\r\n },\r\n \"additionalProperties\": false\r\n },\r\n \"VisaCategory\": {\r\n \"enum\": [\r\n \"Transit\",\r\n \"ShortDated\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"Bearer\": {\r\n \"type\": \"http\",\r\n \"description\": \"Provide a JWT-token.\",\r\n \"scheme\": \"Bearer\",\r\n \"bearerFormat\": \"JWT\"\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"Bearer\": []\r\n }\r\n ]\r\n}", "url": "https://localhost:44370/swagger/v1/swagger.json", "output": null, "newLineBehavior": "Auto" From e087cb47a6a88c55b70d0dea5205e108487c7d7f Mon Sep 17 00:00:00 2001 From: prtsie Date: Thu, 12 Sep 2024 22:13:53 +0300 Subject: [PATCH 30/30] Authority adding --- .../Layout/NavMenu.razor | 10 ++++ .../Pages/AddAuthority.razor | 60 +++++++++++++++++++ .../Pages/Authorities.razor | 20 ++++++- ...or.cs => RegisterRequestModelValidator.cs} | 4 +- 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/AddAuthority.razor rename SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/{RegisterRequestValidator.cs => RegisterRequestModelValidator.cs} (63%) diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor index 13e3575..e908e97 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Layout/NavMenu.razor @@ -46,6 +46,16 @@ } + @if (UserDataProvider.CurrentRole is Constants.AdminRole) + { + + } @code { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/AddAuthority.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/AddAuthority.razor new file mode 100644 index 0000000..88a0972 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/AddAuthority.razor @@ -0,0 +1,60 @@ +@page "/authorities/add" +@using AutoMapper +@using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models +@using VisaApiClient +@using BlazorWebAssemblyVisaApiClient.Components +@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers +@using FluentValidation +@inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase + + + +
+
+

+ +
+

+ +
+ +

+
+ +@code +{ + private RegisterRequestModel requestModel = new(); + private Status status = new(); + + [Inject] private IValidator RegisterRequestModelValidator { get; set; } = null!; + [Inject] private IMapper Mapper { get; set; } = null!; + + private async Task Add() + { + var validationResult = await RegisterRequestModelValidator.ValidateAsync(requestModel); + if (!validationResult.IsValid) + { + status.SetError(validationResult.ToErrorsString()); + return; + } + + try + { + status.SetMessage("Wait..."); + await Client.RegisterAuthorityAsync(Mapper.Map(requestModel)); + status.SetSuccess("Success"); + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + } +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authorities.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authorities.razor index 776fca3..f238cd8 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authorities.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Authorities.razor @@ -18,6 +18,8 @@ + | + } @@ -25,13 +27,27 @@ @code { - private IEnumerable authorities = []; + private List authorities = []; protected override async Task OnInitializedAsync() { try { - authorities = await Client.GetAuthorityAccountsAsync(); + authorities = (await Client.GetAuthorityAccountsAsync()).ToList(); + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + } + + private async Task Delete(UserModel authority) + { + try + { + await Client.RemoveAuthorityAccountAsync(authority.Id); + authorities.Remove(authority); + StateHasChanged(); } catch (Exception e) { diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestValidator.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestModelValidator.cs similarity index 63% rename from SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestValidator.cs rename to SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestModelValidator.cs index 337adcf..5554e26 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestValidator.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Validation/Auth/RegisterRequestModelValidator.cs @@ -4,9 +4,9 @@ using VisaApiClient; namespace BlazorWebAssemblyVisaApiClient.Validation.Auth; -public class RegisterRequestValidator : AbstractValidator +public class RegisterRequestModelValidator : AbstractValidator { - public RegisterRequestValidator(IValidator authDataValidator) + public RegisterRequestModelValidator(IValidator authDataValidator) { RuleFor(r => r.AuthData) .NotEmpty()